Openxlsx-评估Excel文件而无需打开/保存

时间:2018-10-23 15:00:57

标签: r openxlsx

是否有一种无需手动打开文件即可计算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

现在已经计算出公式。

2 个答案:

答案 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")

安装它