ibcadmin 发表于 2019-9-17 11:33:03

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

<p>在.net 下一样平常利用NPOI利用Excel相信各人都不生疏,但是本人在利用过程中碰到一个比力奇怪的问题,特写此博客记载与各人分享。</p>
<p>例子是利用Winform,点击按钮时弹出打开文件对话框,然后选择文件来读取Excel。</p>
<p>最开始代码时如许写的:</p>
<div align="center"></div><div align="center"></div>

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                     //统共有多少行
12                     int lastRowNum = sheet.LastRowNum;
13                     int firstRowNum = sheet.FirstRowNum;
14
15                     for (int i = firstRowNum + 1; i <= lastRowNum; i++)
16                     {
17                         IRow row = sheet.GetRow(i);
18                         if (row == null)
19                         {
20                           continue;
21                         }
22                         string name = row.Cells?.ToString();
23
24                         if (string.IsNullOrEmpty(name))
25                         {
26                           //空行
27                           continue;
28                         }
29
30                         string birthplace = row.Cells?.ToString();
31                         string major = row.Cells?.ToString();
32                         string className = row.Cells?.ToString();
33                         double height = row.Cells.NumericCellValue;
34                         double age = row.Cells.NumericCellValue;
35
36                         Console.WriteLine($"name:{name},birthplace:{birthplace},major:{major},className:{className},height:{height},age:{age}");
37
38                     }
39               }
40             }
41         }

View Code
<p>然后Excel是如许的:</p>
<p><div align="center"></div></p>
<p> </p>
<p> 调试时,碰到错误:</p>
<p><div align="center"></div></p>
<p> </p>
<p> 监视变量i,看是循环到第几行:</p>
<p><div align="center"></div></p>
<p> </p>
<p> 这里是3,也就是第三行(标题除外),第三行的内容是如许的:</p>
<p><div align="center"></div></p>
<p> </p>
<p> 这里表明一下,这个表格利用了白色背景添补,然后前面三行(包罗标题在内)利用了实线的细边框。</p>
<p>再在监视里输入代码row.Cells.Count,获取得到的结果是4,也就是第三行只有4“列”(这里列加了双引号)。明明就有6列,怎么会只有4列,于是再在监视里输入row.LastCellNum,得到的结果是6。</p>
<p><div align="center"></div></p>
<p> </p>
<p> 这里可以看出有6列,我们知道获取列有row.Cells 大概是 row.GetCell(i) , 于是实验在监视里输入row.GetCell(4),看是否会报错:</p>
<p><div align="center"></div></p>
<p> </p>
<p> </p>
<p>发现没有报错,而且“值“一栏是准确的列的内容。</p>
<p>于是将代码里row.Cells 改成 row.GetCell(i) 的形式:</p>
<div align="center"></div><div align="center"></div>

private void button1_Click(object sender, EventArgs e)
      {
            OpenFileDialog ofd = new OpenFileDialog {Filter = "excel文件|*.xls"};
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                using (FileStream fs = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read))
                {
                  IWorkbook workbook = new HSSFWorkbook(fs);
                  ISheet sheet = workbook.GetSheetAt(0);

                  //统共有多少行
                  int lastRowNum = sheet.LastRowNum;
                  int firstRowNum = sheet.FirstRowNum;

                  for (int i = firstRowNum + 1; i <= lastRowNum; i++)
                  {
                        IRow row = sheet.GetRow(i);
                        if (row == null)
                        {
                            continue;
                        }
                        string name = row.GetCell(0)?.ToString();

                        if (string.IsNullOrEmpty(name))
                        {
                            //空行
                            continue;
                        }

                        string birthplace = row.GetCell(1)?.ToString();
                        string major = row.GetCell(2)?.ToString();
                        string className = row.GetCell(3)?.ToString();
                        double height = row.GetCell(4).NumericCellValue;
                        double age = row.GetCell(5).NumericCellValue;

                        Console.WriteLine($"name:{name},birthplace:{birthplace},major:{major},className:{className},height:{height},age:{age}");

                  }
                }
            }
      }

View Code
<p>再次调试,没有报错,在输出窗口有以下的信息:</p>
<p><div align="center"></div></p>
<p> </p>
<p> </p>
<p> </p><br><br/><br/><br/><br/><br/>来源:<a href="https://www.cnblogs.com/godbell/archive/2019/09/15/11524896.html" target="_blank">https://www.cnblogs.com/godbell/archive/2019/09/15/11524896.html</a>
页: [1]
查看完整版本: 记录一次使用NPOI遇到的问题