Print/save Excel (.xlsx) sheet 使用 R 转为 PDF
Print/save Excel (.xlsx) sheet to PDF using R
我想在操作后将 Excel
文件打印到 pdf
文件。对于操作,我使用了 .xlsx
包,效果很好。有一个函数 printSetup
但我找不到开始打印的函数。有解决办法吗?
library(xlsx)
file <- "test.xlsx"
wb <- loadWorkbook(file)
sheets <- getSheets(wb) # get all sheets
sheet <- sheets[[1]] # get first sheet
# HERE: MAGIC TO SAVE THIS SHEET TO PDF
这可能是通过 RDCOMClient
包使用 DCOM 的解决方案,尽管我在 MacOS 上工作时更喜欢独立于平台的解决方案(例如使用 xlsx
)。有什么想法吗?
您可以使用 pdf 功能:
pdf(文件="myfile.pdf", 宽度=8.5, 高度=11)
打印(第一页)
grid.newpage()
打印(第二页)
grid.newpage()
打印(第三页)
dev.off()
下面是通过 RDCOMClient
使用 DCOM
界面的解决方案。这不是我的首选解决方案,因为它仅适用于 Windows。平台独立的解决方案仍然会受到赞赏。
library(RDCOMClient)
library(R.utils)
file <- "file.xlsx" # relative path to Excel file
ex <- COMCreate("Excel.Application") # create COM object
file <- getAbsolutePath(file) # convert to absolute path
book <- ex$workbooks()$Open(file) # open Excel file
sheet <- book$Worksheets()$Item(1) # pointer to first worksheet
sheet$Select() # select first worksheet
ex[["ActiveSheet"]]$ExportAsFixedFormat(Type=0, # export as PDF
Filename="my.pdf",
IgnorePrintAreas=FALSE)
ex[["ActiveWorkbook"]]$Save() # save workbook
ex$Quit() # close Excel
一种开源和跨平台的方法是使用 libreoffice,如下所示:
library("XLConnect")
x <- rnorm(1:100)
y <- x ^ 2
writeWorksheetToFile("test.xlsx", data.frame(x = x, y = y), "Data")
tmpDir <- file.path(tempdir(), "LOConv")
system2("libreoffice", c(paste0("-env:UserInstallation=file://", tmpDir), "--headless", "--convert-to pdf",
"--outdir", getwd(), file.path(getwd(),"test.xlsx")))
理想情况下,您随后会删除 tmpDir 引用的文件夹,但这将是特定于平台的。
请注意,这假定 libreoffice 在您的路径中。如果不是,则需要更改命令以包含 libreoffice 可执行文件的完整路径。
设置 env 位的原因是无头 libreoffice 只会在尚未 运行 处于 GUI 模式时才会执行任何其他操作。有关详细信息,请参阅 http://ask.libreoffice.org/en/question/1686/how-to-not-connect-to-a-running-instance/。
我想在操作后将 Excel
文件打印到 pdf
文件。对于操作,我使用了 .xlsx
包,效果很好。有一个函数 printSetup
但我找不到开始打印的函数。有解决办法吗?
library(xlsx)
file <- "test.xlsx"
wb <- loadWorkbook(file)
sheets <- getSheets(wb) # get all sheets
sheet <- sheets[[1]] # get first sheet
# HERE: MAGIC TO SAVE THIS SHEET TO PDF
这可能是通过 RDCOMClient
包使用 DCOM 的解决方案,尽管我在 MacOS 上工作时更喜欢独立于平台的解决方案(例如使用 xlsx
)。有什么想法吗?
您可以使用 pdf 功能:
pdf(文件="myfile.pdf", 宽度=8.5, 高度=11)
打印(第一页)
grid.newpage()
打印(第二页)
grid.newpage()
打印(第三页)
dev.off()
下面是通过 RDCOMClient
使用 DCOM
界面的解决方案。这不是我的首选解决方案,因为它仅适用于 Windows。平台独立的解决方案仍然会受到赞赏。
library(RDCOMClient)
library(R.utils)
file <- "file.xlsx" # relative path to Excel file
ex <- COMCreate("Excel.Application") # create COM object
file <- getAbsolutePath(file) # convert to absolute path
book <- ex$workbooks()$Open(file) # open Excel file
sheet <- book$Worksheets()$Item(1) # pointer to first worksheet
sheet$Select() # select first worksheet
ex[["ActiveSheet"]]$ExportAsFixedFormat(Type=0, # export as PDF
Filename="my.pdf",
IgnorePrintAreas=FALSE)
ex[["ActiveWorkbook"]]$Save() # save workbook
ex$Quit() # close Excel
一种开源和跨平台的方法是使用 libreoffice,如下所示:
library("XLConnect")
x <- rnorm(1:100)
y <- x ^ 2
writeWorksheetToFile("test.xlsx", data.frame(x = x, y = y), "Data")
tmpDir <- file.path(tempdir(), "LOConv")
system2("libreoffice", c(paste0("-env:UserInstallation=file://", tmpDir), "--headless", "--convert-to pdf",
"--outdir", getwd(), file.path(getwd(),"test.xlsx")))
理想情况下,您随后会删除 tmpDir 引用的文件夹,但这将是特定于平台的。
请注意,这假定 libreoffice 在您的路径中。如果不是,则需要更改命令以包含 libreoffice 可执行文件的完整路径。
设置 env 位的原因是无头 libreoffice 只会在尚未 运行 处于 GUI 模式时才会执行任何其他操作。有关详细信息,请参阅 http://ask.libreoffice.org/en/question/1686/how-to-not-connect-to-a-running-instance/。