【问题标题】:how to loop through multiple dataframes and write into multiple sheets of excel in R?如何遍历多个数据框并在 R 中写入多张 excel 表?
【发布时间】:2021-05-20 16:19:38
【问题描述】:

我想使用循环写入多张 Excel 表格。代码如下。

first_column <- c("value_1", "value_2")
second_column <- c("ve_1", "ve_2")

fir_column <- c("1", "2")
se_column <- c("a1", "va2")

df <- data.frame(first_column, second_column) #sheet A of df.xlsx
df1 <- data.frame(fir_column, se_column) #sheet B of df.xlsx

sheets<-openxlsx::getSheetNames('./Out/df.xlsx')

for(i in 1:length(sheets)){
  
  df<-read_excel('./Out/df.xlsx',sheet = sheets[i])
  
  write.xlsx(df, './Out/df1.xlsx', sheetName = i, append=TRUE)
}

只生成最后一张纸。

【问题讨论】:

  • 这对我有用,除了sheetName 必须是字符串(例如as.character(i))。添加一些逻辑以删除输出的 Excel 工作簿(如果它已经存在(否则重写将引发错误)或在第一次迭代时使用 append = F)可能是个好主意。
  • 即使在添加 as.character(i) 并删除附加后,仅生成最后一张表
  • 你的xlsx的包版本是多少?正如我提到的,这对我有用,但是您发布的代码不应运行,因为i 是数字,sheetName 必须是字符。因此,您发布的代码会引发错误。您是否尝试在运行此代码之前清除环境?
  • xlsx package 正在抛出一些 javaerror,所以我使用的是 openxlsx - 4.2.3 。 @LMc
  • javaerror 是因为i 是数字或dftibble。尝试使用 xlsx::write.xlsx 和参数 sheetName = as.character(i)。此外,read_excel 返回一个tibble。因此,如果您在使用 xlsx 时仍然遇到错误,请尝试使用 as.data.frame(df)openxlsx::write.xlsx 没有 append 参数,并且具有用于编写多张工作表的不同语法。

标签: r excel


【解决方案1】:

使用您的代码(注意路径名略有编辑):

library(xlsx)
library(readxl)

sheets<-openxlsx::getSheetNames('./df.xlsx')

for(i in 1:length(sheets)){
  
  df<-readxl::read_excel('./df.xlsx',sheet = sheets[i])
  
  appendSheet <- i > 1
  
  # depending on version might need to do as.data.frame(df)
  xlsx::write.xlsx(df, './df1.xlsx', sheetName = as.character(i), append=appendSheet)
}

或者openxlsx:

library(readxl)
library(openxlsx)

sheets<-openxlsx::getSheetNames('./df.xlsx')

wb <- createWorkbook()

for(i in 1:length(sheets)){
  
  df<-readxl::read_excel('./df.xlsx',sheet = sheets[i])
  
  addWorksheet(wb, i)
  writeData(wb, i, df)
}

saveWorkbook(wb, "df1.xlsx", overwrite = T)

或者,您可以将工作表用作列表元素,让您可以使用 apply 系列函数轻松处理每个元素:

library(rio)
library(writexl)

list_of_dfs <- import_list("df.xlsx") # from rio
write_xlsx(list_of_dfs, "df1.xlsx") # from writexl

【讨论】:

    猜你喜欢
    • 2019-03-23
    • 2015-01-15
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多