Пишите из R в шаблон в Excel, сохраняя при этом форматирование
У меня есть датафреймы в R, которые хотят писать в excel (или csv) и выводить в хорошем формате (например, с рамкой, заголовком таблицы, не начиная с ячейки A1).
В настоящее время я использую функцию write.table, чтобы записать свои фреймы данных в CSV-файл, а затем копирую и вставляю свои данные в документ Excel, где мои готовые таблицы отформатированы в качестве шаблона.
Это не главная проблема, когда это только один фрейм данных, но теперь я хочу сделать это для нескольких фреймов данных и разместить их на нескольких вкладках в Excel.
Есть ли способ, с помощью которого я могу автоматически копировать свои кадры данных в определенные ячейки в существующей электронной таблице Excel с правильно установленным форматированием?
3 ответа
Как сказал Джоран, у вас есть пакет 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)
До
После
РЕДАКТИРОВАТЬ: Как отметил Дирк Эддельбюттель, вы можете сделать то же самое, используя xlsx
пакет. Я лично пользуюсь XLConnect
так как он может обрабатывать как xls, так и xlsx, и кажется намного более стабильным, чем любой из старых пакетов, которые я использовал для манипулирования файлами EXCEL. Я не использовал xlsx
Пакет еще. Вы можете взглянуть на страницу CRAN в разделе Импорт / экспорт данных, чтобы узнать, что доступно.
Вот функция, основанная на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
:
Некоторые пользователи спрашивали, как это сделать с помощью пакета.
Есть очень хороший и обширный пример использования
xlsx
пакет в STHDA.
В нем есть примеры форматирования ячеек, книги с несколькими листами, способы добавления фигур и т. Д.