EPPlus读取Excel单元格值异常:公式结果73却返回-1320
EPPlus读取Excel日期差单元格得到-1320而非预期73的原因分析
问题场景
Excel单元格XEZ1通过公式计算日期差,预期结果为73,但使用EPPlus读取时返回-1320,已尝试多种读取方式:
- 读取单元格文本:
package.Workbook.Worksheets[hojaEvertecCr].Cells["XEZ1"].Text; - 读取Value并转字符串:
package.Workbook.Worksheets[hojaEvertecCr].Cells["XEZ1"].Value.ToString(); - 使用
GetValue<string>:package.Workbook.Worksheets[hojaEvertecCr].Cells["XEZ1"].GetValue<string>(); - 通过行列索引读取:
package.Workbook.Worksheets[hojaEvertecCr].Cells[1,16380].Value
可能的原因及说明
- Excel日期系统不匹配
Excel存在两种日期计数系统:
- Windows默认的1900年系统:日期值从1900-01-01开始累加天数
- Mac旧版的1904年系统:日期值从1904-01-02开始累加天数
若你的Excel文件采用1904年系统,但EPPlus默认按1900年系统解析日期值,会导致日期差计算出现偏移。两个系统的基准日相差1462天,若公式基于1904系统计算天数差,EPPlus用1900系统读取原始值时,就会出现结果偏差。
- 公式未重新计算
EPPlus默认不会自动重新计算Excel中的公式。如果文件保存时未刷新公式计算结果(比如关闭前未保存最新计算值,或在禁用自动计算的环境下保存),EPPlus读取的是单元格缓存的旧值,而非预期的73。可在读取前触发全局公式计算:
package.Workbook.Calculate();
- 单元格格式与存储值不匹配
单元格显示的73是格式化后的结果,但实际存储的是日期类型值而非纯数字。比如公式=A1-B1计算出的日期差,若单元格格式被设为日期,EPPlus读取的是日期对应的序列化数值,而非显示的天数。此时可将单元格格式改为「常规」或「数字」,或在代码中手动计算日期差:
var date1 = package.Workbook.Worksheets[hojaEvertecCr].Cells["A1"].GetValue<DateTime>(); var date2 = package.Workbook.Worksheets[hojaEvertecCr].Cells["B1"].GetValue<DateTime>(); var daysDiff = (date1 - date2).Days;
- EPPlus版本或大列索引解析问题
XEZ属于大列索引(第16380列),旧版EPPlus可能存在此类极端列的解析bug,或对某些复杂日期公式支持不完善。尝试升级到最新版EPPlus,验证是否解决问题。
内容的提问来源于stack exchange,提问作者R Marco
相关产品推荐
相关产品推荐

