Npoi读取导入的Excel文件,并转换成DataTable.
如果,导入的Excel中列名是固定的,个人建议按照下标获取,速度比较快:string str= row.GetCell(0).ToString();
/// <summary>读取excel
/// 默认第一行为标头
/// </summary>
/// <param name="strFileName">excel文档路径</param>
/// <returns></returns>
public static DataTable ImportExcel(string strFileName, string worksheetName)
{
DataTable dt = new DataTable();
IWorkbook workbook;
using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
{
if (Path.GetExtension(strFileName).ToLower().Equals(".xlsx"))
{
workbook = new XSSFWorkbook(file);
}
else
{
workbook = new HSSFWorkbook(file);
}
}
//按照工作页的名称获取指定工作表数据
ISheet sheet=workbook.GetSheet(worksheetName);
//也可以按照工作页下标顺序获取,如:ISheet sheet=workbook.GetSheet(0);
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
IRow headerRow = sheet.GetRow(0);//0行是获取的列名
int cellCount = headerRow.LastCellNum;
try
{
for (int j = 0; j < cellCount; j++)
{//循环获取列名
ICell cell = headerRow.GetCell(j);
if (string.IsNullOrEmpty(cell.ToString()))
{
continue;
}
dt.Columns.Add(cell.ToString());
}
for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
{//循环获取表格数据
IRow row = sheet.GetRow(i);
DataRow dataRow = dt.NewRow();
bool isallnull = true;
if (row != null)
{
//数据可以动态循环获取,如果导入的Excel中表格中的列是固定的,可以按照下标获取,速度比较快:
//string str= row.GetCell(0).ToString();
//str=row.GetCell(1).ToString(); ........
for (int j = row.FirstCellNum; j < cellCount; j++)
{
if (row.GetCell(j) != null && !string.IsNullOrEmpty(row.GetCell(j).ToString()))
{
dataRow[j] = row.GetCell(j).ToString();
isallnull = false;
}
}
if (!isallnull)
dt.Rows.Add(dataRow);
}
}
return dt;
}
catch (Exception er)
{
Golobal.Log.Error("读取导入的Excel文件失败:"+er);
dt = null;
return dt;
}
}