Я удивлен, обнаружив, что нет простого способа экспортировать несколько data.frame на несколько листов файла Excel? Я пробовал пакет xlsx , кажется, он может писать только на один лист (переопределить старый лист); Я также пробовал пакет WriteXLS , но он все время выдает ошибку ...
Моя структура кода такова: по замыслу, для каждой итерации выходной фрейм данных (tempTable) и имя листа (sn) обновлялись и экспортировались в одну вкладку.
for (i in 2 : ncol(code)){
...
tempTable <- ...
sn <- ...
WriteXLS("tempTable", ExcelFileName = "C:/R_code/../file.xlsx",
SheetNames = sn);
}
Я могу экспортировать в несколько файлов cvs, но должен быть простой способ сделать это в Excel, верно?
createSheet
функция, которая позволяет вам создавать новые листы, а затем записывать на них в цикле. Кроме того, эквивалентные функции в XLConnect векторизованы, что позволяет записывать список фреймов данных на несколько листов.Ответы:
Вы можете писать на нескольких листах с
xlsx
пакетом. Вам просто нужно использовать разныеsheetName
для каждого фрейма данных, и вам нужно добавитьappend=TRUE
:library(xlsx) write.xlsx(dataframe1, file="filename.xlsx", sheetName="sheet1", row.names=FALSE) write.xlsx(dataframe2, file="filename.xlsx", sheetName="sheet2", append=TRUE, row.names=FALSE)
Другой вариант, который дает вам больше контроля над форматированием и местом размещения фрейма данных, - это делать все в рамках кода R / xlsx, а затем сохранять книгу в конце. Например:
wb = createWorkbook() sheet = createSheet(wb, "Sheet 1") addDataFrame(dataframe1, sheet=sheet, startColumn=1, row.names=FALSE) addDataFrame(dataframe2, sheet=sheet, startColumn=10, row.names=FALSE) sheet = createSheet(wb, "Sheet 2") addDataFrame(dataframe3, sheet=sheet, startColumn=1, row.names=FALSE) saveWorkbook(wb, "My_File.xlsx")
Если вы сочтете это полезным, вот несколько интересных вспомогательных функций, которые упрощают добавление форматирования, метаданных и других функций в электронные таблицы, используя
xlsx
: http://www.sthda.com/english/wiki/r2excel-read-write -and-format-easy-excel-files-using-r-softwareисточник
xlsx
не заботится о числах в первой строке R.openxlsx
удалить их.row.names=FALSE
чтобы удалить имена строк.xlsx
наopenxlsx
некоторое время назад, так как считаю его гораздо более интуитивным, а также позволяет избежать зависимости от java.openxlsx
версией 4.0 см. Мой дополнительный ответ ниже.Вы также можете использовать библиотеку openxlsx для экспорта нескольких наборов данных на несколько листов в одной книге. Преимущество openxlsx над xlsx заключается в том, что openxlsx удаляет зависимости от библиотек java.
Напишите список data.frames на отдельные рабочие листы, используя имена списков в качестве имен рабочих листов.
require(openxlsx) list_of_datasets <- list("Name of DataSheet1" = dataframe1, "Name of Datasheet2" = dataframe2) write.xlsx(list_of_datasets, file = "writeXLSX2.xlsx")
источник
openxlsx
это самый быстрый, как его C ++.XlConnect
съест вашу оперативную память. Возможно, вы захотите провести сравнительный анализ междуxlsx
иopenxlsx
openxlsx::write.xlsx
это способ пойти ... Я сохранял 11 листов, каждый из которых представлял собой фрейм данных 20,000x10, готово за пару секунд, пока былxlsx::write.xlsx
ошибкой после добавления второго листа сjava.lang.OutOfMemoryError: Java heap space
append=TRUE
в write.xlsx, чтобы он записывал сразу несколько листов в один файл Excellist_of_dfs <- list()
), а затем заполнить его, используя temp_key и temp_df, созданные во время цикла (list_of_dfs[[temp_key]] = temp_df
). Это было также очень быстро в написании, несмотря на то, что мне нужно было создать 16 листов! Кто-нибудь был свидетелем проблем с памятью при создании?В городе появилась новая библиотека от rOpenSci: writexl
Я нашел это лучше и быстрее, чем приведенные выше предложения (работа с версией для разработчиков):
library(writexl) sheets <- list("sheet1Name" = sheet1, "sheet2Name" = sheet2) #assume sheet1 and sheet2 are data frames write_xlsx(sheets, "path/to/location")
источник
Здесь много хороших ответов, но некоторые из них немного устарели. Если вы хотите добавить дополнительные рабочие листы в один файл, то этот подход, который я считаю, работает для меня. Для наглядности вот рабочий процесс для
openxlsx
версии 4.0# Create a blank workbook OUT <- createWorkbook() # Add some sheets to the workbook addWorksheet(OUT, "Sheet 1 Name") addWorksheet(OUT, "Sheet 2 Name") # Write the data to the sheets writeData(OUT, sheet = "Sheet 1 Name", x = dataframe1) writeData(OUT, sheet = "Sheet 2 Name", x = dataframe2) # Export the file saveWorkbook(OUT, "My output file.xlsx")
РЕДАКТИРОВАТЬ
Теперь я попробовал несколько других ответов, и мне действительно нравится @Syed. Он не использует все функциональные возможности,
openxlsx
но если вам нужен быстрый и простой метод экспорта, то это, вероятно, самый простой способ.источник
Я не знаком с пакетом
WriteXLS
; Обычно я используюXLConnect
:library(XLConnect) ## newWB <- loadWorkbook( filename="F:/TempDir/tempwb.xlsx", create=TRUE) ## for(i in 1:10){ wsName <- paste0("newsheet",i) createSheet( newWB, name=wsName) ## writeWorksheet( newWB, data=data.frame( X=1:10, Dataframe=paste0("DF ",i)), sheet=wsName, header=TRUE, rownames=NULL) } saveWorkbook(newWB)
Это, безусловно, можно векторизовать, как отметил @joran выше, но просто для быстрого создания динамических имен листов я использовал
for
цикл для демонстрации.Я использовал
create=TRUE
аргумент в,loadWorkbook
поскольку я создавал новый файл .xlsx, но если ваш файл уже существует, вам не нужно указывать его, поскольку это значение по умолчаниюFALSE
.Вот несколько скриншотов созданной книги:
источник
Если размер данных невелик, в R есть много пакетов и функций, которые можно использовать в соответствии с вашими требованиями.
write.xlsx, write.xlsx2, XLconnect также выполняют свою работу, но иногда они медленнее по сравнению с openxlsx .
Итак, если вы имеете дело с большими наборами данных и сталкивались с ошибками java. Я бы посоветовал взглянуть на "openxlsx", который действительно потрясающий, и сократить время до 1/12 .
Я протестировал все и, наконец, был действительно впечатлен производительностью возможностей openxlsx.
Вот шаги для записи нескольких наборов данных на несколько листов.
install.packages("openxlsx") library("openxlsx") start.time <- Sys.time() # Creating large data frame x <- as.data.frame(matrix(1:4000000,200000,20)) y <- as.data.frame(matrix(1:4000000,200000,20)) z <- as.data.frame(matrix(1:4000000,200000,20)) # Creating a workbook wb <- createWorkbook("Example.xlsx") Sys.setenv("R_ZIPCMD" = "C:/Rtools/bin/zip.exe") ## path to zip.exe
Sys.setenv ("R_ZIPCMD" = "C: /Rtools/bin/zip.exe") должен быть статическим, так как он принимает ссылку на некоторую утилиту из Rtools.
Примечание. Если в вашей системе не установлен Rtools, сначала установите его для бесперебойной работы. вот ссылка для справки: (выберите подходящую версию)
https://cran.r-project.org/bin/windows/Rtools/ проверьте параметры по ссылке ниже (необходимо установить все флажки во время установки)
https://cloud.githubusercontent.com/assets/7400673/12230758/99fb2202-b8a6-11e5-82e6-836159440831.png
# Adding a worksheets : parameters for addWorksheet are 1. Workbook Name 2. Sheet Name addWorksheet(wb, "Sheet 1") addWorksheet(wb, "Sheet 2") addWorksheet(wb, "Sheet 3") # Writing data in to respetive sheets: parameters for writeData are 1. Workbook Name 2. Sheet index/ sheet name 3. dataframe name writeData(wb, 1, x) # incase you would like to write sheet with filter available for ease of access you can pass the parameter withFilter = TRUE in writeData function. writeData(wb, 2, x = y, withFilter = TRUE) ## Similarly writeDataTable is another way for representing your data with table formatting: writeDataTable(wb, 3, z) saveWorkbook(wb, file = "Example.xlsx", overwrite = TRUE) end.time <- Sys.time() time.taken <- end.time - start.time time.taken
Пакет openxlsx действительно хорош для чтения и записи огромных данных из / в файлы Excel и имеет множество опций для пользовательского форматирования в Excel.
Интересным фактом является то, что нам не нужно беспокоиться о памяти кучи java здесь.
источник
У меня была именно такая проблема, и я решил ее так:
library(openxlsx) # loads library and doesn't require Java installed your_df_list <- c("df1", "df2", ..., "dfn") for(name in your_df_list){ write.xlsx(x = get(name), file = "your_spreadsheet_name.xlsx", sheetName = name) }
Таким образом, вам не придется вручную создавать очень длинный список, если у вас есть масса фреймов данных для записи в Excel.
источник
Я регулярно использую упакованный рио для экспорта всех видов. Используя rio, вы можете ввести список, назвав каждую вкладку и указав набор данных. rio компилирует другие пакеты ввода / вывода и для экспорта в Excel использует openxlsx.
library(rio) filename <- "C:/R_code/../file.xlsx" export(list(sn1 = tempTable1, sn2 = tempTable2, sn3 = tempTable3), filename)
источник
На мой
WriteXLS
взгляд , предоставляет функциональность, которую вы ищете. Поскольку вы не указали, какие ошибки он возвращает, я покажу вам пример:пример
library(WriteXLS) x <- list(sheet_a = data.frame(a=letters), sheet_b = data.frame(b = LETTERS)) WriteXLS(x, "test.xlsx", names(x))
Объяснение
Если
x
это:Подробнее об использовании
показывает:
`x`: A character vector or factor containing the names of one or more R data frames; A character vector or factor containing the name of a single list which contains one or more R data frames; a single list object of one or more data frames; a single data frame object.
Решение
В вашем примере вам нужно будет собрать все data.frames в списке во время цикла и использовать
WriteXLS
после завершения цикла.Информация о сеансе
источник
xlsx
), поскольку это затрудняет настройкуЯ делаю это для openxlsx, используя следующую функцию
mywritexlsx<-function(fname="temp.xlsx",sheetname="Sheet1",data, startCol = 1, startRow = 1, colNames = TRUE, rowNames = FALSE) { if(! file.exists(fname)) wb = createWorkbook() else wb <- loadWorkbook(file =fname) sheet = addWorksheet(wb, sheetname) writeData(wb,sheet,data,startCol = startCol, startRow = startRow, colNames = colNames, rowNames = rowNames) saveWorkbook(wb, fname,overwrite = TRUE) }
источник
Я делаю это все время, все, что я делаю, это
WriteXLS::WriteXLS( all.dataframes, ExcelFileName = xl.filename, AdjWidth = T, AutoFilter = T, FreezeRow = 1, FreezeCol = 2, BoldHeaderRow = T, verbose = F, na = '0' )
и все эти фреймы данных берутся отсюда
all.dataframes <- vector() for (obj.iter in all.objects) { obj.name <- obj.iter obj.iter <- get(obj.iter) if (class(obj.iter) == 'data.frame') { all.dataframes <- c(all.dataframes, obj.name) }
очевидно, что здесь лучше бы слаженная рутина
источник
для дружественной по-ласки версии ..
library(data.table) library(xlsx) path2txtlist <- your.list.of.txt.files wb <- createWorkbook() lapply(seq_along(path2txtlist), function (j) { sheet <- createSheet(wb, paste("sheetname", j)) addDataFrame(fread(path2txtlist[j]), sheet=sheet, startColumn=1, row.names=FALSE) }) saveWorkbook(wb, "My_File.xlsx")
источник