NPOI讀取Excel日期型別
阿新 • • 發佈:2021-10-28
最近要幫客戶寫個小工具,來對多個Excel檔案進行資料彙總,其中主要涉及到對資料的讀取和分類,在讀取資料時就遇到了好幾個坑,這裡主要說下日期型別資料的讀取
NPOI內建的單元格值型別有Unknown
、Numeric
、String
、Formula
、Blank
、Boolean
、Error
,但是其中沒有日期型別,最開始我的取單元格值的方法如下:
switch (cell.CellType) { case CellType.String: return cell.StringCellValue; case CellType.Numeric: return cell.NumericCellValue; case CellType.Boolean: return cell.BooleanCellValue; case CellType.Error: return cell.ErrorCellValue; case CellType.Formula: BaseFormulaEvaluator evaluator; if (sheet is XSSFSheet) { evaluator = new XSSFFormulaEvaluator(sheet.Workbook); } else { evaluator = new HSSFFormulaEvaluator(sheet.Workbook); } var formulaValue = evaluator.Evaluate(cell); if (formulaValue.CellType == CellType.Numeric) { return formulaValue.NumberValue; } else if (formulaValue.CellType == CellType.String) { return formulaValue.StringValue; } return cell.ToString(); default: return cell.ToString(); }
測試時發現,日期型別的單元格在程式碼中獲取到的CellType
為Numeric
,最後獲取到的是一個數字,不是日期,翻了原始碼,找到了一個類DateUtil
,裡面提供了一個方法IsCellDateFormatted
可以判斷單元格的值是不是日期型別,還提供了一個方法GetJavaDate
可以把獲取到的數字轉化成日期格式,所以我對程式碼進行了修改
switch (cell.CellType) { case CellType.String: return cell.StringCellValue; case CellType.Numeric: if (DateUtil.IsCellDateFormatted(cell)) { return cell.DateCellValue; } return cell.NumericCellValue; case CellType.Boolean: return cell.BooleanCellValue; case CellType.Error: return cell.ErrorCellValue; case CellType.Formula: BaseFormulaEvaluator evaluator; if (sheet is XSSFSheet) { evaluator = new XSSFFormulaEvaluator(sheet.Workbook); } else { evaluator = new HSSFFormulaEvaluator(sheet.Workbook); } var formulaValue = evaluator.Evaluate(cell); if (formulaValue.CellType == CellType.Numeric) { return formulaValue.NumberValue; } else if (formulaValue.CellType == CellType.String) { return formulaValue.StringValue; } return cell.ToString(); default: return cell.ToString(); }