【问题标题】:Can OpenXML return a result of a formulaOpenXML 能否返回公式的结果
【发布时间】:2015-08-31 15:55:21
【问题描述】:

我正在使用以下代码作为更大项目的一部分 - 该程序基本上根据从下拉框中选择的工作表读取电子表格 - 然后将结果分配给数据表 - 我有一个 for 循环运行以下函数来获取单元格内容并将其添加到数据表中

 public string GetValue(Cell cell, SharedStringTablePart stringTablePart)
    {

        if (cell.ChildElements.Count == 0) return null;

        //get cell value

        string value = cell.ElementAt(0).InnerText;//CellValue.InnerText;


        //Look up real value from shared string table

        if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString))

            value = stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText;

        return value;

    }

在我使用的电子表格中,这会返回一个公式而不是结果。电子表格公式是 =Sheet1!A12,本质上,用户在 Sheet1 A12 中输入的任何内容都应显示在单元格中。现在电子表格已经填写了信息,但程序不会只提取公式的结果。

这方面的一个例子是:Sheet 1 A12 包含单词“Dog”,这意味着在 Sheet2 中,单元格 A4 具有公式 =Sheet1A12 并且应该显示“Dog”(它在 excel 中显示,但在程序中没有) .

考虑到结果已经存在,OpenXML 是否能够显示结果?

【问题讨论】:

    标签: c# excel openxml


    【解决方案1】:

    我不太同意给出的两个答案。 我做了一个快速测试,将一些值和一个求和公式添加到新工作簿的 sheet1,保存为 xmlx,解压缩并查看 /xl/worksheets/sheet1.xml。

    <row r="14" spans="1:1" x14ac:dyDescent="0.25">
        <c r="A14">
            <f>SUM(A1:A13)</f>
            <v>1295</v>
        </c>
    </row>
    

    如您所见,公式及其计算值都是可见的。然后我做了一个细化的搜索,发现了这个:OpenXML SDK: Make Excel recalculate formula

    简而言之:绝对可以访问公式值,甚至可以在需要时重新计算。

    【讨论】:

    • 如果用户选择“计算选项”> 手动,值是否存储在文件中?
    • @bouvierr 我刚刚再次尝试手动计算并存储了它。我可以想象,情况并非总是如此,但是可以使用链接的 SO 帖子中的方法强制计算。
    • 文本值怎么样 - 我相信是 SharedStringTable 搞砸了?
    • @Connor McCarthy 好吧,你试过了吗?我有:&lt;c r="D6" t="str"&gt;&lt;f&gt;CONCATENATE(A4,A5,A6)&lt;/f&gt;&lt;v&gt;svdfdgcsdsgd&lt;/v&gt;&lt;/c&gt;。但是,如果您不尝试并披露 如何 您是如何尝试的,这一切都是无用的猜测。
    • @LocEngineer 是对的,那么你应该可以通过说 cell.ElementAt(1).InnerText 来获取值,然后你就完成了
    【解决方案2】:

    OpenXml 只是保存电子表格内容的格式。要获得单元格的结果,您需要 SpreadSheet 引擎(即 excel)

    【讨论】:

      【解决方案3】:

      对不起,没有。 OpenXML SDK 只是一组用于在底层操作 Word、Excel 和 PowerPoint 文件的类。公式存储为纯文本,您需要为此实现公式评估器。如果您想参与这项工作,请参阅Interpreter design pattern

      还可以使用 SDK 提供的属性来访问单元格数据(CellValue、CellFormula)。另请注意,Excel 并不总是填充 DataType(仅当无法正确推断为更精确时,例如:共享字符串,而不是将值读取为数字,它填充数据类型以告知该数字实际上是一个索引在共享字符串表中,如您的代码 sn-p 所示)。

      我没用过ClosedXML,但听说值得一试。

      【讨论】:

        【解决方案4】:

        使用它返回公式的结果:

        字符串值 = cell.CellValue.InnerText;

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-20
          • 1970-01-01
          • 2021-01-09
          相关资源
          最近更新 更多