NPOI優點:部署機器不用安裝Excel或OLEDB,支持32及64位的操作系統,支持xls/xlsx
使用NuGet搜索安裝NPOI最新版,添加以下命名空間
using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel;
添加類 ExcelImporter
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] = Convert.ToString(row.GetCell(columnIndex)); } dt.Rows.Add(drNew); } } } return dt; } }
使用時傳入Excel文件路徑及表格名稱/序號即可,返回DataTable