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


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

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

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


9611
2017-08-21 11:03


起源

没有宏,你无法完成你所追求的那种动态行为。 Excel公式/单元格总是相同(是静态的),如果要考虑变量行为,则必须依赖宏(或其他类型的应用程序)。 - varocarbas
@varocarbas你能提供详细说明如何实现这一目标的完整答案吗? - OrangeDog
当然。但是如果你想在同一个文件中使用宏,你必须将它转换为xlsm;如果目标计算机中的Excel安全设置告知,则会出现提示符(“是否要启用宏?”)。你还想要吗? - varocarbas
你是什​​么意思 <v> 和 <f>?您使用什么过程来“生成”xlsx文件? - LS_ᴅᴇᴠ
@LS_dev用7zip打开一个xlsx并亲自查看。我是以编程方式直接创建文件格式的。 - OrangeDog


答案:


Python模块 XlsxWriter 设定公式 <v> 值为0(除非实际值已知)和 <calcPr>  fullCalcOnLoad 属性为true xl/workbook.xml 文件:

<calcPr fullCalcOnLoad="1"/>

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

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


12
2017-08-26 15:02



对Python的引用几乎让我不再欣赏这个答案的价值。我通过使用PHP preg_replace将现有的Tag Calcpr设置为fullCalcOnLoad =“1”来解决这个问题 - zzapper
@zzapper stackoverflow.com/a/1732454/476716 - OrangeDog


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

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

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

<calcPr calcMode="auto"/>

还检查一下 Excel如何确定当前计算模式的说明

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

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


4
2017-08-21 13:02



按照链接说明,以自动模式和手动模式保存的文件是相同的。为了以防万一,我在自动模式文件中更改了计算单元格的值,并且在打开时没有重新计算。 - OrangeDog
“我在自动模式文件中更改了计算单元格的值”?您必须生成工作簿,并将计算模式设置为“自动”。是工作簿属性,而不是单元格! - LS_ᴅᴇᴠ
我将单元格的值更改为不是公式的结果。 - OrangeDog
看起来这是xls文件的属性,而不是xlsx。 - OrangeDog
大声笑!!!还有什么??? - LS_ᴅᴇᴠ


在您的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> 实体。


0
2017-08-21 14:01



这对我来说是一个好主意。但我测试了它,如果计算模式没有设置为自动, B2 打开工作簿时显示为空。 - LS_ᴅᴇᴠ
此外,Google文档用于拒绝没有的Excel文件 <v> 价值集。所以,一般来说,最好设置一些值,即使它是0。 - jmcnamara