如何在SlapKit.Excel中获取公式引用单元格的正确DateTime类型值?
解决SlapKit.Excel中公式引用DateTime单元格的类型转换异常
问题分析
在SlapKit.Excel里,当公式引用DateTime类型的单元格时,Excel本质是把DateTime以浮点数(OLE自动化日期格式)的形式存储和计算的。因此公式单元格的Value.Type会被识别为Number,而非DateTime。这时候直接调用GetDateTime()就会因为类型不匹配抛出InvalidCastException——你之前复制单元格格式的操作,只能改变Excel文件里单元格的显示样式,没法修正底层的数据类型标识。
解决方案
- 先强制计算工作簿里的所有公式,确保公式单元格的数值已经被正确计算出来
- 把公式单元格返回的浮点数转换成DateTime类型(利用Excel的OLE自动化日期规则)
修改后的代码
var workbook = new XLWorkbook(); var worksheet = workbook.AddWorksheet(); worksheet.Cell(1, 1).Value = DateTime.Now; worksheet.Cell(1, 2).FormulaR1C1 = "=R1C1"; // 关键步骤:强制计算工作簿中的公式 workbook.Calculate(); // 将公式返回的数值转换为DateTime var dateValue = DateTime.FromOADate(worksheet.Cell(1, 2).Value.GetDouble()); Console.WriteLine(dateValue);
类型安全优化
如果担心后续单元格类型变化导致异常,可以先判断类型再转换:
var cellValue = worksheet.Cell(1, 2).Value; if (cellValue.Type == XLDataType.Number) { var dateValue = DateTime.FromOADate(cellValue.GetDouble()); Console.WriteLine(dateValue); } else if (cellValue.Type == XLDataType.DateTime) { Console.WriteLine(cellValue.GetDateTime()); }
内容的提问来源于stack exchange,提问作者Alexander Dimitrov
相关产品推荐
相关产品推荐

