【问题标题】:How to export an Excel sheet range to a picture, from within R如何从 R 中将 Excel 工作表范围导出到图片
【发布时间】:2018-08-31 15:55:05
【问题描述】:

我们正在尝试在 R 脚本中自动创建一些图片文件。

我们的 Excel 文件看起来符合我们的要求,但现在需要制作这些 Excel 表格的 JPG 或 PNG 图片副本,以便于网络发布。

我们在 R 和 Excel 之间的大部分交互中一直使用 library(xlsx) 包,看起来我们应该能够通过类似 @987654325 的方式发送特定的 java 命令@ 但目前还不清楚我们如何传递尽可能多的行。

R 会话中,这是一个最小的可重现示例...

这是一个包含要打印的范围的示例 Excel 文件

library(xlsx)
file <- system.file("tests", "test_import.xlsx", package = "xlsx")
file

这是将 Excel 范围导出到图片文件的 Excel 宏

Sub Tester()

    Worksheets("deletedFields").Range("A8:J36").CopyPicture xlScreen, xlBitmap

    Application.DisplayAlerts = False
    Set oCht = Charts.Add
    With oCht
        .Paste
        .Export Filename:="C:\temp\SavedRange.jpg", Filtername:="JPG"
        .Delete
    End With


End Sub

非常感谢任何自动化此操作的帮助!

【问题讨论】:

  • 你试过this吗?
  • 感谢@nice!我相信这需要宏已经嵌入到.xlsx 文件中,但我们正在动态创建这些宏数百次。如果我们也可以在 R 生成的 .xlsx 文件中自动添加宏,这可能会起作用吗?谢谢
  • 是否有某些原因,excel 文件的图片优于 xtableshiny 创建的 html 格式表?从您提供的少量信息来看,似乎有更好的方法来实现您的主要目标。
  • 嗨,@Bishops_Guest 谢谢。我们需要将 Excel 文件发送给研究人员和记者,因此无论哪种方式都需要构建这些表格。我们可能会重新做所有事情,但只需对我们已有的 Excel 范围进行快照即可节省时间。
  • openxlsx 可能会让你更幸运

标签: r vba excel xlsx


【解决方案1】:

考虑让 R 完全像 VBA 在宏中所做的那样:为 Excel 对象库创建 COM 接口。您可以使用RDCOMClient 包执行此操作,保留与 R 语法中的宏几乎相同的代码。

library(RDCOMClient)

xlApp <- COMCreate("Excel.Application")
xlWbk <- xlApp$Workbooks()$Open("C:\\Path\\To\\test_import.xlsx")
xlScreen = 1
xlBitmap = 2

xlWbk$Worksheets("deletedFields")$Range("A8:J36")$CopyPicture(xlScreen, xlBitmap)

xlApp[['DisplayAlerts']] <- FALSE

oCht <- xlApp[['Charts']]$Add()
oCht$Paste()
oCht$Export("C:\\Temp\\SavedRange.jpg", "JPG")
oCht$Delete()

# CLOSE WORKBOOK AND APP
xlWbk$Close(FALSE)
xlApp$Quit()

# RELEASE RESOURCES
oCht <- xlWbk <- xlApp <- NULL    
rm(oCht, xlWbk, xlApp)
gc()

输出 (随机数据/图表)

【讨论】:

    【解决方案2】:

    你可以用 vbs 做到这一点。大多数 vbs 与 vba 相同,因此您可以写出包含宏作为文本的动态 vbs 脚本,然后使用 shell 调用它。

    这是一个工作示例:

    fileConn<-file("c:/rworking/test/test.vbs")
    writeLines(c("Dim xlApp, xlBook, xlSht",
        "Dim filename",
        "filename = \"c:\\Rworking\\test\\test_import.xlsx\"",
        "Set xlApp = CreateObject(\"Excel.Application\")",
        "xlApp.Visible = True",
        "set xlBook = xlApp.WorkBooks.Open(filename)",
        "set xlSht = xlApp.Worksheets(1)",
        "set rng = xlSht.Range(\"A8:J36\")",
        "rng.CopyPicture",
        "Set oCht = xlApp.Charts",
        "oCht.Add() ",
        "Set oCht = oCht(1)",
        "oCht.paste",
        "oCht.Export \"C:\\rworking\\test\\Test.jpg\", \"JPG\""), 
        fileConn)
    
    close(fileConn)
    
    shell.exec("c:/rworking/test/test.vbs")
    

    【讨论】:

      【解决方案3】:

      嗯,不确定是否发布,也许它通过 Ian 的帖子变得多余。它有点通用,但我也可以删除它。

      library(xlsx)
      
      OutputPicFileName <- "Chart.jpg"
      ScriptFileName <- "Chart.vbs"
      xclFileName <- "test_import.xlsx"
      xclRng <- "A8:J36"
      file <- system.file("tests", xclFileName, package = "xlsx")
      fileDirec <- unlist(strsplit(file, xclFileName))
      
      CreateChart <- function(fileDirec, OutputPicFileName, ScriptFileName, xclRng){
        setwd(fileDirec)
        filePath <- file(paste0(fileDirec, ScriptFileName))
        writeLines(
          c(
            "Dim App, WBook, Sht, Rng, FileName, ChartObj, Chart",
             paste0("FileName = \"", gsub("/", "\\\\", fileDirec), xclFileName ,"\""),
             "Set App = CreateObject(\"Excel.Application\")",
             "Set WBook = App.WorkBooks.Open(FileName)",
             "Set Sht = App.Worksheets(1)",
             paste0("Set Rng = Sht.Range(\"", xclRng,"\")"),
             "Rng.CopyPicture",
             "Set ChartObj = App.Charts",
             "Set Chart = ChartObj.Add() ",
             "Chart.paste",
             paste0("Chart.Export \"", gsub("/", "\\\\", fileDirec) , OutputPicFileName ,"\", \"JPG\"")
          ), 
          filePath
        )
        close(filePath)
        shell.exec(ScriptFileName)
      }
      
      CreateChart(fileDirec, OutputPicFileName, ScriptFileName, xclRng)
      
      # Result in: fileDirec
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-07
        • 2018-07-25
        • 2017-11-09
        • 2021-06-16
        • 1970-01-01
        • 1970-01-01
        • 2021-08-26
        • 2023-03-25
        相关资源
        最近更新 更多