设置xlsx以在打开时重新计算公式

时间:2013-08-21 11:03:06

标签: openxml xlsx

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

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

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

4 个答案:

答案 0 :(得分:12)

Python模块XlsxWriter将公式<v>值设置为0(除非实际值已知)并且<calcPr> fullCalcOnLoad属性为{{1}文件:

xl/workbook.xml

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

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

答案 1 :(得分:4)

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

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

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

<calcPr calcMode="auto"/>

同时检查Description of how Excel determines the current mode of calculation

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

如果您选择使用VBA,则可以在Application.Calculate事件中Workbook_Open

答案 2 :(得分:0)

在您的XML内容中,只需省略每个单元格中具有公式的<v>实体,这将强制Ms 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>实体。

答案 3 :(得分:0)

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

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

原始公式: SUM(A3:A999)

解决方案:

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

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

请参阅所附的gif文件

before.gif

after.gif

P.S。

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