【问题标题】:Evaluate Excel File Without Opening/Saving在不打开/保存的情况下评估 Excel 文件
【发布时间】:2018-10-23 15:00:56
【问题描述】:

有没有办法在不手动打开文件的情况下计算 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

公式现已计算完毕。

【问题讨论】:

  • 我认为您无法获取 excel 来从 excel 外部更新公式。相反,为什么不在 R 中创建摘要页面,然后输出到 excel?
  • 同意,我很确定 Excel 在您打开它之前不会计算任何东西。因此,即使您使用 R 编写 Excel 公式,在您在 Excel 中打开工作簿之前,这些值也不会填充。
  • 好的,谢谢!我无法在 R b/c 中创建摘要,计算 (XIRR) 有时无法在 R 中计算,我需要确认它也不会在 excel 中计算。谢谢
  • 你可能会参考这个关于 XIRR 的问题:stackoverflow.com/questions/14259575/calculating-xirr-using-r
  • 感谢我们有一个很好的 XIRR 函数,它在 99% 的时间里都能正常工作。它实际上只有非常负的 IRR 存在问题,而 excel 似乎计算得更好。

标签: r openxlsx


【解决方案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 的文件,该 VBscript 打开文件,保存它(即,也计算它),然后关闭它。然后它执行脚本,然后删除脚本。

【讨论】:

    【解决方案2】:

    有点晚了,但我发现 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") 安装它

    【讨论】:

      【解决方案3】:

      以下功能适用于我:

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

      【讨论】:

        猜你喜欢
        • 2017-06-23
        • 1970-01-01
        • 2020-11-09
        • 1970-01-01
        • 2023-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多