excel.link R程序包强制excel自动计算
我有一个R脚本,它循环遍历Excel二进制文件列表(*.xlsb,其中包含大量预定义内容,计算设置为手动),并在特定范围内粘贴data.frame,然后更改其他工作表中某些其他单元格的值 由于文件是*.xlsb,我使用excel.link包实现了一个解决方案。 该包本身工作正常,但有一个主要问题:一旦它将某些内容写入打开的工作簿,它就会将该工作簿的计算更改为自动 这是一个很大的问题,因为电子表格本身很大,有很多计算和工作表。重新计算工作簿需要15到45秒。更糟糕的是,每次R(通过excel.link)将数据写入工作簿时,工作簿都会重新计算。在我的例子中,对于每个工作簿,我在3个不同的位置打印数据。所以这让我慢了很多 理想情况下,我希望能够控制这一方面,即仅在保存文件之前将计算设置为自动,以便工作簿只计算一次--与XLConnect软件包setForceFormulaRecalculation类似,它不支持*.xlsb 否则,任何形式的解决办法都是受欢迎的 我在我的代码下面粘贴了几行,但是我不相信这是非常相关的excel.link R程序包强制excel自动计算,r,excel,vba,R,Excel,Vba,我有一个R脚本,它循环遍历Excel二进制文件列表(*.xlsb,其中包含大量预定义内容,计算设置为手动),并在特定范围内粘贴data.frame,然后更改其他工作表中某些其他单元格的值 由于文件是*.xlsb,我使用excel.link包实现了一个解决方案。 该包本身工作正常,但有一个主要问题:一旦它将某些内容写入打开的工作簿,它就会将该工作簿的计算更改为自动 这是一个很大的问题,因为电子表格本身很大,有很多计算和工作表。重新计算工作簿需要15到45秒。更糟糕的是,每次R(通过excel.li
xl.workbook.open(paste0(bs_path,"\\UAT Results Summary_Wave1.xlsb"))
xl.sheet.activate("Input - Subtotals Liab")
xls = xl.get.excel()
rng1 = xls[["Activesheet"]]$Cells(free_cell,11)
wrt=xl.write(Smmry,rng1,row.names = FALSE,col.names = FALSE)
xl.sheet.activate("Instructions")
xlrc[a13]=as.numeric(jobstep)
xlrc[b13]=as.numeric(jobstep)
xl.workbook.save(paste0(dest_path,"\\UAT Results Summary_",fund_short,"_",jobstep), file.format=xl.constants$xlExcel12)
xl.workbook.close()
如果您想查看更多代码,请告诉我
请注意,我目前没有考虑转换为xlsx并返回xlsb。速度是这个脚本的关键。
另外请注意,至少目前我无法使用RExcel或任何其他Excel加载项。
提前感谢您的帮助。有关speed
excel。link
在每次输出到excel之前禁用自动重新计算,并在输出后将计算设置为自动。我将在下一版本中修复此行为。重新计算状态将恢复到以前的状态,而不是自动重新计算。
现在,您可以尝试在每次数据交换后设置手动重新计算,如下例所示:
app = xl()
xl[a1] = 42
app[["Calculation"]] = xl.constants$xlCalculationManual
更新2018.07.09:
另一种方法是实时修补程序包代码。请尝试下面的代码片段。它对我有用
library(excel.link)
set_excel_state = function(app){
app[["Statusbar"]] = ""
app[["Screenupdating"]] = TRUE
app[["Calculation"]] = xl.constants$xlCalculationManual
invisible(NULL)
}
assignInNamespace("make.me.slow", set_excel_state, ns = "excel.link")
非常感谢您的回复。然而,这似乎不起作用。我认为计算会立即设置为自动,因此在粘贴数据时,它会立即重新计算电子表格,然后才将计算设置为手动。这对第二次或第三次数据交换也没有帮助,因为同样的事情正在发生。我正在使用以下代码:
xls=xl.get.excel()
rng1=xls[[“活动表”]]$Cells(2,11)wrt=xl.write(Smmry,rng1,row.names=FALSE,col.names=FALSE)xls[[“计算”]=xl.常量$xlCalculationManual更准确地说:电子表格从设置为Manual的计算开始,到设置为Manual的计算结束;但是在每次数据交换时,它仍然会重新计算电子表格,因此不会获得时间/速度方面的好处。Re:更新工作起来很有魅力!非常感谢你。