是否有一种无需手动打开文件即可计算excel公式的方法?如果openxlsx不是最佳选择,请随时建议其他软件包。谢谢!
我的目标是使用引用我要粘贴数据的范围的公式将数据粘贴到excel文件(已经存在)中,并让excel刷新其公式并计算汇总统计信息(例如,总和)。我想用R代码更新公式并保存文件,以便我可以将摘要值读入R而无需打开/保存excel文件。
我要删除手动步骤(下面的粗体)。
我正在使用的工作簿有两页:rawData和摘要。我在文件中开始之前唯一的数据是A2:D2上的求和公式。 A2包含= SUM(rawData!A:A)
require("openxlsx")
wb <- loadWorkbook("MyTestWorkBook.xlsx")
writeData(wb,iris, sheet="rawData")
saveWorkbook(wb,"MyTestWorkBook.xlsx",overwrite = TRUE)
从这里开始,我得到了“摘要”工作表,其中包含每一列的总和。 我看了表。
read.xlsx("MyTestWorkBook.xlsx","summary")
sumA sumB sumC sumD
1 0 0 0 0
我现在手动打开工作簿(不带R)并保存
read.xlsx("MyTestWorkBook.xlsx","summary")
sumA sumB sumC sumD
1 876.5 458.6 563.7 179.9
现在已经计算出公式。
答案 0 :(得分:1)
我想出了一种方法来解决这个问题,但这并不是最优雅的方法。该解决方案在使用saveWorkbook()之后以及从刚保存的工作簿中读取数据之前立即执行以下功能:
calculate_wb_fn <- function(excel_file_directory, excel_file_name)
{
macro_calculate_wb <- file(paste0(excel_file_directory,"macro_calculate_wb.vbs") )
writeLines(c("Const xlVisible = -1",
"Dim objExcel",
"Dim objWb",
"Dim objws",
"Dim strFileName",
paste0("strFileName = \"",gsub("/","\\\\",excel_file_directory),excel_file_name,"\""),
"On Error Resume Next",
"Set objExcel = CreateObject(\"excel.application\")",
"Set objWb = objExcel.Workbooks.Open(strFileName)",
"objExcel.DisplayAlerts = False",
"objWb.Save",
"objWb.Close SaveChanges=True",
"objExcel.Close",
"objExcel.Quit",
"set objWb = Nothing",
"set objExcel = Nothing",
"On Error GoTo 0")
, macro_calculate_wb)
close(macro_calculate_wb)
file <- normalizePath(paste0(excel_file_directory,"macro_calculate_wb.vbs") )
shell(shQuote(string = file), wait = T)
file.remove(paste0(excel_file_directory,"macro_calculate_wb.vbs"))
}
该函数使用VBscript创建文件,该文件将打开,保存(即也进行计算)并关闭该文件。然后执行脚本,然后删除脚本。
答案 1 :(得分:0)
有点晚了,但是我发现RDCOMClient软件包是一种简单的方法。
outputfile <- "filenameblahblah.xlsx"
library(RDCOMClient)
# Create COM Connection to Excel
xlApp <- COMCreate("Excel.Application")
xlApp[['Visible']] <- FALSE
xlApp[['DisplayAlerts']] <- FALSE
# Open workbook
xlWB <- xlApp[["Workbooks"]]$Open(outputfile)
xlWB$Save()
xlWB$Close(TRUE)
请注意,RCDOMClient显然仅适用于Windows计算机,您可能必须使用install.packages("RDCOMClient", repos = "http://www.omegahat.net/R")