目前我使用write.table函数将我的数据框写入CSV文件,然后将数据复制并粘贴到Excel文档中,其中我已经准备好了格式为模板的表格。
当只有一个数据框时,这不是什么大问题,但现在我想为多个数据框执行此操作,并在Excel中跨多个选项卡中显示这些数据。
是否有一种方法可以自动将我的数据框复制到现有Excel电子表格中的特定单元格,并正确设置所有格式?
正如Joran所说,您可以使用XLConnect软件包。 请仔细阅读该软件包的文档或指南,以确切了解其可行性。
通常情况下,使用XLConnect会覆盖单元格样式,除非您使用“none”作为样式操作来设置样式动作。
setStyleAction(wb,XLC$"STYLE_ACTION.NONE")
为了让您走上正确的道路,这是一个简单的例子:
require(XLConnect)
wb <- loadWorkbook("test.xlsx", create=TRUE)
setStyleAction(wb,XLC$"STYLE_ACTION.NONE")
Data <- data.frame(
a = 1:10,
b = letters[1:10]
)
writeWorksheet(wb,Data,"aSheet",startRow=1,startCol=1,header=TRUE)
saveWorkbook(wb)
之前
之后
编辑:如 Dirk Eddelbuettel 所指出,您也可以使用 xlsx
包达到相同的效果。我个人使用 XLConnect
,因为它可以处理 xls 和 xlsx 文件,并且比我用来处理 EXCEL 文件的任何旧包都要稳定得多。我还没有使用过 xlsx
包。您可以查看CRAN 数据导入/导出页面了解可用选项。
R
到.xlsx
文件的写作,并且更喜欢openxlsx
包而不是xlsx
。我的理由是我经常遇到操作系统(64位)难以轻松与rjava
(xlsx
的依赖项)配合使用的问题。openxlx
不需要rJava
,这在当时使我的生活变得更加容易。 - Stevenxlsx
包中实现? - pajonk这里有一个基于openxlsx
的函数,您可以在其中指定包含样式的工作簿(from_wb
)和工作表名称/位置(from_sheet
),以及要传输样式的工作簿(to_wb
)和工作表名称/位置(to_sheet
):
注意:我还使用了purrr
和glue
软件包,但这可以用基本R重新编写。
copyStyle <- function(from_wb, to_wb, from_sheet, to_sheet) {
# check for workbook objects
if (!(inherits(from_wb, "Workbook") && inherits(to_wb, "Workbook"))) {
stop("from_wb and to_wb must be Workbook objects.")
}
# get all sheet names from workbooks
from_sheets <- from_wb$sheet_names
to_sheets <- to_wb$sheet_names
# convert sheets from numeric to sheet name. wb$styleObjects uses sheet name
if (is.numeric(from_sheet)) {
from_sheet <- from_wb$getSheetName(from_sheet)
}
if (is.numeric(to_sheet)) {
to_sheet <- to_wb$getSheetName(to_sheet)
}
# if sheet name given check that it exists
if (is.character(from_sheet) && !from_sheet %in% from_sheets) {
stop(glue::glue("{from_sheet} was not found in from_wb"))
}
if (is.character(to_sheet) && !to_sheet %in% to_sheets) {
stop(glue::glue("{to_sheet} was not found in to_wb"))
}
# get from_wb sheet styles
from_styles <- purrr::keep(from_wb$styleObjects, ~ .x$sheet == from_sheet)
# add styles to to_wb
purrr::walk(from_styles, ~ openxlsx::addStyle(to_wb,
to_sheet,
.x$style,
rows = .x$rows,
cols = .x$cols))
return(to_wb)
}
使用方法
library(openxlsx)
wb <- loadWorkbook("getStyle.xlsx")
new_wb <- write.xlsx(head(iris), "transfer_style.xlsx")
# can give sheet name or index
copyStyle(from_wb = wb, to_wb = new_wb, from_sheet = "Sheet1", to_sheet = 1)
# must save workbook after copying style
saveWorkbook(new_wb, "transfer_style.xlsx", overwrite = T)
输入
getStyles.xlsx
是一个本地的 Excel 工作簿,其中包含多个工作表上的多个样式:
输出
transfer_styles.xlsx
:
?setStyleAction
。 - joran