首页 文章

R:将多个data.frame导出到多个excel工作表的简便方法?

提问于
浏览
47

我很惊讶地发现没有简单的方法将多个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中必须有一个简单的方法,对吧?

提前致谢 .

8 回答

  • 3

    您可以使用 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")
    

    如果你发现它有用,这里有一些有趣的辅助函数,可以更容易地使用 xlsxhttp://www.sthda.com/english/wiki/r2excel-read-write-and-format-easily-excel-files-using-r-software向电子表格添加格式,元数据和其他功能 .

  • 0

    您还可以使用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")
    
  • 7

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

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

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

    library(writexl)
    sheets <- list("sheet1Name" = sheet1, "sheet2Name" = sheet2) #assume sheet1 and sheet2 are data frames
    write_xlsx(sheets, "path/to/location")
    
  • 45

    我不熟悉包 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 循环来演示 .

    我在 loadWorkbook 中使用了 create=TRUE 参数,因为我创建了一个新的.xlsx文件,但是如果你的文件已经存在,那么你不必指定它,因为默认值是 FALSE .

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

    enter image description here

    enter image description here

    enter image description here

  • 10

    这里有很多好的答案,但其中一些有点过时了 . 如果您想将更多工作表添加到单个文件中,那么这就是我觉得适合我的方法 . 为清楚起见,这是 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")
    

    编辑

    我've now trialled a few other answers, and I actually really like @Syed' . 它没有利用 openxlsx 的所有功能,但如果你想要一个快速简便的导出方法,那么这可能是最直接的 .

  • 95

    Incase数据量很小,R有许多包和功能,可根据您的要求使用 .

    write.xlsx, write.xlsx2, XLconnect 也做了工作,但这些有时 slowopenxlsx 比较 .

    所以,如果你正在处理大型数据集并遇到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

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

    Example

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

    Explanation

    如果 x 是:

    • 数据框列表,每个数据框都写入一个工作表

    • 一个字符向量(R对象),每个对象被写入一个工作表

    • 别的东西,然后看看帮助说明:

    More on usage

    ?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.
    

    Solution

    举个例子,你会的需要在循环期间收集列表中的所有data.frames,并在循环结束后使用 WriteXLS .

    Session info

    • R 3.2.4

    • WriteXLS 4.0.0

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

相关问题