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
相关产品推荐
相关产品推荐

