多个不同格式的Excel文件按时间段合并:R语言实现批量合并
- 2026-11-02 08:25:05

点击上方蓝字·关注我们


每个人都需要放缓脚步,静观周围美好的事物,凝神谛听大自然的天籁,让绷紧的脸庞舒缓,皱紧眉宇打开,让微笑在脸上绽放。

一、Background
在日常工作中,我们面临一个高频且难以避免的难题:每天都会收到大量来自邮件的 Excel 文件,这些文件格式各异,但内部往往包含部分相同的字段。针对不同的数据整合需求,我们需要将多个表格中具有相同字段的内容进行合并。为此,必须先手动下载每个附件,依次打开文件,复制所需列,再粘贴到一个新的汇总表中。如果这样的文件有 10 个甚至更多,整个处理过程不仅极其耗时,还极易出错,且一旦出错往往需要全部重来,工作效率大打折扣。
1.1 EXCEL自动化实行的必要性
降低极高的人为出错风险:
手动复制与删除时,容易误删公式、误改表头、漏删历史数据,导致后续统计错误。忘记修改日期或文件名,造成数据覆盖、版本混乱追溯困难。自动化可100%遵循预设规则:始终保留公式、精确清空数据区、自动生成正确日期名称。
释放宝贵的人力时间,聚焦增值工作
手动复制表格汇总假如一个人一天花1小时,那么一周就是花5小时的时间,这只是每天其中的一项工作,而自动化可将该操作压缩至一分钟以内一键完成,人员可转向数据核对、异常分析、业务优化等更高价值工作。
确保数据一致性与可追溯性
手动操作下,不同人员可能采用不同命名规则、不同复制方式(如是否复制了隐藏行/列),导致数据口径不一致。自动化脚本可统一标准:固定命名格式(如“YYYY-MM-DD”)、固定复制范围、固定保留元素,为后续合并月度/年度数据提供干净的基础。

二、合并过程中存在的问题与难点
难点一:日期格式五花八门
A供应商:2025-01-24 00:00:00(字符串)
B供应商:2025-01-24(纯文本)
C供应商:2025年1月24日(中文格式)
D供应商:44950(Excel数字日期)
难点二:列名完全不统一
同样的“订单号”,有四五个叫法。手工合并时,你必须记住每个文件的列映射关系,然后手动将每列复制到正确的位置。面对不同时间段的不同需求,每次都要重新来一遍。
难点三:良品数量数据类型混乱
B供应商的“良品数量”有时是文本"100",有时是数字100,偶尔还是空字符串。如果你直接复制粘贴,后续求和时总会莫名其妙地报错。
难点四:时间段内可能部分供应商无数据
如果你要合并“1月1日到1月31日”的数据,C可能只在1月10日有到货。手工操作时,你需要先检查每个文件在时间段内是否有数据,如果没有就跳过该文件,否则合并后会多出空行或错位。
难点五:每次时间段变化都要重复全部操作
最折磨人的是:这个月要1-31号,下个月要15-25号,再下个月要季度汇总……每次需求变化,你都得从头筛选、复制、粘贴、核对。重复性劳动慢慢消耗掉你的工作热情,让你觉得自己就是个“表格搬运工”。
但是通过自动化合并EXCEL,则可通过设置不同的功能、不同的时间段灵活的抓取数据,以此解决以上问题,如下:
读取各家供应商的Excel文件;
将各种奇葩日期格式统一为标准Date类型;
按日期区间筛选(包含起止日期);
将各家的列名映射为统一名称(到货日期、品号、料号、数量);
自动跳过时间段内无数据的供应商;
按到货日期排序,合并成一个整洁的表格;
导出Excel文件,文件名自动包含时间段;

三、实际案例
现在有四家供应商的到货数据、字段各异,每天的到货可能是一家送的,也可能是2家、3家、4家送的,需要每天进行合并汇总,以下到货的字段名如下:
A:发货日期、订单编号、料号、品号、LOTNO、Mask ID、SHIP_BOXNID、良品数量、不良品数量、合计、单位、出货日期、Date code、Wafer、Wafer ID、发票号、备注

B:Date、Item、InvoiceNO、MAWBNo、SHIPTO、CUSPN、PO、DEVICE、LOT、LOTID、MESLOT、LABELLOT、MARKID DATECODE、REELNO、GOODQTY、REJQTY

C、D同样是不相同的字段名,但是虽然是不同的字段名,但是却有着相同的内容,因此才有需求将其合并在一起。

四、R语言实现批量合并
首先需要统一日期的格式,并标注起始日期与结束日期,这样是为了方便因各家的格式不统一带来的合并不变;
#设置起始日期和结束日期start_date <- as.Date("2025-01-01")end_date <- as.Date("2025-01-31")
其次需要编写函数,读取每一家供应商对应数据EXCEL文件,并将其归一化处理,整理成统一的格式,其目的是为了将相同的字段进行统一,合并的时候是一一对应的。
process_zss <- function(start_date, end_date) {df <- read_excel("./dh/A到货明细.xlsx")df %>%mutate(Date = as.Date(substr(Date, 1, 10)),供应商 = "A") %>%filter(Date >= start_date & Date <= end_date) %>%select(Date, PO, CUSPN, DEVICE, GOODQTY, MESLOT, 供应商) %>%rename(到货日期 = Date,PO = PO,品号 = CUSPN,料号 = DEVICE,良品数量 = GOODQTY,批次 = MESLOT)}
然后再对整理好的各家数据进行汇总到一个表中
data_list <- list(tryCatch(process_zss(start_date, end_date), error = function(e) data.frame()),tryCatch(process_ase(start_date, end_date), error = function(e) data.frame()),tryCatch(process_mdk(start_date, end_date), error = function(e) data.frame()),tryCatch(process_wisol(start_date, end_date), error = function(e) data.frame()))final_data <- bind_rows(data_list)
最后导出写入EXCEL中
# 导出文件,文件名包含时间段output_file <- paste0("合并到货明细_", start_date, "_to_", end_date, ".xlsx")write.xlsx(final_data, file = output_file)
最后通过合并,筛选出不可缺少的字段,如:到货日期、PO、物料编码、产品名称、良品数量、批次号、已经供应商等。

完整代码如下:
# 加载依赖包library(readxl)library(dplyr)library(openxlsx)# ========== 设置时间段 ==========start_date <- as.Date("2025-01-01")end_date <- as.Date("2025-01-31")# -------------------- A数据处理函数 --------------------process_zss <- function(start_date, end_date) {df <- read_excel("./dh/A到货明细.xlsx")df %>%mutate(Date = as.Date(substr(Date, 1, 10)),供应商 = "A") %>%filter(Date >= start_date & Date <= end_date) %>%select(Date, PO, CUSPN, DEVICE, GOODQTY, MESLOT, 供应商) %>%rename(到货日期 = Date,PO = PO,品号 = CUSPN,料号 = DEVICE,良品数量 = GOODQTY,批次 = MESLOT)}# -------------------- B数据处理函数 --------------------process_ase <- function(start_date, end_date) {df <- read_excel("./dh/B到货明细.xlsx")df %>%mutate(到货日期 = as.Date(substr(到货日期, 1, 10)),供应商 = "B") %>%filter(到货日期 >= start_date & 到货日期 <= end_date) %>%select(到货日期, PONo, 品号, Device, 良品数量, AOLOT, 供应商) %>%rename(PO = PONo,料号 = Device,批次 = AOLOT)}# -------------------- C数据处理函数 --------------------process_mdk <- function(start_date, end_date) {df <- read_excel("./dh/C到货明细.xlsx")df %>%mutate(日期 = as.Date(substr(日期, 1, 10)),供应商 = "C") %>%filter(日期 >= start_date & 日期 <= end_date) %>%select(日期, 合同号, 数量, 成品料号, 型号, 成品数量, 成品批号, 供应商) %>%rename(到货日期 = 日期,PO = 合同号,品号 = 成品料号,料号 = 型号,良品数量 = 成品数量,批次 = 成品批号)}# -------------------- D数据处理函数 --------------------process_wisol <- function(start_date, end_date) {df <- read_excel("./dh/D到货明细.xlsx")df %>%mutate(发货日期 = as.Date(substr(发货日期, 1, 10)),良品数量 = as.numeric(良品数量),供应商 = "D") %>%filter(发货日期 >= start_date & 发货日期 <= end_date, !is.na(良品数量)) %>%select(发货日期, 订单编号, 品号, 料号, 良品数量, LOTNO, 供应商) %>%rename(到货日期 = 发货日期,PO = 订单编号,批次 = LOTNO)}# -------------------- 合并时间段内所有有数据的厂家 --------------------data_list <- list(tryCatch(process_zss(start_date, end_date), error = function(e) data.frame()),tryCatch(process_ase(start_date, end_date), error = function(e) data.frame()),tryCatch(process_mdk(start_date, end_date), error = function(e) data.frame()),tryCatch(process_wisol(start_date, end_date), error = function(e) data.frame()))final_data <- bind_rows(data_list)# 按到货日期排序final_data <- final_data %>%arrange(到货日期) %>%select(到货日期, PO, 品号, 料号, 良品数量, 批次, 供应商)# 导出文件,文件名包含时间段output_file <- paste0("合并到货明细_", start_date, "_to_", end_date, ".xlsx")write.xlsx(final_data, file = output_file)

五、结语
R语言的优势不在于它比Python更厉害,而在于它在数据清洗和处理上极其简洁——几行代码就能完成Excel里半小时的复杂操作。那些每个月累计花几十个小时做的Excel时间段汇总,其实完全可以交给脚本,解放自己的双手,把时间花在其他重要的事情上。
END
