Используя NPOI, как вернуть значение ячейки, отформатированное в Excel?
Используя NPOI , Существует ли возможность форматирования значения ячейки (особенно числовых и датированных значений), как это было отформатировано Excel?
Если нет, то как лучше всего это осуществить? Я подумал о преобразователе formatstring из Excel-formatstrings в C#-formatstrings?
В следующем примере предполагается, что Excel-formatstring и C# - formatstring являются одинаковыми. Так что это работает для некоторых основных стрингов формата, таких как: "#,##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 [...]
2 ответов:
Нашел NPOI, встроенный в возможность. Однако некоторые форматы, такие как "воскресенье, 18 сентября 1983 года" оцениваются как "EEEE, Сентябрь 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);
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 + ")"); }
Comments