You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 18:45:19