Пишите из 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.

В нем есть примеры форматирования ячеек, книги с несколькими листами, способы добавления фигур и т. Д.

Другие вопросы по тегам