epplus默认读取公式文本,需设calculatemode=auto、调用calculate()后才能通过cell.value或cell.text获取计算结果;cell.value返回强类型值,cell.text返回格式化显示文本。

用 ExcelPackage 读取公式计算结果而不是公式文本
默认情况下,ExcelPackage(即 EPPlus)读取单元格时返回的是公式字符串(如 "=SUM(A1:A10)"),而非实际计算值。要拿到结果,必须显式启用公式计算引擎,并确保工作簿中没有禁用计算的设置。
- 初始化
ExcelPackage时传入new ExcelPackage(new FileInfo(path)),不要用只读流(否则公式引擎无法加载依赖) - 设置
package.Workbook.CalculateMode = OfficeOpenXml.ExcelCalculationMode.Auto - 调用
package.Workbook.Calculate()—— 这一步不能省,否则cell.Value仍为空或为公式文本 - 读取时用
cell.GetValue<double>()</double>或cell.Text(后者返回格式化后的字符串结果,含日期/货币样式)
CellValue 和 Text 的区别直接影响隐藏数据识别
Excel 中某些“隐藏数据”其实不是真正隐藏,而是单元格设置了自定义格式(如 ;;; ),或数值极小导致显示为 0/空白。此时 cell.Value 仍有原始数值,而 cell.Text 返回空字符串。
-
cell.Value:返回解析后的强类型值(double、DateTime、string等),不受格式影响 -
cell.Text:返回 Excel 渲染后看到的文本,受数字格式、条件格式、自定义格式控制 - 若需还原用户“看到的内容”,优先用
cell.Text;若需分析真实数据(比如导出统计),必须用cell.Value并处理 null - 注意:
cell.Value对公式单元格只有在调用Calculate()后才有效,否则为null
读取被隐藏行/列或筛选后不可见单元格的数据
EPPlus 不区分“是否可见”,它读取的是底层 XML 数据,所以隐藏行、列、自动筛选关闭的行,只要物理存在,就能读到。但容易误判的是:用户手动隐藏 + 单元格为空 + 公式未计算 → 会读成 null,看起来像“丢失数据”。
- 检查
cell.Worksheet.Row(row).Hidden和cell.Worksheet.Column(col).Hidden可知是否被隐藏,但这不影响读取 - 自动筛选状态下,被过滤掉的行依然存在于
Worksheet.Cells中,需结合cell.Worksheet.AutoFilter和cell.FullAddress手动比对筛选规则(EPPlus 不提供“当前可见行”API) - 真正读不到的情况只有一种:该单元格在 xlsx XML 中根本不存在(即从未写入过,连空值都没设)——此时
cell.Value == null且cell.Text == ""
EPPlus 6+ 版本对公式支持的兼容性陷阱
EPPlus 5.x 默认不加载公式引擎,6.x 起默认启用但要求 .NET 5+,且部分函数(如 XLOOKUP、LET)不被支持,调用 Calculate() 时会静默失败或抛 InvalidOperationException。
- 捕获异常时检查
ex.Message是否含"Unsupported function"或"Could not parse formula" - 降级方案:对含未知函数的 sheet,改用
cell.Formula+ 正则提取引用地址,再手动查表(适用于简单场景) - 避免使用
cell.Value.ToString()—— 遇到日期可能输出"44926.5"(Excel 序列号),应统一用Convert.ToDateTime(cell.Value)或cell.GetValue<datetime>()</datetime> - 若项目受限于 .NET Framework 4.8,别强行升级 EPPlus 6,回退到 5.8.7 + 手动引用
EPPlus.Core公式补丁更稳











