AI * Python *Excel 多路径多文件数据提取
- 2026-09-19 02:49:41
AI * Python *Excel 多路径多文件数据提取
从“翻 1000 个表找一列”到“一键收网”:几秒钟完成 6000 分钟工作 我是小李。办公室里有一种任务,最容易把人整破防: “这些 Excel 都在不同文件夹里,你把每个文件里的 A 列 ID 汇总到一张新表,今晚要。” 听起来很简单,对吧?但当你打开资源盘发现:上千份 Excel、路径七拐八绕、格式还不统一,你会立刻明白什么叫“现代体力活”。 办公场景:国企数据分析师的“多路径地狱” 小李在一家大型国企做数据分析。历史系统迁移后,各部门把资料扔在不同目录: 还有人把旧版表格复制出“最终版v7最终最终.xlsx” 老板只要一件事:把所有表里的 ID 汇总出来,用于后续去重、对账、入库。 手工操作的流程基本是: 你做 20 个还行,做 1000 个就是灾难。更别说:有人空行、有人多表头、有人把 ID 放成文本带空格。 核心说明(办公必看) 这类“批量提取”任务,你只要想清楚三件事就能跑脚本: 我给 AI 的指令 遍历指定文件夹及其所有子文件夹(递归遍历)。找到所有后缀为 .xlsx 的文件。打开每个文件,提取 A 列(从第2行开始)的所有非空 ID。将所有 ID 汇总到一个新 Excel 的 A 列。新 Excel 要设置表头底色、列宽、字体 Arial 9号、左对齐。打印处理了多少个文件、提取了多少条数据。 代码:一键扫描目录 + 批量提取 + 汇总成表(可追溯版) 运行结果解释 你会看到一个控制台进度条刷刷地跑,最后生成一个 ID_汇总.xlsx 。 打开这个 Excel,你会发现它不只是数据堆进去,还自带了格式(绿色表头、Arial 字体)。 这种交付物,直接发给老板,不需要你再去调格式。 这就是自动化的高级境界:不但要做完,还要做得漂亮。 

小李的总结 Excel 的强项是“人肉处理一张表”,弱项是“批量处理一千张表”。Python 刚好相反:你把规则写清楚,它就能把“6000分钟的苦工”压缩成几秒钟的流水线。 你不是在提取 ID,你是在搭一条数据采集管线:目录 → 文件 → 字段 → 汇总 → 可追溯交付。 

01
资料\一部\…\xx.xlsx
资料\二部\…\xx.xlsx
资料\项目A\归档\…\xx.xlsx
打开文件 找 A 列 拉到最后 复制 粘贴到总表 保存 下一个文件……
02
文件在哪:一个根目录,是否包含子目录?
要提取什么:哪一列(A列)?从第几行开始(跳过表头)?是否要去重?
输出什么:汇总到新 Excel,是否保留来源文件名/路径方便追溯?
03
04
import osimport timefrom pathlib import Pathfrom openpyxl import load_workbook, Workbookfrom openpyxl.styles import Font, PatternFill, Alignment# --- 配置区 ---SOURCE_FOLDER = "资料" # 你的目标文件夹名OUTPUT_FILE = "ID_汇总.xlsx"TARGET_COL_INDEX = 0 # A列索引是0(openpyxl read_only模式或者pandas习惯),这里用openpyxl原生是1HEADER_NAME = "System_ID"def get_all_excel_files(root_dir):"""递归获取所有子文件夹下的 .xlsx 文件"""p = Path(root_dir)# rglob('*') 是递归查找所有文件return [f for f in p.rglob("*.xlsx") if not f.name.startswith("~$")] # 排除临时文件def extract_ids_from_file(file_path):"""从单个 Excel 提取 A 列数据(跳过表头)"""ids = []try:# data_only=True 读取计算后的值,read_only=True 提升读取速度(大文件必开)wb = load_workbook(file_path, read_only=True, data_only=True)ws = wb.active# 遍历 A 列(min_col=1, max_col=1),从第2行开始for row in ws.iter_rows(min_row=2, min_col=1, max_col=1, values_only=True):val = row[0]if val is not None:ids.append(val)wb.close()except Exception as e:print(f"⚠️ 读取失败:{file_path.name} -> {e}")return idsdef save_with_style(data_list, output_path):"""保存并美化 Excel"""wb = Workbook()ws = wb.active# 1. 写入表头ws["A1"] = HEADER_NAME# 2. 批量写入数据for idx, val in enumerate(data_list, start=2):ws.cell(row=idx, column=1, value=val)# 3. 设置格式(美化环节)# 表头:淡绿色背景 + 加粗header_fill = PatternFill(fill_type='solid', fgColor="B3CFA1")header_font = Font(name='Arial', size=10, bold=True)ws["A1"].fill = header_fillws["A1"].font = header_font# 正文:Arial 9号 + 左对齐 + 垂直居中body_font = Font(name='Arial', size=9)align = Alignment(horizontal='left', vertical='center')ws.column_dimensions['A'].width = 20 # 设置列宽# 遍历设置样式(数据量大时,建议只设置列样式或最后统一设,逐行设会慢)# 这里演示逐行设置for row in ws.iter_rows(min_row=2, max_row=len(data_list)+1, min_col=1, max_col=1):cell = row[0]cell.font = body_fontcell.alignment = alignwb.save(output_path)print(f"✅ 结果已保存:{output_path}")def main():s_t = time.time()# 1. 确定搜索路径base_dir = Path.cwd() / SOURCE_FOLDERif not base_dir.exists():print(f"❌ 找不到文件夹:{base_dir}")return# 2. 递归找文件print(f"🔍 正在递归搜索 '{SOURCE_FOLDER}' 下的所有 Excel...")files = get_all_excel_files(base_dir)print(f"📂 找到 {len(files)} 个文件,开始提取...")# 3. 循环提取total_ids = []for i, f in enumerate(files, 1):file_ids = extract_ids_from_file(f)total_ids.extend(file_ids)if i % 50 == 0: # 每50个打印一次进度print(f" 已处理 {i}/{len(files)} 个文件...")# 4. 保存结果if total_ids:save_with_style(total_ids, OUTPUT_FILE)print(f"\n📊 统计:")print(f" - 扫描文件数:{len(files)}")print(f" - 提取 ID 总数:{len(total_ids)}")print(f" - 耗时:{time.time() - s_t:.2f} 秒")else:print("⚠️ 未提取到任何数据。")if __name__ == "__main__":main()
05

本文来自网友投稿或网络内容,如有侵犯您的权益请联系我们删除,联系邮箱:wyl860211@qq.com 。