使用NPOI,如何返回Excel格式化的单元格值



使用NPOI,是否有任何内置的可能性来格式化Excel格式化的单元格值(尤其是数值和日期值)?

如果没有,实施它的最佳方式是什么?我想到了一个从Excel格式字符串到C#格式字符串的格式字符串转换器?

以下示例假定Excel格式字符串和C#格式字符串相同。因此,它适用于一些基本的格式字符串,如:"#,##0.00"

using NPOI.SS.UserModel;
ICell cell = workbook.GetSheet("table1").GetRow(0).GetCell(0);
string value = null;
if(cell.CellType == CellType.String) {
    value = cell.StringCellValue;
} else if(cell.CellType == CellType.Numeric) {
    string formatString = cell.CellStyle.GetDataFormatString();
    if(DateUtil.IsCellDateFormatted(cell)) {
        value = cell.DateCellValue.ToString(formatString);
    } else {
        value = cell.NumericCellValue.ToString(formatString);
    }
} else [...]

找到了内置的NPOI的可能性。然而,一些格式(如"Sunday,September 182983")的评估结果与的"EEEE,Septement 182983"类似。

using NPOI.SS.UserModel;
DataFormatter dataFormatter = new DataFormatter(CultureInfo.CurrentCulture);
ICell cell = workbook.GetSheet("table1").GetRow(0).GetCell(0);
string value = dataFormatter.FormatCellValue(cell);
private static CellValue EvaluateFormulaCellValue(XSSFWorkbook wb, ICell cell)
        {
             WorkbookEvaluator _bookEvaluator = null;
            _bookEvaluator = new WorkbookEvaluator(XSSFEvaluationWorkbook.Create(wb), null, null);
            // XSSFFormulaEvaluator.EvaluateAllFormulaCells(wb);
            ValueEval eval = _bookEvaluator.Evaluate(new XSSFEvaluationCell((XSSFCell)cell));
            if (eval is NumberEval)
            {
                NumberEval ne = (NumberEval)eval;
                return new NPOI.SS.UserModel.CellValue(ne.NumberValue);
            }
            if (eval is BoolEval)
            {
                BoolEval be = (BoolEval)eval;
                return NPOI.SS.UserModel.CellValue.ValueOf(be.BooleanValue);
            }
            if (eval is StringEval)
            {
                StringEval ne = (StringEval)eval;
                return new NPOI.SS.UserModel.CellValue(ne.StringValue);
            }
            if (eval is ErrorEval)
            {
                return NPOI.SS.UserModel.CellValue.GetError(((ErrorEval)eval).ErrorCode);
            }
            throw new InvalidOperationException("Unexpected eval class (" + eval.GetType().Name + ")");
        }

最新更新