首页 > 解决方案 > excel.link R 包强制 Excel 自动计算

问题描述

我有一个 R 脚本,除其他外,它循环遍历 Excel 二进制文件列表(*.xlsb,内部有很多预定义内容,计算设置为Manual)并将 data.frame 粘贴到特定范围内,然后更改不同工作表中某些其他单元格的值。

由于文件是 *.xlsb,我已经使用 excel.link 包实现了一个解决方案。该包本身工作正常,但有一个主要问题:一旦将某些内容写入打开的工作簿,它就会将该工作簿的计算更改为Automatic

这是一个很大的问题,因为电子表格本身非常大,发生了许多计算和工作表。重新计算工作簿需要 15 到 45 秒。更糟糕的是,每次 R(通过 excel.link)将数据写入工作簿时,工作簿都会重新计算。就我而言,对于每个工作簿,我在 3 个不同的地方打印数据。所以这让我慢了很多。

理想情况下,我希望能够控制这方面,即仅在保存文件之前将计算设置为自动,以便工作簿只计算一次。-- 类似于 XLConnect 包setForceFormulaRecalculation,但不支持 *.xlsb。

否则,任何形式的解决方法都会受到欢迎。

我粘贴了几行代码,但我不认为它非常相关。

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 插件。预先感谢您的帮助。

标签: rexcelvba

解决方案


为了加快速度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")

推荐阅读