在.net 下一般使用NPOI操作Excel相信大家都不陌生,但是本人在操作過程中遇到一個比較奇怪的問題,特寫此博客記錄與大家分享。 例子是使用Winform,點擊按鈕時彈出打開文件對話框,然後選擇文件來讀取Excel。 最開始代碼時這樣寫的: 1 private void button1_Clic ...
在.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[i] 或者是 row.GetCell(i) , 於是嘗試在監視里輸入row.GetCell(4),看是否會報錯:
發現沒有報錯,而且“值“一欄是正確的列的內容。
於是將代碼里row.Cells[i] 改成 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
再次調試,沒有報錯,在輸出視窗有以下的信息: