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

R语言合并同格式Excel时如何将单个单元格值追加为数据列

问题场景
  • 需要批量合并同文件夹下布局完全一致的多个Excel工资文件,目前已实现提取所有文件A13:M28区域的数据,按行追加合并为单个Excel文件,但合并结果缺少原文件B5单元格存储的员工姓名字段,无法直接使用。
  • 目标效果:将每个原Excel文件B5单元格的姓名作为新列追加到对应的数据块中,浏览合并文件时可直接识别每条数据对应的人员归属。
  • 自行尝试方案:通过read.xlsx分别读取B5单元格内容存入列表lst2、读取A13:M28区域数据存入列表lst1,调用Map(cbind)合并两个列表时抛出报错:

Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 0, 15

原运行代码
path <- "Payroll Files"
filenames_list <- list.files(path= path, full.names=TRUE) #create list of all file names
merge_file_name <- "Payroll Files//merged_file.xlsx"



lst1 <- lapply(filenames_list, function(x) read.xlsx(x, rows = 13:28))
lst2 <- lapply(filenames_list, function(x) setNames(read.xlsx(x,,
                                                              rows = 5, cols = 2), 'Employee'))



Map(cbind, Employee = lst2, lst1)


df <- do.call(rbind.data.frame, lst1)
write.xlsx(df,merge_file_name)
问题原因

read.xlsx默认会将读取区域的第一行识别为列名,读取单个B5单元格时,单元格内的姓名会被识别为列名,最终返回0行的空数据框,和lst1中每个15行的工资数据行数不匹配,因此cbind合并时报错。

修正方案

读取单元格时指定header = FALSE避免将值识别为列名,提取到姓名后直接为对应数据块新增员工列、填充相同姓名,最后统一合并所有数据块即可,修正后代码如下:

library(openxlsx)
path <- "Payroll Files"
# 仅匹配xlsx格式文件,避免读取文件夹内其他临时文件
filenames_list <- list.files(path= path, full.names=TRUE, pattern = "\\.xlsx$")
merge_file_name <- "Payroll Files/merged_file.xlsx"

# 单次循环同时读取姓名和工资数据,避免重复读取文件
df_list <- lapply(filenames_list, function(file_path) {
  # 读取A13:M28工资数据区域
  payroll_dt <- read.xlsx(file_path, rows = 13:28, colNames = FALSE)
  # 读取B5单元格员工姓名,指定header=FALSE
  emp_name <- read.xlsx(file_path, rows = 5, cols = 2, header = FALSE)[1,1]
  # 为当前数据块新增员工列
  payroll_dt$Employee <- emp_name
  return(payroll_dt)
})

# 按行合并所有文件的数据
final_df <- do.call(rbind.data.frame, df_list)
# 导出合并结果
write.xlsx(final_df, merge_file_name)

内容的提问来源于stack exchange,提问作者Cooper Youngs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 21:09:18