2013-12-18 60 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)