如何从 R 中导出 Excel sheet 范围到图片
How to export an Excel sheet range to a picture, from within R
我们正在尝试在 R
脚本中自动创建一些图片文件。
我们有 Excel 文件以我们希望的方式显示,但现在需要制作这些 excel 表格的 JPG 或 PNG 图片副本以便于网络发布。
我们在 R
和 Excel 之间的大部分交互中一直使用 library(xlsx)
包,看起来我们应该能够通过 ?.jmethods
之类的方式发送特定的 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
如能提供自动化帮助,我们将不胜感激!
你可以用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")
嗯,不确定 posting,也许它通过 Ian 的 post 变得多余了。它有点通用,但我也可以删除它。
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
考虑让 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()
输出(随机data/chart)
我们正在尝试在 R
脚本中自动创建一些图片文件。
我们有 Excel 文件以我们希望的方式显示,但现在需要制作这些 excel 表格的 JPG 或 PNG 图片副本以便于网络发布。
我们在 R
和 Excel 之间的大部分交互中一直使用 library(xlsx)
包,看起来我们应该能够通过 ?.jmethods
之类的方式发送特定的 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
如能提供自动化帮助,我们将不胜感激!
你可以用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")
嗯,不确定 posting,也许它通过 Ian 的 post 变得多余了。它有点通用,但我也可以删除它。
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
考虑让 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()
输出(随机data/chart)