NPOI根據Excel資料匯入匯出到Datatable中--幫助類
public static class ExcelImporter
{
/// <summary>
/// 根據sheet序號獲取資料
/// </summary>
/// <param name="fileName"></param>
/// <param name="sheetIndex"></param>
/// <returns></returns>
public static DataTable ImportByIndex(string fileName, int sheetIndex = 0)
{
using (FileStream fs = File.OpenRead(fileName))
{
IWorkbook book = null;
if (fileName.ToLower().EndsWith("xls"))
book = new HSSFWorkbook(fs);
if (fileName.ToLower().EndsWith("xlsx"))
book = new XSSFWorkbook(fs);
var sheet = book.GetSheetAt(sheetIndex);
if (sheet == null)
throw new Exception(@"Can't find sheet at index of {sheetIndex}");
return sheet.ToTable();
}
}
/// <summary>
/// 根據sheet名稱獲取資料
/// </summary>
/// <param name="fileName"></param>
/// <param name="sheetName"></param>
/// <returns></returns>
public static DataTable ImportBySheetName(string fileName, string sheetName)
{
using (FileStream fs = File.OpenRead(fileName))
{
IWorkbook book = null;
if (fileName.ToLower().EndsWith("xls"))
book = new HSSFWorkbook(fs);
if (fileName.ToLower().EndsWith("xlsx"))
book = new XSSFWorkbook(fs);
var sheet = book.GetSheet(sheetName);
if (sheet == null)
throw new Exception(@"Can't find sheet name of {sheetName}");
return sheet.ToTable();
}
}
/// <summary>
/// 將sheet轉化為DataTable
/// </summary>
/// <param name="sheet"></param>
/// <returns></returns>
private static DataTable ToTable(this ISheet sheet)
{
DataTable dt = new DataTable();
var firstRow = sheet.GetRow(0);
if (firstRow != null)
{
for (int columnIndex = 0; columnIndex < firstRow.LastCellNum; columnIndex++)
{
var cell = firstRow.GetCell(columnIndex);
dt.Columns.Add(cell.StringCellValue.Trim(), typeof(string));
}
for (int rowIndex = 1; rowIndex < sheet.PhysicalNumberOfRows; rowIndex++)
{
var row = sheet.GetRow(rowIndex);
if (row != null)
{
DataRow drNew = dt.NewRow();
for (int columnIndex = 0; columnIndex < firstRow.LastCellNum; columnIndex++)
{
drNew[columnIndex] = GetValueType(row.GetCell(columnIndex));
}
dt.Rows.Add(drNew);
}
}
}
return dt;
}
/// <summary>
/// 獲取單元格型別
/// </summary>
/// <param name="cell"></param>
/// <returns></returns>
private static object GetValueType(ICell cell)
{
if (cell == null)
return null;
switch (cell.CellType)
{
case CellType.Blank: //BLANK:
return null;
case CellType.Boolean: //BOOLEAN:
return cell.BooleanCellValue;
case CellType.Numeric: //NUMERIC:
short format = cell.CellStyle.DataFormat;
if (format != 0) { return Convert.ToDateTime(cell.DateCellValue).ToString("yyyy-MM-dd HH:mm:ss"); } else { return cell.NumericCellValue; }
case CellType.String: //STRING:
return cell.StringCellValue;
case CellType.Error: //ERROR:
return cell.ErrorCellValue;
case CellType.Formula: //FORMULA:
default:
return "=" + cell.CellFormula;
}
}
}