我写这篇文章主要目的就是复习一下这个代码,加深我自己的理解,写的不对的地方,请各位不吝赐教,接下来让我们进入主题。
首先我们要添加这个NPOI这个包,并且引用
-
创建一个字符串变量 filename,用于存储 Excel 文件的路径。
-
创建一个空的 IWorkbook 对象 workbook,用于代表 Excel 工作簿。
-
创建一个空的 ISheet 对象 sheet,用于代表 Excel 的工作表。
-
创建一个 DataTable 对象 dt,用于存储 Excel 表格数据。
-
设置 filename 的值,将其指向 Excel 文件的路径。
-
创建一个 FileStream 对象 fs,用于读取 Excel 文件。这里使用 FileMode.Open 表示以只读方式打开文件,FileAccess.Read 表示允许读取文件。
-
判断 filename 是否包含 ".xlsx",如果是,就创建一个 XSSFWorkbook 对象 workbook,用于代表 Excel 工作簿。XSSFWorkbook 对象用于处理 Excel 2007 或更高版本的 .xlsx 格式文件。
-
如果 filename 不包含 ".xlsx",则判断 filename 是否包含 ".xls",如果是,就创建一个 HSSFWorkbook 对象 workbook,用于代表 Excel 工作簿。HSSFWorkbook 对象用于处理 Excel 97-2003 版本的 .xls 格式文件。
-
判断传入的 sheetName 是否为 null。如果是 null,则使用
workbook.GetSheetAt(0)
获取第一个工作表。 -
如果 sheetName 不为 null,则使用
workbook.GetSheet(sheetName)
方法获取指定名称的工作表对象。如果找不到该名称对应的工作表,会返回 null。 -
如果获取到的工作表对象 sheet 仍为 null,则说明找不到指定名称的工作表。这时,我们尝试获取第一个工作表对象,即
workbook.GetSheetAt(0)
。
-
判断传入的 sheet 参数是否为 null。如果 sheet 为 null,则说明没有成功读取 Excel 文件或者工作表名称不存在。这时,直接返回一个空的 DataTable 对象。
-
使用
sheet.GetRow(0)
方法获取工作表的第一行数据,即列名。然后,使用fistRow.LastCellNum
获取该行最后一个单元格的索引。 -
判断 IsFirstRowColum 参数的值。如果为 true,则说明第一行是列名,需要将其作为 DataTable 的列添加进去。否则,从第二行开始读取数据。
-
循环遍历工作表中的每一行数据。使用
sheet.LastRowNum
获取工作表最后一行的行号。 -
对于每一行,使用
sheet.GetRow(i)
方法获取行对象。如果该行为空,则跳过当前循环,读取下一行的数据。 -
创建一个空的 DataRow 对象,用于存储当前行的数据。
-
循环遍历每一列单元格。使用
rows.FirstCellNum
获取当前行第一个单元格的索引。如果该单元格不为空,则将其值转换成字符串,并将其存储到对应的 DataColumn 中。 -
使用
dt.NewRow()
创建一个新的 DataRow,然后将该 DataRow 中的每一列数据填充完整。使用dataRow[j] = rows.GetCell(j).ToString();
将单元格的值赋值给该 DataRow。 -
将填充好的 DataRow 添加到 DataTable 中,然后循环下一行数据。
-
返回填充好数据的 DataTable 对象。
大体就是这个就是这些,接下来是我整体的代码
public static DataTable ExcelByDataTable(string Namepath, string sheetName = null, bool IsFirstRowColum = true)
{
try
{
// 储存路径
string filename;
IWorkbook workbook=null;
// 工作表
ISheet sheet = null;
DataTable dt = new();
// 表格路径
filename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory) + "Config" + Namepath + ".xlsx";
FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
if (filename.IndexOf(".xlsx") > 0)
{
workbook = new XSSFWorkbook(fs);
}
else if (filename.IndexOf(".xls") > 0)
{
workbook = new HSSFWorkbook(fs);
}
if (sheetName != null) // 是否指定Excel表格
{
sheet = workbook.GetSheet(sheetName);
// 如果找不到指定的sheetName对应的sheet,就尝试获取第一个sheet
if (sheet == null)
{
sheet = workbook.GetSheetAt(0);
}
}
else
{
sheet = workbook.GetSheetAt(0);
}
if (sheet != null)
{
IRow fistRow = sheet.GetRow(0);
int cellCount = fistRow.LastCellNum; // 第一行最后一个cell
int StartRow;
if (IsFirstRowColum)
{
for (int i = fistRow.FirstCellNum; i < cellCount; i++)
{
ICell cell = fistRow.GetCell(i);
// 列不为空
if (cell != null)
{
string cellValue = cell.StringCellValue;
if (cellValue != null)
{
DataColumn column = new DataColumn(cellValue);
dt.Columns.Add(column);
}
}
}
StartRow = sheet.FirstRowNum + 1;
}
else
{
StartRow = sheet.FirstRowNum;
}
int rowcount = sheet.LastRowNum; // 最后一列的行号
for (int i = StartRow; i <= rowcount; i++)
{
IRow rows = sheet.GetRow(i);
if (rows == null)
{
continue; // 没有数据的行默认是null
}
DataRow dataRow = dt.NewRow();
for (int j = rows.FirstCellNum; j < cellCount; j++)
{
if (rows.GetCell(j) != null)
{
dataRow[j] = rows.GetCell(j).ToString();
}
}
dt.Rows.Add(dataRow);
}
}
return dt;
}
catch (Exception err)
{
return null;
}
}