R(3.0.2)/ MSOffice 2013 / Win7
假设我们有一个包含两张表的现有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)
所以这就出现了问题 - 我有&#34;计算&#34;表格引用&#34;数据&#34;表格与公式。由于某些原因,即使公式引用刚刚填充的单元格,也不会重新计算数据更新。
Excel中的计算选项变为自动,甚至将其转为手动,按F9强制重新计算不起作用。
我找到了一些奇怪的方法来完成这项工作:1。选择具有适当公式的特定单元格并按Enter键(对于每个单元格)2。将公式再次拖到故障单元格上(覆盖公式)使用完全相同的公式..)3。参考其他文件(例如,data2.xlsx)的数据表确实有效,但这对我来说是最后的选择。我不想用单独的数据文件来膨胀文件结构。另外,考虑打开这两个文件以使其工作的可怕要求。
提前致谢。
答案 0 :(得分:3)
看到此链接获得了一些点击,解决方案隐藏在评论部分,这就是答案:
wb$setForceFormulaRecalculation(T)
这适用于大多数软件包(至少基于rJava),因为这个java方法在excel中传递,因此不是由R语言决定的。
答案 1 :(得分:1)
加载工作簿并写入数据后,在将工作簿保存到目录之前强制重新计算公式。
这应该适合你:
writeWorksheet(wb, data=df, sheet="data", startRow=1, startCol=1, header=F)
setForceFormulaRecalculation(wb,"data",TRUE)
saveWorkbook(wb)
答案 2 :(得分:0)
我知道这篇文章是2.5岁,但我和你有完全相同的问题。我怀疑XLConnect存在一些问题。我使用write.csv
并且它有效。我对write.csv
的问题是我的数据框有超过16384列,我无法在文件中添加另一张图。
答案 3 :(得分:-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