C# 9.0/.NET7下ExcelDataReader读取.xlsx日期值异常问题
问题:Excel日期数值解析异常(同一数值43708解析为不同日期)
环境
- C# 9.0
- .NET 7
- ExcelDataReader库(IExcelDataReader接口)
问题现象
通过HttpClient获取的.xlsx文件,使用ExcelDataReader读取时,所有应始于2021年的日期列均被解析为31/08/2019,其余数据读取正常。将该文件用Excel重新保存后(字节数从2079变为5569),读取结果恢复正常,此现象在3台机器上一致。
原文件末尾包含Implementation by Anton Scheffer字样,将.xlsx视为Zip文件解压后,xl/worksheets/sheet1.xml中日期列(第14列)的数值为43708。
根因分析
该问题源于Anton Scheffer实现的Excel生成逻辑与Excel默认规则不匹配:
- Scheffer的实现中,布尔字面量使用
"true"表示1904日期系统开关 - Excel默认及ExcelDataReader预期的布尔值是
"1"
这种不匹配导致ExcelDataReader错误识别了日期基准系统:
- 错误识别为1900日期系统时,数值
43708对应31/08/2019 - 正确识别为1904日期系统时,数值
43708对应01/09/2023
不更换ExcelDataReader的解决方案
方案1:手动修正解析后的日期
针对解析出的日期早于预期范围(如2021年)的情况,手动转换为1904日期系统的正确日期:
// 读取单元格时的处理逻辑 int dateColumnIndex = 13; // 第14列,索引从0开始 var cellValue = reader.GetValue(dateColumnIndex); if (cellValue is DateTime parsedDate && parsedDate.Year < 2021) { // 1904与1900日期系统的天数差为1462天 DateTime correctedDate = parsedDate.AddDays(1462); // 使用correctedDate作为最终日期值 }
方案2:强制启用1904日期系统解析
创建ExcelDataReader时,通过配置强制指定使用1904日期系统:
var stream = await httpClient.GetStreamAsync("your-file-url"); var readerConfig = new ExcelReaderConfiguration { DateTimeFormat = new DateTimeFormat { BaseDate = new DateTime(1904, 1, 1) } }; using var reader = ExcelReaderFactory.CreateReader(stream, readerConfig); // 后续读取逻辑
方案3:使用修复后的库版本
如果项目允许,可自行编译包含该问题修复PR的ExcelDataReader分支版本,或等待官方合并修复后更新库。
内容的提问来源于stack exchange,提问作者James Jonatah
相关产品推荐
相关产品推荐

