我正在生成xlsx文件,并且不希望在此过程中计算所有公式的值。
也就是说,我想为<v>
的单元格设置<f>
为0(或省略它),并在Excel打开时填写值。
一个建议是在启动时运行宏Calculate
,但无法找到有关如何使用签名宏执行此操作的完整指南,以避免提示用户。你可以在xlsx中设置的标志会好得多。
编辑:我不是在寻找涉及使用Office程序进行更改的答案。我正在寻找文件格式的详细信息。
答案 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)
解决方案:
最终公式: SUM(A3:INDIRECT(“ A”&Internal!P1))
请参阅所附的gif文件
P.S。
从理论上讲,在P1中,您可以通过= LOOKUP(2; 1 /(Sheet1!A:A <>“”); ROW(Sheet1!A:A))之类的东西来实现动态行数计算,但是我的客户是对硬编码的行号解决方案感到满意