可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
Using NPOI, is there any buildin possibility to format a cell value (especially numeric and date values) as it has been formatted by Excel?
If not what would be the best way to implement it? I thought of a formatstring converter from Excel-formatstrings to C#-formatstrings?
The following example assumes the Excel-formatstring and the C#-formatstring are the same. So it works for some basic formatstrings like: "#,##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 [...]
回答1:
Found the NPOI built in possibility. However some formats like "Sunday, September 18, 1983" are evaluated like "EEEE, September 18, 1983".
using NPOI.SS.UserModel; DataFormatter dataFormatter = new DataFormatter(CultureInfo.CurrentCulture); ICell cell = workbook.GetSheet("table1").GetRow(0).GetCell(0); string value = dataFormatter.FormatCellValue(cell);
回答2:
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 + ")"); }