2013-08-21 152 views
10

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

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

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

+0

无法完成没有宏后的动态行为。 Excel公式/单元格始终是相同的(是静态的),如果您想要考虑变量行为,则必须依赖宏(或其他类型的应用程序)。 – varocarbas

+0

@varocarbas你能提供一个完整的答案,详细说明如何实现这一目标? – OrangeDog

+0

当然。但是如果你想让宏在同一个文件中,你必须将它转换成xlsm;并且如果目标计算机中的Excel安全性设置如此,则会出现提示(“是否要启用宏?”)。无论如何,你还想要吗? – varocarbas

回答

11

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

<calcPr fullCalcOnLoad="1"/> 

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

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

+0

对Python的引用几乎让我非常欣赏这个答案的价值。我通过使用PHP preg_replace将现有的Tag Calcpr设置为fullCalcOnLoad =“1”来解决此问题 – zzapper

+0

@zzapper http://stackoverflow.com/a/1732454/476716 – OrangeDog

4

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

所以,只需生成计算模式设置为“自动”的文件。

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

<calcPr calcMode="auto"/> 

还要检查Description of how Excel determines the current mode of calculation

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

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

+1

按照链接的说明,保存在自动模式和手动模式下的文件是相同的。以防万一,我改变了自动模式文件中计算单元格的值,并且在打开时没有重新计算。 – OrangeDog

+0

“我改变了自动模式文件中计算单元的值”?您必须生成计算模式设置为自动的工作簿。是工作簿属性,而不是单元格! –

+0

我将单元格的值更改为不是公式的结果。 – OrangeDog

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>

+0

这对我来说是一个好主意。但是我测试了它,如果计算模式没有设置为自动,打开工作簿时'B2'显示为空。 –

+0

此外,Google文档用于拒绝没有“”值集的Excel文件。所以,一般来说,最好设置一些值,即使它是0. – jmcnamara