2013-12-18 82 views
5

R(3.0.2)/的MSOffice 2013/Win7的來自R到Excel數據導出:公式不重新計算

假設我們現有data.xlsx文件與兩片 - 「數據」 和 「計算」。

「數據」表是過R充滿:

require(XLConnect) 
df <- data.frame(c(1,2,3,4,5), c(2,3,4,5,6)) 
wb <- loadWorkbook("data.xlsx", create=F) 
setStyleAction(wb, type=XLC$"STYLE_ACTION.NONE") 
writeWorksheet(wb, data=df, sheet="data", startRow=1, startCol=1, header=F) 
saveWorkbook(wb) 

所以來這裏的問題 - 我有「鈣」片是指「數據」表中的公式。由於某種原因,即使公式涉及到剛剛填充的單元格,也不會重新計算更新數據。

Excel中的計算選項已轉爲自動,甚至將其轉換爲手動,並按F9強制進行重新計算。工作。

我發現了一些奇怪的方法來做到這一點:1.選擇具有適當公式的特定單元格,然後按回車鍵(對於每個單元格)2.將公式重新覆蓋到故障單元格上(覆蓋公式完全相同的公式..)3.參考其他文件(比如說data2.xlsx)的數據表確實有效,但這對我來說是最後的選擇。我不想用單獨的數據文件膨脹文件結構。另外,請考慮打開這兩個文件以使其正常工作的可怕要求。

在此先感謝。

+0

是否保存辦呢? – pnuts

+1

不,它沒有。 –

+0

我可以在Win7上重現Excel2010的確切問題。我的建議是向XLConnect的作者提交一個錯誤報告,同時嘗試使用'xlsx'包來代替。順便說一句,我試着跳過你的'setStyleAction'行,沒有改變結果。我認爲XLConnect中的某些東西正在破壞Excel用來將公式鏈接到其引用的單元格的任何內容。 –

回答

2

尋找這一聯繫得到一些點擊和解決隱藏在評論部分,這裏的答案:

wb$setForceFormulaRecalculation(T)

這應該大多數包的工作(在基於rJava至少的)作爲該Java方法在excel內傳遞,因此不是由R語言決定的。

-1

你可以把這個VBA宏放在你的excel文件的一個模塊中,並在你的數據傳輸之後運行(從excel)。

Sub RefreshCalculations() 
     Calculate 
    End Sub 

即使最簡單:在Excel中按F9,這將強制計算所有公式。

對不起,我以前的答案。

我這個宏的作品,只是測試:

Sub refresh2() 
Dim sht As Worksheet 

Dim rng0 As Range 
Dim rng1 As Range 
Dim c As Range 

'loop through the sheets 
For Each sht In ActiveWorkbook.Worksheets 

    'limit the search to the UsedRange 
    Set rng0 = sht.UsedRange 
    On Error Resume Next ' in case of no formulas 

    'reduce looping further 
    Set rng1 = rng0.SpecialCells(xlCellTypeFormulas) 

    For Each c In rng1 'loop through the SpecialCells only 
     c.Formula = c.Formula 
    Next 

Next 
End Sub 
+0

這不是OP所說的:他已經試過了,就像我一樣。這個問題不僅僅是重新計算。 –

+0

我懷疑這個宏與按F9非常相似。而且......我想我已經提到在帖子中試用這個。 –

+0

這是一個非常有創意的解決方法,但我有兩個反對意見。首先,如果工作表中有其他公式,它很可能會出現橫行。其次,很明顯'XLConnect'正在做'xlsx'型工作簿不喜歡的東西,它是應該修復的'R'包,而不是讓錯誤傳播。 –

0

我知道這個帖子爲2.5歲,但我只是有完全一樣的問題與您聯繫。我懷疑XLConnect存在一些問題。我用write.csv,它的工作。我在write.csv上遇到的問題是我的數據框有16384列以上,並且我無法將另一個工作表添加到文件中。

+0

是的,我也在遇到它 – user2981639

1

加載工作簿並寫入數據後,在將工作簿保存到目錄之前強制進行公式重新計算。

這應該爲你工作:

writeWorksheet(wb, data=df, sheet="data", startRow=1, startCol=1, header=F) 
setForceFormulaRecalculation(wb,"data",TRUE) 
saveWorkbook(wb)