如何从R中将Excel工作表范围导出到图片

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

我们有Excel文件寻找我们想要他们的方式,但现在需要制作一个JPG或PNG图片副本的Excel表格,以方便networking发布。

我们已经使用了library(xlsx)包来处理R和Excel之间的大部分交互,看起来我们应该能够通过类似于?.jmethods方式发送特定的java命令,但是我们不知道如何传递尽可能多的行因为我们需要。

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

这里是一个范例Excel文件的例子

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

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

 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 

任何帮助自动化这将不胜感激!

考虑让R完全像VBA那样在你的macros中做:做一个到Excel对象库的COM接口。 你可以使用RDCOMClient包来完成,在R语法中保留与macros相同的代码。

 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() 

输出 (随机数据/图表)

数据和图表输出图像

你可以用vbs来做到这一点。 大多数vbs与vba是一样的,所以你可以写出你的dynamicvbs脚本,其中包括你的macros作为文本,然后用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") 

嗯,不知道发布,也许它通过伊恩的职位是多余的。 它更通用一些,但我也可以删除它。

 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 

Chart.jpg