14

我正在生成 xlsx 文件,并且希望在此过程中不必计算所有公式的值。也就是说,我想将<v>带有 的单元格设置为 0(或省略它)<f>,并让 Excel 在打开时填充这些值。

一个建议是Calculate在启动时运行宏,但无法找到完整的指南,说明如何使用已签名的宏执行此操作以避免提示用户。您可以在 xlsx 中的某处设置一个标志会好得多。

编辑:我不是在寻找涉及使用 Office 程序进行更改的答案。我正在寻找文件格式的详细信息。

4

4 回答 4

14

Python 模块XlsxWriter将公式<v>值设置为 0(除非实际值已知),并将文件<calcPr> fullCalcOnLoad中的属性设置为 true xl/workbook.xml

<calcPr fullCalcOnLoad="1"/>

这适用于我测试过的所有 Excel 和 OpenOffice、LibreOffice、Google Docs 和 Gnumeric 版本。

它不适用于无法重新计算公式值的非电子表格应用程序,例如文件查看器。

于 2013-08-26T15:02:00.770 回答
4

如果计算模式设置为自动,Excel 总是(重新)计算打开的工作簿。

因此,只需生成计算模式设置为“自动”的文件。

xl/workbook.xml中,将以下节点添加到工作簿节点:

<calcPr calcMode="auto"/>

另请检查Excel 如何确定当前计算模式的说明

您可以按照建议使用宏,但是您将创建一个不太安全且兼容性较差的工作簿,而不会避免用户交互来强制计算。

如果您选择使用 VBA,则可能会Application.Calculate发生Workbook_Open

于 2013-08-21T13:02:51.403 回答
0

在您的 XML 内容中,只需省略<v>每个单元格中具有公式的实体,这将迫使 Excel 女士实现公式,无论 Excel 选项是什么。

代替:

  <c r="B2" s="1">
    <f>SUM(A1:C1)</f>
    <v>6</v>
  </c>

有:

  <c r="B2" s="1">
    <f>SUM(A1:C1)</f>
  </c>

如果您必须在已经给定的 XML 内容中实现公式,那么您可以轻松编写一个小型解析器来搜索每个<c>实体。如果<c>实体有<f>实体,则删除其实体<v>

于 2013-08-21T14:01:33.440 回答
0

通过 openxml 导出 xlsx 时遇到了同样的问题(使用最快的 SAX + 模板文件方法,没有 zip 流倒带)。

尽管计算选项=自动,打开文件时不会重新计算。此外,无需通过“立即计算”和“计算工作表”按钮重新计算。仅在选择单元格并按 Enter 时;(

原始公式:SUM(A3:A999)

解决方案:

  1. 创建内部隐藏工作表
  2. 将结束行号(在我的情况下为 999)放入隐藏表中的任何单元格(在我的情况下为 P1)
  3. 通过 INDIRECT 运算符引用单元格中的行号

最终公式:SUM(A3:INDIRECT("A"&Internal!P1))

请参考随附的 GIF

之前.gif

之后.gif

附言

理论上,在 P1 中,您可以通过类似 =LOOKUP(2;1/(Sheet1!A:A<>"");ROW(Sheet1!A:A)) 的方式实现动态行号计算,但我的客户对硬编码感到满意行号解决方案

于 2020-08-10T09:40:13.083 回答