将Excel中的数据读取到DataTable中

读取Excel的功能应该算是比较常见的,无论是订单、商品还是用户信息等都有可能需要进行Excel导入。

为了方便之后的开发,特意将之前写的代码进行记录。

首先需要引用NPOI的NuGet包,注意:有分Core版本(DotNetCore.NPOI)和非Core版本(NPOI),注意区分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
public DataTable ReadExcelToDataTable(string fileName, bool isFirstRowColumn = true)
{
//定义要返回的dataTable对象
var data = new DataTable();
try
{
if (!System.IO.File.Exists(fileName))
{
return null;
}
//根据指定路径读取文件
var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
//根据文件流创建excel数据结构
var workbook = WorkbookFactory.Create(fs);
var sheet = workbook.GetSheetAt(0);
if (sheet == null) return data;
var firstRow = sheet.GetRow(0);
//一行最后一个cell的编号 即总的列数
int cellCount = firstRow.LastCellNum;
//如果第一行是标题列名
int startRow;
if (isFirstRowColumn)
{
for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
{
var cell = firstRow.GetCell(i);
var cellValue = cell?.StringCellValue;
if (cellValue == null) continue;
var column = new DataColumn(cellValue);
data.Columns.Add(column);
}
startRow = sheet.FirstRowNum + 1;//需要跳过的标题行
}
else
startRow = sheet.FirstRowNum;

//最后一列的标号
var rowCount = sheet.LastRowNum;
for (int i = startRow; i <= rowCount; ++i)
{
var row = sheet.GetRow(i);
if (row == null) continue; //没有数据的行默认是null
var dataRow = data.NewRow();
for (int j = row.FirstCellNum; j < cellCount; ++j)
{
if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是null
dataRow[j] = row.GetCell(j).ToString();
}
data.Rows.Add(dataRow);
}
return data;
}
catch (Exception ex)
{
throw ex;
}
}