2013-08-21 118 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