马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

记录一次使用NPOI遇到的问题

[复制链接]
查看2905 | 回复0 | 2019-9-17 11:33:03 | 显示全部楼层 |阅读模式

在.net 下一样平常利用NPOI利用Excel相信各人都不生疏,但是本人在利用过程中碰到一个比力奇怪的问题,特写此博客记载与各人分享。

例子是利用Winform,点击按钮时弹出打开文件对话框,然后选择文件来读取Excel。

最开始代码时如许写的:

113356xfhjf1ch3c18jizh.gif
113356m36p9qru3rgxpcpp.gif
  1. 1 private void button1_Click(object sender, EventArgs e)
  2. 2 {
  3. 3 OpenFileDialog ofd = new OpenFileDialog {Filter = "excel文件|*.xls"};
  4. 4 if (ofd.ShowDialog() == DialogResult.OK)
  5. 5 {
  6. 6 using (FileStream fs = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read))
  7. 7 {
  8. 8 IWorkbook workbook = new HSSFWorkbook(fs);
  9. 9 ISheet sheet = workbook.GetSheetAt(0);
  10. 10
  11. 11 //统共有多少行
  12. 12 int lastRowNum = sheet.LastRowNum;
  13. 13 int firstRowNum = sheet.FirstRowNum;
  14. 14
  15. 15 for (int i = firstRowNum + 1; i <= lastRowNum; i++)
  16. 16 {
  17. 17 IRow row = sheet.GetRow(i);
  18. 18 if (row == null)
  19. 19 {
  20. 20 continue;
  21. 21 }
  22. 22 string name = row.Cells[0]?.ToString();
  23. 23
  24. 24 if (string.IsNullOrEmpty(name))
  25. 25 {
  26. 26 //空行
  27. 27 continue;
  28. 28 }
  29. 29
  30. 30 string birthplace = row.Cells[1]?.ToString();
  31. 31 string major = row.Cells[2]?.ToString();
  32. 32 string className = row.Cells[3]?.ToString();
  33. 33 double height = row.Cells[4].NumericCellValue;
  34. 34 double age = row.Cells[5].NumericCellValue;
  35. 35
  36. 36 Console.WriteLine($"name:{name},birthplace:{birthplace},major:{major},className:{className},height:{height},age:{age}");
  37. 37
  38. 38 }
  39. 39 }
  40. 40 }
  41. 41 }
复制代码
View Code

然后Excel是如许的:

113356yx0hsjn0fqqb3h9h.png

调试时,碰到错误:

113357r9x0xxi22f9is1i2.png

监视变量i,看是循环到第几行:

113358vc4gzwpnc5ngwfci.png

这里是3,也就是第三行(标题除外),第三行的内容是如许的:

113358muvgadv2akq2igf4.png

这里表明一下,这个表格利用了白色背景添补,然后前面三行(包罗标题在内)利用了实线的细边框。

再在监视里输入代码row.Cells.Count,获取得到的结果是4,也就是第三行只有4“列”(这里列加了双引号)。明明就有6列,怎么会只有4列,于是再在监视里输入row.LastCellNum,得到的结果是6。

113358aeueyfj8p888k6u8.png

这里可以看出有6列,我们知道获取列有row.Cells 大概是 row.GetCell(i) , 于是实验在监视里输入row.GetCell(4),看是否会报错:

113359ykrth6b86lnqwhr6.png

发现没有报错,而且“值“一栏是准确的列的内容。

于是将代码里row.Cells 改成 row.GetCell(i) 的形式:

113359byect5g25nghc1we.gif
113359aoxvw1ovzppp1v7f.gif
  1. private void button1_Click(object sender, EventArgs e)
  2. {
  3. OpenFileDialog ofd = new OpenFileDialog {Filter = "excel文件|*.xls"};
  4. if (ofd.ShowDialog() == DialogResult.OK)
  5. {
  6. using (FileStream fs = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read))
  7. {
  8. IWorkbook workbook = new HSSFWorkbook(fs);
  9. ISheet sheet = workbook.GetSheetAt(0);
  10. //统共有多少行
  11. int lastRowNum = sheet.LastRowNum;
  12. int firstRowNum = sheet.FirstRowNum;
  13. for (int i = firstRowNum + 1; i <= lastRowNum; i++)
  14. {
  15. IRow row = sheet.GetRow(i);
  16. if (row == null)
  17. {
  18. continue;
  19. }
  20. string name = row.GetCell(0)?.ToString();
  21. if (string.IsNullOrEmpty(name))
  22. {
  23. //空行
  24. continue;
  25. }
  26. string birthplace = row.GetCell(1)?.ToString();
  27. string major = row.GetCell(2)?.ToString();
  28. string className = row.GetCell(3)?.ToString();
  29. double height = row.GetCell(4).NumericCellValue;
  30. double age = row.GetCell(5).NumericCellValue;
  31. Console.WriteLine($"name:{name},birthplace:{birthplace},major:{major},className:{className},height:{height},age:{age}");
  32. }
  33. }
  34. }
  35. }
复制代码
View Code

再次调试,没有报错,在输出窗口有以下的信息:

113359izfcccpcmwhl913c.png







来源:https://www.cnblogs.com/godbell/archive/2019/09/15/11524896.html
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则