Подтвердить что ты не робот

Как экспортировать диапазон листов Excel в изображение, изнутри R

Мы пытаемся автоматизировать создание некоторых файлов изображений в R Script.

У нас есть файлы Excel, которые выглядят так, как мы хотим, но теперь вам нужно сделать JPG или PNG-копию этих таблиц excel для упрощения веб-публикации.

Мы использовали пакет library(xlsx) для большинства наших взаимодействий между R и Excel, и похоже, что мы можем отправлять определенные команды java через что-то вроде ?.jmethods но неясно, как мы будем передавать столько строк, сколько нам нужно.

В сеансе 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

Любая помощь, автоматизирующая это, будет высоко оценена!

4b9b3361

Ответ 1

Считайте, что R делает именно то, что VBA делает в вашем макросе: создание COM-интерфейса в библиотеке объектов Excel. Вы можете сделать это с помощью пакета 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 script, которые включают ваш макрос в виде текста, а затем вызывают его с помощью оболочки.

Вот рабочий пример:

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

Хм, не уверен в публикации, возможно, он стал лишним через пост Яна. Это немного более общий, но я также могу удалить его.

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