我有一个Excel文件,我使用DevExpress编辑,我正在使用NPOI阅读。当我尝试将日期单元格的值作为字符串时,它不会保留原始值。
例如:
在DevExpress网格中,我设置了这个值:2016-08-12
。我想在我的字符串中获得相同的值,但我得到42689
。
获取单元格值的代码如下:
ICell cell = row.GetCell(i);
cell.SetCellType(CellType.String);
string fieldString = cell.StringCellValue;
result = result + ";" + FieldValue;
如何获取原始格式的日期值?
答案 0 :(得分:12)
在Excel中,日期存储为数字。如果你想获得一个格式化的日期,你需要检查单元格是否包含一个日期(有一个实用方法),然后获取单元格的日期值,获取数据格式,最后将日期转换为使用格式的字符串。您不应强制CellType
字符串,否则您将无法再告诉该单元格最初保留日期。我建议使用这样的扩展方法来获取基于其类型的格式化单元格值:
using NPOI.SS.UserModel;
public static class NpoiExtensions
{
public static string GetFormattedCellValue(this ICell cell, IFormulaEvaluator eval = null)
{
if (cell != null)
{
switch (cell.CellType)
{
case CellType.String:
return cell.StringCellValue;
case CellType.Numeric:
if (DateUtil.IsCellDateFormatted(cell))
{
DateTime date = cell.DateCellValue;
ICellStyle style = cell.CellStyle;
// Excel uses lowercase m for month whereas .Net uses uppercase
string format = style.GetDataFormatString().Replace('m', 'M');
return date.ToString(format);
}
else
{
return cell.NumericCellValue.ToString();
}
case CellType.Boolean:
return cell.BooleanCellValue ? "TRUE" : "FALSE";
case CellType.Formula:
if (eval != null)
return GetFormattedCellValue(eval.EvaluateInCell(cell));
else
return cell.CellFormula;
case CellType.Error:
return FormulaError.ForInt(cell.ErrorCellValue).String;
}
}
// null or blank cell, or unknown cell type
return string.Empty;
}
}
然后,像这样使用它:
ICell cell = row.GetCell(i);
string fieldString = cell.GetFormattedCellValue();
result = result + ";" + FieldValue;
可选:如果单元格中有任何公式,并且您希望评估这些公式,则根据工作簿类型创建IFormulaEvaluator
并将评估程序传递给GetFormattedCellValue()
方法。例如:
IFormulaEvaluator eval;
if (workbook is XSSFWorkbook)
eval = new XSSFFormulaEvaluator(workbook);
else
eval = new HSSFFormulaEvaluator(workbook);
...
ICell cell = row.GetCell(i);
string fieldString = cell.GetFormattedCellValue(eval);
result = result + ";" + FieldValue;
答案 1 :(得分:0)
如果文件具有自定义格式的日期,则需要测试这些日期,否则该函数将返回数字。此版本的Brian Rogers的答案将检查:
public static string GetFormattedCellValue(this ICell cell, IFormulaEvaluator eval = null)
{
// https://github.com/tonyqus/npoi/blob/master/main/SS/UserModel/BuiltinFormats.cs
//*The first user-defined format starts at 164.
// var dataformatNumber = cell.CellStyle.DataFormat;
//var formatstring = cell.CellStyle.GetDataFormatString();
//e.g. m/d/yyyy\ h:mm:ss\ \ AM/PM\ #164
//e.g m/d/yyyy\ hh:mm #165
if (cell != null)
{
switch (cell.CellType)
{
case CellType.String:
return cell.StringCellValue;
case CellType.Numeric:
if (DateUtil.IsCellDateFormatted(cell))
{
DateTime date = cell.DateCellValue;
ICellStyle style = cell.CellStyle;
// Excel uses lowercase m for month whereas .Net uses uppercase
string format = style.GetDataFormatString().Replace('m', 'M');
return date.ToString(format);
}
else if(cell.CellStyle.DataFormat>=164 && DateUtil.IsValidExcelDate(cell.NumericCellValue) && cell.DateCellValue != null)
{
return cell.DateCellValue.ToString();
}
else
{
return cell.NumericCellValue.ToString();
}
case CellType.Boolean:
return cell.BooleanCellValue ? "TRUE" : "FALSE";
case CellType.Formula:
if (eval != null)
return GetFormattedCellValue(eval.EvaluateInCell(cell));
else
return cell.CellFormula;
case CellType.Error:
return FormulaError.ForInt(cell.ErrorCellValue).String;
}
}
// null or blank cell, or unknown cell type
return string.Empty;
}