nugetÌí¼Ónpoi
???/// <summary> ???/// npoi°ïÖúÀà ???/// </summary> ???public static class NpoiHelper ???{ ???????/// <summary> ???????/// ¸ù¾ÝÎļþ·¾¶£¬»ñÈ¡±í¸ñ¼¯ºÏ ???????/// </summary> ???????/// <param name="filePath"></param> ???????/// <returns></returns> ???????public static List<DataTable> GetDataTableList(string filePath) ???????{ ???????????var list = new ConcurrentBag<DataTable>(); ???????????using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) ???????????{ ???????????????var isExcel2007 = filePath.IsExcel2007(); ???????????????var workBook = stream.GetWorkbook(isExcel2007); ???????????????var sheetIndexList = new List<int>(); ???????????????for (int i = 0; i < workBook.NumberOfSheets; i++) sheetIndexList.Add(i); ???????????????Parallel.ForEach(sheetIndexList, new ParallelOptions ???????????????{ ???????????????????MaxDegreeOfParallelism = 3 ???????????????}, (source, state, index) => ???????????????{ ???????????????????try ???????????????????{ ???????????????????????if (!workBook.IsSheetHidden(source)) ???????????????????????????list.Add(GetDataTableToY(workBook, source)); ???????????????????} ???????????????????catch (NPOI.POIFS.FileSystem.OfficeXmlFileException nopiEx) ???????????????????{ ???????????????????????Console.WriteLine($"SheetIndex:{index}\t\tException:{nopiEx.Message}"); ???????????????????} ???????????????????catch (Exception e) ???????????????????{ ???????????????????????Console.WriteLine(e); ???????????????????} ???????????????}); ???????????} ???????????return list.ToList(); ???????} ???????/// <summary> ???????/// ¸ù¾ÝsheetË÷Òý£¬°ÑÊý¾Ýת»»Îªdatatable,ÒÔYÖáΪ׼ ???????/// </summary> ???????/// <param name="workBook"></param> ???????/// <param name="sheetIndex">sheetË÷Òý</param> ???????/// <param name="validRowIndex"></param> ???????/// <returns></returns> ???????public static DataTable GetDataTableToY(IWorkbook workBook, int sheetIndex, int validRowIndex = 0) ???????{ ???????????var sheet = workBook.GetSheetAt(sheetIndex); ???????????var table = new DataTable(sheet.SheetName); ???????????// ?ÉèÖÃ×î´óÁУ¬Ä¬ÈÏΪ1 ???????????var maxColumnNum = 1; ???????????// ?²»ÊÇÓÐЧÁм¯ºÏ£¬Á¬Ðø³¬¹ýÈýÐв»¶ÁÈ¡ºóÐøËùÓÐÁÐ ???????????var noValidColumnList = new List<int>(); ???????????// ?ÁУº°´ÕÕÁаÑÊý¾ÝÌî³äµ½datatableÖУ¬·ÀÖ¹ÎÞÏÞÁгöÏÖ ???????????for (var columnIndex = 0; columnIndex < maxColumnNum; columnIndex++) ???????????{ ???????????????var column = new DataColumn(); ???????????????table.Columns.Add(column); ???????????????noValidColumnList.Add(columnIndex); ???????????????// ?ÁÐÖÐËùÓÐÊý¾Ý¶¼ÊÇnullΪtrue ???????????????var isAllEmpty = true; ???????????????// ?ÐÐ ???????????????for (var rowIndex = 0; rowIndex < sheet.LastRowNum; rowIndex++) ???????????????{ ???????????????????if (columnIndex == 0) table.Rows.Add(table.NewRow()); ???????????????????var itemRow = sheet.GetRow(rowIndex); ???????????????????if (itemRow == null) continue; ???????????????????maxColumnNum = maxColumnNum < itemRow.LastCellNum ? itemRow.LastCellNum : maxColumnNum; ???????????????????// ?°Ñ¸ñʽת»»Îªutf-8 ???????????????????var itemCellValue = itemRow.GetValue(columnIndex).FormatUtf8String(); ???????????????????if (!itemCellValue.IsNullOrWhiteSpace()) isAllEmpty = false; ???????????????????table.Rows[rowIndex][columnIndex] = itemCellValue; ???????????????} ???????????????// ?µ±Ç°ÁÐÓÐÖµ ???????????????if (!isAllEmpty) ???????????????????noValidColumnList.Clear(); ???????????????// ?Á¬Ðø¿Õ°×Áг¬¹ýÈýÐÐ »ò Óпհ×ÐÐÇÒµ±Ç°ÐÐΪ×îºóÒ»ÐÐ ???????????????else if (noValidColumnList.Count > 3 || (noValidColumnList.Count > 0 && columnIndex == maxColumnNum - 1)) ???????????????{ ???????????????????for (var i = noValidColumnList.Count - 1; i >= 0; i--) ???????????????????????table.Columns.RemoveAt(noValidColumnList[i]); ???????????????????break; ???????????????} ???????????} ???????????// µÃµ½Ò»¸ösheetÖÐÓжàÉÙ¸öºÏ²¢µ¥Ôª¸ñ ???????????int sheetMergeCount = sheet.NumMergedRegions; ???????????for (var i = 0; i < sheetMergeCount; i++) ???????????{ ???????????????// »ñÈ¡ºÏ²¢ºóµÄµ¥Ôª¸ñ ???????????????var range = sheet.GetMergedRegion(i); ???????????????sheet.IsMergedRegion(range); ???????????????var cellValue = string.Empty; ???????????????for (var mRowIndex = range.FirstRow; mRowIndex <= range.LastRow; mRowIndex++) ???????????????{ ???????????????????for (var mColumnIndex = range.FirstColumn; mColumnIndex <= range.LastColumn; mColumnIndex++) ???????????????????{ ???????????????????????var itemCellValue = table.Rows[range.FirstRow][range.FirstColumn].FormatUtf8String(); ???????????????????????if (!itemCellValue.IsNullOrWhiteSpace()) ???????????????????????????cellValue = itemCellValue; ???????????????????????table.Rows[mRowIndex][mColumnIndex] = cellValue; ???????????????????} ???????????????} ???????????} ???????????return table; ???????} ???????#region ¹«¹²·½·¨ ???????/// <summary> ???????/// ÅжÏexcelÊÇ·ñÊÇ2007°æ±¾£º.xls ???????/// </summary> ???????/// <param name="filePath"></param> ???????/// <returns></returns> ???????public static bool IsExcel2007(this string filePath) ???????{ ???????????return Path.GetExtension(filePath)?.ToLower() == ".xls"; ???????} ???????/// <summary> ???????/// ¸ù¾Ý°æ±¾´´½¨IWorkbook¶ÔÏó ???????/// </summary> ???????/// <param name="stream"></param> ???????/// <param name="isExcel2007"></param> ???????/// <returns></returns> ???????public static IWorkbook GetWorkbook(this Stream stream, bool isExcel2007) ???????{ ???????????return isExcel2007 ? (IWorkbook)new HSSFWorkbook(stream) : new XSSFWorkbook(stream); ???????} ???????/// <summary> ???????/// »ñÈ¡XSSFRowµÄÖµ£¨È«²¿Í³Ò»×ª³É×Ö·û´®£© ???????/// </summary> ???????/// <param name="row"></param> ???????/// <param name="index"></param> ???????/// <returns></returns> ???????public static string GetValue(this IRow row, int index) ???????{ ???????????var rowCell = row.GetCell(index); ???????????return GetValueByCellStyle(rowCell, rowCell?.CellType); ???????} ???????/// <summary> ???????/// ¸ù¾Ýµ¥Ôª¸ñµÄÀàÐÍ»ñÈ¡µ¥Ôª¸ñµÄÖµ ???????/// </summary> ???????/// <param name="rowCell"></param> ???????/// <param name="type"></param> ???????/// <returns></returns> ???????public static string GetValueByCellStyle(ICell rowCell, CellType? type) ???????{ ???????????string value = string.Empty; ???????????switch (type) ???????????{ ???????????????case CellType.String: ???????????????????value = rowCell.StringCellValue; ???????????????????break; ???????????????case CellType.Numeric: ???????????????????if (DateUtil.IsCellInternalDateFormatted(rowCell)) ???????????????????{ ???????????????????????value = DateTime.FromOADate(rowCell.NumericCellValue).ToString(); ???????????????????} ???????????????????else if (DateUtil.IsCellDateFormatted(rowCell)) ???????????????????{ ???????????????????????value = DateTime.FromOADate(rowCell.NumericCellValue).ToString(); ???????????????????} ???????????????????//ÓÐЩÇé¿ö£¬Ê±¼ä´ê£¿Êý×Ö¸ñʽ»¯ÏÔʾΪʱ¼ä,²»ÊôÓÚÉÏÃæÁ½ÖÖʱ¼ä¸ñʽ ???????????????????else if (rowCell.CellStyle.GetDataFormatString() == null) ???????????????????{ ???????????????????????value = DateTime.FromOADate(rowCell.NumericCellValue).ToString(); ???????????????????} ???????????????????else if (rowCell.CellStyle.GetDataFormatString().Contains("$")) ???????????????????{ ???????????????????????value = "$" + rowCell.NumericCellValue.ToString(); ???????????????????} ???????????????????else if (rowCell.CellStyle.GetDataFormatString().Contains("£¤")) ???????????????????{ ???????????????????????value = "£¤" + rowCell.NumericCellValue.ToString(); ???????????????????} ???????????????????else if (rowCell.CellStyle.GetDataFormatString().Contains("£¤")) ???????????????????{ ???????????????????????value = "£¤" + rowCell.NumericCellValue.ToString(); ???????????????????} ???????????????????else if (rowCell.CellStyle.GetDataFormatString().Contains("€")) ???????????????????{ ???????????????????????value = "€" + rowCell.NumericCellValue.ToString(); ???????????????????} ???????????????????else ???????????????????{ ???????????????????????value = rowCell.NumericCellValue.ToString(); ???????????????????} ???????????????????break; ???????????????case CellType.Boolean: ???????????????????value = rowCell.BooleanCellValue.ToString(); ???????????????????break; ???????????????case CellType.Error: ???????????????????value = ErrorEval.GetText(rowCell.ErrorCellValue); ???????????????????break; ???????????????case CellType.Formula: ???????????????????// ?TODO: ÊÇ·ñ´æÔÚ Ç¶Ì× ¹«Ê½ÀàÐÍ ???????????????????value = GetValueByCellStyle(rowCell, rowCell?.CachedFormulaResultType); ???????????????????break; ???????????} ???????????return value; ???????} ???????#endregion ???}
ASPNET npoi°ïÖúÀà
ÔÎĵØÖ·£ºhttps://www.cnblogs.com/Cailf/p/9988470.html