在.net 下一样平常利用NPOI利用Excel相信各人都不生疏,但是本人在利用过程中碰到一个比力奇怪的问题,特写此博客记载与各人分享。
例子是利用Winform,点击按钮时弹出打开文件对话框,然后选择文件来读取Excel。
最开始代码时如许写的:
- 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[0]?.ToString();
- 23
- 24 if (string.IsNullOrEmpty(name))
- 25 {
- 26 //空行
- 27 continue;
- 28 }
- 29
- 30 string birthplace = row.Cells[1]?.ToString();
- 31 string major = row.Cells[2]?.ToString();
- 32 string className = row.Cells[3]?.ToString();
- 33 double height = row.Cells[4].NumericCellValue;
- 34 double age = row.Cells[5].NumericCellValue;
- 35
- 36 Console.WriteLine($"name:{name},birthplace:{birthplace},major:{major},className:{className},height:{height},age:{age}");
- 37
- 38 }
- 39 }
- 40 }
- 41 }
复制代码
View Code
然后Excel是如许的:
调试时,碰到错误:
监视变量i,看是循环到第几行:
这里是3,也就是第三行(标题除外),第三行的内容是如许的:
这里表明一下,这个表格利用了白色背景添补,然后前面三行(包罗标题在内)利用了实线的细边框。
再在监视里输入代码row.Cells.Count,获取得到的结果是4,也就是第三行只有4“列”(这里列加了双引号)。明明就有6列,怎么会只有4列,于是再在监视里输入row.LastCellNum,得到的结果是6。
这里可以看出有6列,我们知道获取列有row.Cells 大概是 row.GetCell(i) , 于是实验在监视里输入row.GetCell(4),看是否会报错:
发现没有报错,而且“值“一栏是准确的列的内容。
于是将代码里row.Cells 改成 row.GetCell(i) 的形式:
- 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
再次调试,没有报错,在输出窗口有以下的信息:
来源:https://www.cnblogs.com/godbell/archive/2019/09/15/11524896.html |