首页 > 解决方案 > 除非之前打开过文档,否则 EPPlus 无法获取单元格值

问题描述

我正在尝试使用 EPPlus 解析 Excel 工作表,但在从公式单元格获取值时遇到问题。我正在使用的文档是在运行时从 Internet 作为字节数组下载的,如果使用 Excel 保存和打开,则工作正常。文件格式为 .xlsm(启用宏)。

问题如下:某些单元格包含公式,仅引用不同工作表中的单元格,例如: ='diffSheet'!A25. 我无法从这些单元格中获取值:cell.Value为空,并且cell.Text只是“-”。

我尝试在这些单元格上调用Calculate() 方法,但它所做的只是加载很长时间,然后每次都返回“#VALUE”错误。

奇怪的是,如果文档之前由 Excel 打开,则相同的文档由相同的代码处理就好了。我尝试手动下载文档,在 Excel 中打开,然后上传回来;之后代码从相同单元格获取值没有问题。可能值得指出的是,除非您按下启用编辑按钮,否则 Excel 不会计算公式值,但据我所知,EPPlus 没有这样的东西。我尝试以编程方式保存并重新打开文档,但它不起作用。

我希望有人可以解释这里的问题是什么,以及是否有方法来处理文档而无需用户每次都打开它。

提前致谢!

标签: c#.netexcelepplus

解决方案


Excel 文件可以包含具有公式的单元格的值,但这些值也可能会丢失。在 Excel 中打开并保存文件后,Excel 会计算并写入所有值。

EPPlus 可以进行一些计算,但它不使用 Excel(或需要安装它),而且它的计算不如 Excel 本身先进。

据我所知,对于 EPPlus 开发人员来说,计算是一项重要的工作,他们现在正在使用他们的版本 5 进行商业化。

Excel (xlsx) 文件实际上是 ZIP 文件。因此,如果您提取它们,您可以将内容查看为 xml。例如:

非常简单的例子

读起来像这样:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac xr xr2 xr3" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" xmlns:xr="http://schemas.microsoft.com/office/spreadsheetml/2014/revision" xmlns:xr2="http://schemas.microsoft.com/office/spreadsheetml/2015/revision2" xmlns:xr3="http://schemas.microsoft.com/office/spreadsheetml/2016/revision3" xr:uid="{3DBD100E-5F85-4729-996E-130F34C637C8}">
    <sheetPr codeName="Sheet1"/>
    <dimension ref="A1:A3"/>
    <sheetViews>
        <sheetView tabSelected="1" workbookViewId="0">
            <selection activeCell="A3" sqref="A3"/>
        </sheetView>
    </sheetViews>
    <sheetFormatPr defaultRowHeight="15" x14ac:dyDescent="0.25"/>
    <sheetData>
        <row r="1" spans="1:1" x14ac:dyDescent="0.25">
            <c r="A1">
                <v>1</v>
            </c>
        </row>
        <row r="2" spans="1:1" x14ac:dyDescent="0.25">
            <c r="A2">
                <v>2</v>
            </c>
        </row>
        <row r="3" spans="1:1" x14ac:dyDescent="0.25">
            <c r="A3">
                <f>A1+A2</f>
                <v>3</v>
            </c>
        </row>
    </sheetData>
    <pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/>
</worksheet>

在单元格 A3 中,您可以注意到公式和值。继续并在打开之前检查您的 excel 文件,您会看到。

(这不适用于旧的 .xls 格式。)


推荐阅读