我正在生成xlsx文件,并且希望在此过程中不必计算所有公式的值。 也就是说,我想为<f>
中的单元格设置<v>
为0(或省略它),并在打开Excel时填入值。设置xlsx重新计算公式
一个建议是在启动时运行宏Calculate
,但一直没有找到关于如何使用签名宏执行此操作以避免提示用户的完整指南。一个可以在xlsx中设置的标志会更好。
编辑:我不在寻找涉及使用Office程序进行更改的答案。我正在寻找文件格式的详细信息。
我正在生成xlsx文件,并且希望在此过程中不必计算所有公式的值。 也就是说,我想为<f>
中的单元格设置<v>
为0(或省略它),并在打开Excel时填入值。设置xlsx重新计算公式
一个建议是在启动时运行宏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"/>
还要检查Description of how Excel determines the current mode of calculation。
您可以按照建议使用宏,但是您将创建不太安全且兼容性较差的工作簿,而不会避免用户交互来强制计算。
如果您选择使用VBA,您可能会在Workbook_Open
事件中使用Application.Calculate
。
在您的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>
。
这对我来说是一个好主意。但是我测试了它,如果计算模式没有设置为自动,打开工作簿时'B2'显示为空。 –
此外,Google文档用于拒绝没有“
无法完成没有宏后的动态行为。 Excel公式/单元格始终是相同的(是静态的),如果您想要考虑变量行为,则必须依赖宏(或其他类型的应用程序)。 – varocarbas
@varocarbas你能提供一个完整的答案,详细说明如何实现这一目标? – OrangeDog
当然。但是如果你想让宏在同一个文件中,你必须将它转换成xlsm;并且如果目标计算机中的Excel安全性设置如此,则会出现提示(“是否要启用宏?”)。无论如何,你还想要吗? – varocarbas