using NPOI.SS.UserModel; using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Text; namespace New_College.Common.Excel { public class ExcelUtil { /// /// 读取Excel多Sheet数据 /// /// 文件路径 /// Sheet名 /// public static DataSet ReadExcelToDataSet(string filePath, string sheetName = null) { if (!File.Exists(filePath)) { // LogUtil.Debug($"未找到文件{filePath}"); return null; } //获取文件信息 FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read); IWorkbook workbook = WorkbookFactory.Create(fs); //获取sheet信息 ISheet sheet = null; DataSet ds = new DataSet(); if (!string.IsNullOrEmpty(sheetName)) { sheet = workbook.GetSheet(sheetName); if (sheet == null) { // LogUtil.Debug($"{filePath}未找到sheet:{sheetName}"); return null; } DataTable dt = ReadExcelFunc(workbook, sheet); ds.Tables.Add(dt); } else { //遍历获取所有数据 int sheetCount = workbook.NumberOfSheets; for (int i = 0; i < sheetCount; i++) { sheet = workbook.GetSheetAt(i); if (sheet != null) { DataTable dt = ReadExcelFunc(workbook, sheet); ds.Tables.Add(dt); } } } fs.Close(); fs.Dispose(); return ds; } /// /// 读取Excel信息 /// /// 工作区 /// sheet /// private static DataTable ReadExcelFunc(IWorkbook workbook, ISheet sheet) { DataTable dt = new DataTable(); //获取列信息 IRow cells = sheet.GetRow(sheet.FirstRowNum); int cellsCount = cells.PhysicalNumberOfCells; int emptyCount = 0; int cellIndex = sheet.FirstRowNum; List listColumns = new List(); bool isFindColumn = false; while (!isFindColumn) { emptyCount = 0; listColumns.Clear(); for (int i = 0; i < cellsCount; i++) { if (string.IsNullOrEmpty(cells.GetCell(i).StringCellValue)) { emptyCount++; } listColumns.Add(cells.GetCell(i).StringCellValue); } //这里根据逻辑需要,空列超过多少判断 if (emptyCount == 0) { isFindColumn = true; } //cellIndex++; cells = sheet.GetRow(cellIndex); } foreach (string columnName in listColumns) { if (dt.Columns.Contains(columnName)) { //如果允许有重复列名,自己做处理 continue; } dt.Columns.Add(columnName, typeof(string)); } //开始获取数据 int rowsCount = sheet.PhysicalNumberOfRows; cellIndex += 1; DataRow dr = null; for (int i = cellIndex; i < rowsCount; i++) { cells = sheet.GetRow(i); dr = dt.NewRow(); for (int j = 0; j < dt.Columns.Count; j++) { var zz = cells.GetCell(j); if (zz == null) { dr[j] = ""; continue; } var cc = zz.CellType; //这里可以判断数据类型 switch (cc) { case CellType.String: dr[j] = cells.GetCell(j).StringCellValue; break; case CellType.Numeric: dr[j] = cells.GetCell(j).NumericCellValue.ToString(); break; case CellType.Unknown: dr[j] = cells.GetCell(j).StringCellValue; break; } } dt.Rows.Add(dr); } return dt; } } }