3

有没有办法在不手动打开文件的情况下计算 excel 公式?如果 openxlsx 不是最佳选择,请随时建议其他软件包。谢谢!

我的目标是将数据粘贴到一个 excel 文件(已经存在)中,其中的公式引用了我将数据粘贴到的范围,并让 excel 刷新它的公式并计算汇总统计信息(例如总和)。我想用 R 代码更新公式并保存文件,这样我就可以在不打开/保存 Excel 文件的情况下将汇总值读入 R。

我想删除手动步骤(下面的粗体)。

我使用的工作簿有两张表: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

现在已经计算公式。

4

3 回答 3

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"))
}

该函数使用 VB 脚本创建一个文件,该 VB 脚本打开文件,保存它(即,也计算它),然后关闭它。然后它执行脚本,然后删除脚本。

于 2019-09-26T16:13:20.653 回答
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")

于 2019-11-14T03:06:31.760 回答
0

以下功能适用于我:

force_Calculation_Excel_Formula <- function(file_name)
{
    library(excel.link)
    app <- xl.workbook.open(filename = file_name)
    app[["Statusbar"]] <- ""
    app[["Screenupdating"]] <- TRUE
    app[["Calculation"]] <- xl.constants$xlCalculationManual
    invisible(NULL)
    xl.workbook.save(filename_Save)
    xl.workbook.close()
    system("taskkill /IM Excel.exe")
}
于 2021-11-20T20:26:34.987 回答