6

我有一个与 R 中的 xlsx 包有关的查询。我知道如何使用包中的大部分功能,并且直到现在还没有遇到任何问题。我将首先显示我的代码,然后提出我的问题。

#Code-Section1: 
library(xlsx) 
data1<-iris 
data1<-data1[,c(5,1:4)] 
wb <- createWorkbook() 
sheet1 <- createSheet(wb, sheetName="Sheet1") 
addDataFrame(data1, sheet1, startRow=1, startColumn=1,row.names=FALSE)  
saveWorkbook(wb, file="test.xlsx")  
rm(data1);rm(sheet1);rm(wb) 
#Code-Section1-end: 

这部分简单地获取虹膜数据集并将其放入名为 test.xlsx 的 Excel 电子表格中的 Sheet1 中。现在在 excel 中,我决定通过添加总行向电子表格添加更多内容,因此 excel 电子表格的最后两行是:

virginica   5.9     3.0     5.1     1.8
            876.5   458.6   563.7   179.9

我要做的另一件事是在电子表格中再添加 4 列,其中包含每个数字占行总数的百分比。接下来,我想将 test.xlsx 加载到 R 工作簿中。我用一些随机的正常值定义了一个名为 temp 的新数据框。我的意图是更新 test.xlsx 文件中的数字,以便行总计和百分比随后也会发生变化。更新后的电子表格的最后两行应该有所不同,具体取决于 rnorm(150,5,1) 值的输出。我将数据框保存到一个名为 testa.xlsx 的新电子表格中。值已更新,但由于某种原因,行总计和百分比保持不变,即使它们的单元格的值仍然是“=sum(b2:b151)”或“=b2/b$152”。

#Code-Section2: 
temp <- data.frame(Sepal.Length=rnorm(150,5,1), Sepal.Width=rnorm(150,5,1), Petal.Length=rnorm(150,5,1), Petal.Width=rnorm(150,5,1)) 
wb<-loadWorkbook("test.xlsx") 
f<-getSheets(wb)[[1]] 
addDataFrame(temp, sheet=f, startRow=2, startColumn=2,row.names=FALSE,col.names=FALSE) 
saveWorkbook(wb, file="testa.xlsx") 
#Code-Section2-end: 

因此,我的问题是,如何加载工作簿、更新数字,以便随后更新包含公式的单元格,然后将其保存到新的 Excel 文件中。我可能可以用另一种方式做到这一点,但它需要更多的步骤,我不介意这样做,但只需更新数字以便其他单元格发生变化就会非常方便。与我所做的每篇文章一样,请原谅任何语法错误,如果您认为有必要,请随时更改此消息中的任何内容。

4

2 回答 2

11

在保存工作簿 ( wb) 之前,添加以下内容:

wb$setForceFormulaRecalculation(TRUE)

如果它不起作用,这里还有一个 VBA 解决方案

于 2013-02-18T12:14:54.883 回答
2

如果您想在打开 Excel 文件之前更新公式,而不需要打开 Microsoft Excel,即“强制重新计算公式”;您可以使用Apache POI的解决方案。适用于R

library(xlsx)
wb<-loadWorkbook("test.xlsx")
sheets <- getSheets(wb)
sheet <- sheets[["Sheet1"]]
rows  <- getRows(sheet)
cells <- getCells(rows)
setCellValue(cells[["1.1"]], 999) # Change a number inside the file
wb$getCreationHelper()$createFormulaEvaluator()$evaluateAll() #This is the trick
saveWorkbook(wb,"test.xlsx")

在R-package-xlsx 谷歌网上论坛的更多信息

于 2017-03-04T19:12:08.613 回答