我正在生成 xlsx 文件,并且希望在此过程中不必计算所有公式的值。也就是说,我想将<v>
带有 的单元格设置为 0(或省略它)<f>
,并让 Excel 在打开时填充这些值。
一个建议是Calculate
在启动时运行宏,但无法找到完整的指南,说明如何使用已签名的宏执行此操作以避免提示用户。您可以在 xlsx 中的某处设置一个标志会好得多。
编辑:我不是在寻找涉及使用 Office 程序进行更改的答案。我正在寻找文件格式的详细信息。
Python 模块XlsxWriter将公式<v>
值设置为 0(除非实际值已知),并将文件<calcPr>
fullCalcOnLoad
中的属性设置为 true xl/workbook.xml
:
<calcPr fullCalcOnLoad="1"/>
这适用于我测试过的所有 Excel 和 OpenOffice、LibreOffice、Google Docs 和 Gnumeric 版本。
它不适用于无法重新计算公式值的非电子表格应用程序,例如文件查看器。
如果计算模式设置为自动,Excel 总是(重新)计算打开的工作簿。
因此,只需生成计算模式设置为“自动”的文件。
在xl/workbook.xml
中,将以下节点添加到工作簿节点:
<calcPr calcMode="auto"/>
另请检查Excel 如何确定当前计算模式的说明。
您可以按照建议使用宏,但是您将创建一个不太安全且兼容性较差的工作簿,而不会避免用户交互来强制计算。
如果您选择使用 VBA,则可能会Application.Calculate
发生Workbook_Open
。
在您的 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>
。
通过 openxml 导出 xlsx 时遇到了同样的问题(使用最快的 SAX + 模板文件方法,没有 zip 流倒带)。
尽管计算选项=自动,打开文件时不会重新计算。此外,无需通过“立即计算”和“计算工作表”按钮重新计算。仅在选择单元格并按 Enter 时;(
原始公式:SUM(A3:A999)
解决方案:
最终公式:SUM(A3:INDIRECT("A"&Internal!P1))
请参考随附的 GIF
附言
理论上,在 P1 中,您可以通过类似 =LOOKUP(2;1/(Sheet1!A:A<>"");ROW(Sheet1!A:A)) 的方式实现动态行号计算,但我的客户对硬编码感到满意行号解决方案