You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用R将多个csv文件合并为各csv对应独立工作表的单个xlsx文件

问题原因

你遇到的仅显示第一个csv内容的问题,核心是两个常见代码逻辑缺陷:

  • sheet名称提取逻辑错误:你写的strsplit(strsplit(filenames_list[i], "/")[[1]][4], "\\.")[[1]][1]硬编码取路径拆分后的第4个元素作为工作表名,如果Path目录实际路径层级和你预设的不一致,会导致所有循环拿到的工作表名完全重复,后写入的内容会直接覆盖前一个工作表,最终仅保留单次写入的内容。
  • 循环追加写入方式不稳定:不管你使用的是xlsx还是openxlsx扩展包,循环调用write.xlsx加append=T的写入方式很容易出现IO冲突、隐式覆写问题,本身就不是推荐的实现方案。
最优解决代码

推荐使用不需要Java环境、稳定性更高的openxlsx包实现,先创建空白工作簿、批量写入工作表后一次性保存,完全避免上述问题:

# 首次使用先安装扩展包,已安装可跳过
install.packages("openxlsx")
# 加载扩展包
library(openxlsx)

path <- "Path"
# 仅匹配目录下的csv文件,避免其他格式文件被误读
filenames_list <- list.files(path = path, pattern = "\\.csv$", full.names = TRUE)
# 初始化空白工作簿
wb <- createWorkbook()

# 循环写入每个工作表
for (i in seq_along(filenames_list)) {
  # 自动提取csv文件名作为工作表名,无需硬编码路径层级,适配所有系统
  sheet_name <- gsub("\\.csv$", "", basename(filenames_list[i]))
  # 读取csv内容
  temp <- read.csv(filenames_list[i])
  # 新增工作表并写入数据
  addWorksheet(wb, sheetName = sheet_name)
  writeData(wb, sheet = sheet_name, x = temp, rowNames = FALSE)
}

# 一次性保存最终文件,overwrite=T可直接覆盖已存在的同名文件
saveWorkbook(wb, file = file.path(path, "output.xlsx"), overwrite = TRUE)
优化点说明
  • 用basename()+正则替换提取文件名,完全规避硬编码路径层级带来的兼容性问题,适配Windows、macOS、Linux全平台路径格式
  • 所有数据写入工作簿对象后再一次性保存,彻底消除循环追加写入的覆写、IO冲突问题
  • 新增pattern参数过滤文件,避免目录下存在非csv文件时导致代码报错

内容的提问来源于stack exchange,提问作者Natasha R.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 09:06:00