将多个data.frame导出到多个Excel工作表的简便方法

时间:2014-12-30 22:10:32

标签: r excel xlsx

我很惊讶地发现没有简单的方法将多个data.frame导出到Excel文件的多个工作表中?我试过 xlsx 包,似乎只能写一张(覆盖旧表);我也试过 WriteXLS 包,但它一直给我错误...

我的代码结构是这样的:按照设计,对于每次迭代,输出数据帧(tempTable)和sheetName(sn)都已更新并导出到一个选项卡中。

for (i in 2 : ncol(code)){ 
        ...
        tempTable <- ...
        sn <- ...
        WriteXLS("tempTable", ExcelFileName = "C:/R_code/../file.xlsx",
              SheetNames = sn);
}

我可以导出到几个cvs文件,但是必须有一种简单的方法在Excel中执行此操作,对吧?

13 个答案:

答案 0 :(得分:108)

您可以使用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-easily-excel-files-using-r-software

答案 1 :(得分:48)

您还可以使用openxlsx库将多个数据集导出到单个工作簿中的多个工作表.opexxlsx优于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")

答案 2 :(得分:17)

镇上有一个新图书馆,来自rOpenSci:writexl

  

基于xlsx导出器的便携式轻量级数据框架   libxlsxwriter。不需要Java或Excel

我发现它比上述建议更好,更快(使用开发版):

q

答案 3 :(得分:9)

这里有许多好的答案,但其中一些有点过时了。如果您想将更多工作表添加到单个文件中,那么这就是我觉得适合我的方法。为清楚起见,这是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的所有功能,但是如果你想要一个快速简便的导出方法,那么这可能是最直接的。

答案 4 :(得分:7)

我不熟悉包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文件,但是如果你的文件已经存在,那么你不必指定它,因为默认值是{ {1}}。

以下是创建的工作簿的一些屏幕截图:

enter image description here

enter image description here

enter image description here

答案 5 :(得分:4)

包含数据量很小,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中的一些实用程序。

注意:您的系统上未安装Incase 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堆内存。

答案 6 :(得分:2)

我遇到了这个确切的问题,并以此方式解决了该问题:

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的数据框,则无需手动创建很长的列表。

答案 7 :(得分:2)

我经常使用打包的rio进行各种导出。使用rio,您可以输入一个列表,命名每个选项卡并指定数据集。 rio编译其他输入/输出程序包,并使用openxlsx导出到Excel,

library(rio)

filename <- "C:/R_code/../file.xlsx"

export(list(sn1 = tempTable1, sn2 = tempTable2, sn3 = tempTable3), filename)

答案 8 :(得分:0)

对我来说,WriteXLS提供了您正在寻找的功能。由于您未指定返回的错误,因此我向您展示了一个示例:

示例

library(WriteXLS)
x <- list(sheet_a = data.frame(a=letters), sheet_b = data.frame(b = LETTERS))
WriteXLS(x, "test.xlsx", names(x))

<强>解释

如果x是:

  • 数据框列表,每个数据框都写入一张表
  • 一个字符向量(R对象),每个对象都写入一张表
  • 别的东西,然后另见帮助陈述:

有关使用情况的更多信息

?WriteXLS

所示:

`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

会话信息

  • R 3.2.4
  • WriteXLS 4.0.0

答案 9 :(得分:0)

我使用以下函数

以这种方式为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)
}

答案 10 :(得分:0)

我一直这样做,我要做的只是

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)
}

显然,在这里套用例行程序会更好

答案 11 :(得分:0)

适用于讨厌的版本。

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")

答案 12 :(得分:0)

采用一个数据框并按组编写工作表的整洁方式:

library(tidyverse)
library(xlsx)
mtcars %>% 
  mutate(cyl1 = cyl) %>% 
  group_by(cyl1) %>% 
  nest() %>% 
  ungroup() %>% 
  mutate(rn = row_number(),
         app = rn != 1,
         q = pmap(list(rn,data,app),~write.xlsx(..2,"test1.xlsx",as.character(..1),append = ..3)))