1. 程式人生 > 其它 >NPOI讀取Excel日期型別

NPOI讀取Excel日期型別

最近要幫客戶寫個小工具,來對多個Excel檔案進行資料彙總,其中主要涉及到對資料的讀取和分類,在讀取資料時就遇到了好幾個坑,這裡主要說下日期型別資料的讀取

NPOI內建的單元格值型別有UnknownNumericStringFormulaBlankBooleanError,但是其中沒有日期型別,最開始我的取單元格值的方法如下:

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();
}

測試時發現,日期型別的單元格在程式碼中獲取到的CellTypeNumeric,最後獲取到的是一個數字,不是日期,翻了原始碼,找到了一個類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();
}