如何用openxlsx将数据写入带自定义解析名称的Excel多工作表
解决openxlsx生成自定义工作表名的多页Excel问题
因为机构Java环境限制,只能用openxlsx库处理Excel文件。目前通过以下代码读取txt文件生成数据框列表data_list,但列表元素默认命名为1、2、3:
file_list <- list.files(path = mypath, pattern = "*.txt") # 读取数据到数据框列表 data_list <- lapply(file_list, read.delim,quote = "", header = FALSE, col.names = c("Count", "TaxID", "Organism Name"))
data_list结构示例:
> data_list $`1` Count TaxID Organism.Name 1 1 644 Aeromonas hydrophila $`2` Count TaxID Organism.Name 1 151263 624 Shigella sonnei 2 97868 644 Aeromonas hydrophila 3 91121 1639 Listeria monocytogenes 4 8352 43767 Rhodococcus hoagii $`3` Count TaxID Organism.Name 1 92975 644 Aeromonas hydrophila 2 16989 624 Shigella sonnei 3 35 1639 Listeria monocytogenes
遇到的问题:
- 循环创建自定义名称工作表时,无法写入数据:
library(openxlsx) wb <- createWorkbook() for (i in seq_along(data_list)) { mysheetname <- strsplit(file_list[i], "_")[[1]][1:4] mysheetname <- paste(mysheetname, collapse = "_") addWorksheet(wb, sheetName = mysheetname) } saveWorkbook(wb, "plate2_organismAbundance.xlsx")
- 用
write.xlsx(data_list, file = "plate2_organismAbundance.xlsx")能写入数据,但工作表名是默认的1、2、3,不是解析后的自定义名称(比如"H-T14_Cond_1_T"这类)
方案一:循环中结合文件名解析与数据写入
在循环里创建工作表后,直接用writeData()把对应的数据框写入工作表:
library(openxlsx) wb <- createWorkbook() for (i in seq_along(data_list)) { # 解析生成自定义工作表名 mysheetname <- strsplit(file_list[i], "_")[[1]][1:4] mysheetname <- paste(mysheetname, collapse = "_") # 添加工作表 addWorksheet(wb, sheetName = mysheetname) # 将对应数据框写入工作表 writeData(wb, sheet = mysheetname, x = data_list[[i]]) } # 保存工作簿(overwrite参数用于覆盖已存在的同名文件) saveWorkbook(wb, "plate2_organismAbundance.xlsx", overwrite = TRUE)
方案二:重命名data_list元素后用write.xlsx
先批量修改data_list的元素名称为解析后的文件名,再直接调用write.xlsx:
library(openxlsx) # 生成所有自定义工作表名 sheet_names <- sapply(file_list, function(x) { paste(strsplit(x, "_")[[1]][1:4], collapse = "_") }) # 重命名data_list的元素 names(data_list) <- sheet_names # 写入Excel,此时工作表名会自动使用列表元素名称 write.xlsx(data_list, file = "plate2_organismAbundance.xlsx", overwrite = TRUE)
内容的提问来源于stack exchange,提问作者aminards
相关产品推荐
相关产品推荐

