Python办公自动化:Excel表格读写与批量汇总的入门实战

Python办公自动化:Excel表格读写与批量汇总的入门实战 有一类需求几乎每个办公室都存在报表从 A 系统导出但要改成 B 系统的模板几十个 Excel 文件要按月合并每天下班前需要把数据清洗成固定格式再发出去。过去大家的第一反应是用 Excel 公式、数据透视表和手动录入可当文件数量变多、模板频繁调整、操作的人一多手工流程很快就会变成事故现场。Python 办公自动化不是一个新话题但真正入门时很多初学者会卡在几个奇怪的问题上是用openpyxl还是pandas为什么改动后原文件的公式不见了为什么明明装了库脚本一运行却提示ModuleNotFoundError为什么用 Excel 打开文件再运行脚本会提示文件被占用今天这篇文章以py100--lv2-083办公自动化-excel表格-基础为入口把 Python 操作 Excel 表格的基础串成一条可实操的路径。读完你能完成 4 件事用代码生成一个标准格式的.xlsx文件读取工作表中的数据修改单元格并另存为新文件用pandas把多个 Excel 文件批量汇总成一个报告。先给结论处理.xlsx基础读写优先掌握openpyxl涉及统计、清洗、多表拼接时再用pandas配合 ExcelWriter 输出结果。这两套工具足够覆盖大部分日常办公自动化需求。1. 这篇文章真正要解决的问题1.1 Excel 自动化要解决的不是“写代码”而是“重复流程”不少人以为办公自动化等于“用 Python 替代 Excel”这个理解很容易走偏。Excel 本身是优秀的数据分析工具公式、透视表、条件格式在交互式分析中非常高效。真正要解决的是“每隔一段时间就要重复执行”的工作流。如果任务只做一次直接在 Excel 里处理往往更快如果同一个流程每天、每周、每月都要执行并且参与人数不止一个那么用 Python 的价值就会体现出来。例如把若干个格式相同的日报合并成月报把导出的乱码 CSV 转成标准 Excel批量修改表格中的某些列把数据库导出结果变成指定模板。这些工作的共同特点是逻辑简单、步骤重复、出错代价高。人工操作时极容易漏行、填错列、粘贴覆盖原有公式。1.2 哪些人最需要这篇文章写代码的程序员需要处理 Excel往往是接收外部数据或者生成测试数据做数据运营和财务分析的人更需要处理 Excel但通常没有系统学过编程。因此本文默认你具备最基础的 Python 语法能力但不假设你用过任何 Excel 第三方库。具体来说如果你是已经学完 Python 基础语法想找真实场景练习的新手每天需要合并多个 Excel 文件、调整格式的运营或财务人员负责编写脚本给同事用的内部工具开发者。那么本文提供的流程、示例和注意事项都应该能直接落地。1.3 技术边界什么情况不建议用 Python 处理还需要说明一个容易被忽略的边界。如果文件是.xls老格式或者包含复杂的 VBA 宏又或者要求对几十万行数据做实时交互分析openpyxl并不适合。.xlsx本身是压缩包格式遇到超大文件时会明显变慢宏、控件这类功能在openpyxl中的支持有限。更稳妥的判断是python 处理 Excel 的最大优势在“确定性流程”不在“复杂界面交互”。先明确这个边界再进入技术细节会少走很多弯路。2. Excel 基础概念与 Python 处理模型的对应关系2.1 三级结构工作簿、工作表、单元格在 Excel 中一个.xlsx文件就是一个工作簿Workbook工作簿里面可以有多个工作表Worksheet工作表由一个个单元格Cell组成。用 Python 读写 Excel 时脑海里要始终有这三层结构否则很容易写出“找不到工作表”的代码。对应到openpyxl读取路径是打开工作簿 - 选中工作表 - 定位单元格初学者最容易犯的一个错误是只记得文件路径却忘了指定工作表名称。当一个工作簿中有多个Sheet时代码必须明确告诉程序要操作哪一个。2.2.xlsx和.xls的差异.xlsx是 Excel 2007 之后使用的默认格式基于 Office Open XML 标准本质上是一个 zip 压缩包内部由多个 XML 文件组成。.xls是 Excel 97-2003 时代的二进制格式两者结构完全不同。openpyxl只能处理.xlsx/.xlsm这一系格式无法读取.xls。如果你手里确实只有.xls文件建议先用 Excel 另存为.xlsx或者使用xlrd配合pandas读取但方案会多一层兼容成本。2.3 常用库怎么选Python 操作 Excel 的库不少新手容易被绕晕。下表列出最常用的几个方向库支持格式主要用途是否推荐给新手openpyxl.xlsx / .xlsm读写单元格、设置样式、生成 Excel推荐基础篇首选xlrd.xls / .xlsx新版仅 .xls老版 Excel 读取老文件兼容时使用xlwt.xls老版 Excel 写入仅兼容老场景pandas多种格式数据清洗、统计分析、批量拼接必学进阶方向xlwings.xlsx 等调用本机 Excel 应用执行 VBA 级操作要求电脑装 Excel慎用一个通用建议是如果你要做的事情是“打开表格、改几个单元格、保存格式”用openpyxl最直接如果你要做的是“统计某一列的平均值、按条件筛选行、合并多个表”先想想pandas因为它本身更擅长表格化数据处理而不是纠结坐标。3. 环境准备从零搭建 Python Excel 处理环境这里不打算展开完整的 Python 安装教程只列最重要的几步点击操作时不会卡住。3.1 确认 Python 版本建议使用 Python 3.8 或更高版本最好是在虚拟环境中操作。版本越新对第三方库的兼容性越稳但这篇文章中的示例并不是只在某一个特定版本里才能运行。在命令行输入python --version如果命令提示python找不到可以先尝试python3 --version。Windows 下如果安装时勾选了“Add Python to PATH”一般直接输出版本号没有勾选则需要重新安装或者在 IDE 内部集成终端中运行。3.2 安装依赖库第一个依赖是openpyxl用于 Excel 基础读写。第二个依赖是pandas用于后文的批量统计场景。pip install openpyxl pip install pandas如果环境中有多个 Python 版本建议用模块方式安装避免装到了错误的解释器python -m pip install openpyxl pandas在中国大陆网络环境中如果 pip 下载慢可以临时指定镜像源例如pip install openpyxl pandas -i https://pypi.tuna.tsinghua.edu.cn/simple注意pandas读取.xlsx时依赖openpyxl所以两个库最好一起安装。3.3 验证环境是否正常安装完成后在 Python 交互式环境或在脚本中执行import openpyxl import pandas print(openpyxl.__version__) print(pandas.__version__)如果能正常输出版本号说明环境已经可用。接下来开始第一个 Excel 自动化任务。4. 核心流程 01用代码生成一张可复现的 Excel 表动手练习前需要一份示例数据。为了不让读者每次都依赖别人提供的 Excel 文件下面写一个小脚本可以自动生成“学生成绩表.xlsx”。这份文件后续会作为读取和修改练习的素材。4.1 准备示例表格结构表格设计如下工作表名称成绩表表头学号、姓名、语文、数学、英语、总分、等级前五行是具体成绩数据总分和等级暂时留空这样做的好处是先让程序自己生成数据文件再让程序处理数据文件整个过程不受外部文件限制方便初学者反复练习。4.2 生成示例 Excel 的完整代码# generate_demo.py import openpyxl # 创建新工作簿 workbook openpyxl.Workbook() # 默认会有一个名为 Sheet 的工作表先把它重命名 worksheet workbook.active worksheet.title 成绩表 # 写入表头 worksheet.append([学号, 姓名, 语文, 数学, 英语, 总分, 等级]) # 写入数据行总分和等级先留空 worksheet.append([001, 小明, 90, 88, 95, None, None]) worksheet.append([002, 小红, 80, 85, 90, None, None]) worksheet.append([003, 小刚, 60, 70, 65, None, None]) worksheet.append([004, 小丽, 100, 98, 99, None, None]) # 这一步实际上不会生成 demo.xlsx而是保存成学生成绩表.xlsx workbook.save(学生成绩表.xlsx) print(已生成学生成绩表.xlsx)运行这段代码后会在当前目录生成一个标准的.xlsx文件。这里的append()表示从当前行的下一行追加数据每次调用写入一行列表顺序和列顺序一致非常适合快速造数据。4.3 这一步解决了什么问题很多初学者之所以接触真实 Excel 时不敢动手是因为文件来自业务方字段可能是乱的、公式是错的、合并单元格到处都是。先从一份自己能完整控制的文件开始练习可以把“Excel 操作语法”和“脏数据清洗”分开学习。语法熟练后再面对真实文件时你只需要额外关注数据质量问题即可。5. 核心流程 02用 openpyxl 读取 Excel 数据现在有了学生成绩表.xlsx接下来演示如何读取。读取之前先说明一个关键点Excel 单元格的行列编号从 1 开始A1 单元格对应的坐标是第 1 行第 1 列但 Python 中的iter_rows(values_onlyTrue)返回的元组索引从 0 开始。5.1 读取工作簿并遍历所有数据# read_excel_demo.py import openpyxl # 第一步加载工作簿 workbook openpyxl.load_workbook(学生成绩表.xlsx) # 第二步查看工作表名称 print(工作表列表:, workbook.sheetnames) # 第三步选中名为“成绩表”的工作表 worksheet workbook[成绩表] # 第四步打印表头 headers [cell.value for cell in worksheet[1]] print(表头:, headers) # 第五步从第二行开始读取数据最多打印 3 行 for row in worksheet.iter_rows(min_row2, max_row4, values_onlyTrue): print(row)预期输出类似工作表列表: [成绩表] 表头: [学号, 姓名, 语文, 数学, 英语, 总分, 等级] (001, 小明, 90, 88, 95, None, None) (002, 小红, 80, 85, 90, None, None) (003, 小刚, 60, 70, 65, None, None)5.2 两个容易出错的细节第一worksheet[1]表示获取第一整行的单元格对象。这里的数字 1 是 Excel 行号不是 Python 索引。第二iter_rows(values_onlyTrue)会把每一行转换成元组这样读取效率高同时也意味着不能直接在这一行上修改单元格值。如果想要在遍历过程中修改单元格应该使用默认的values_onlyFalse此时返回的是单元格对象。5.3 如何动态获取表头对应的列实际办公场景中Excel 的列顺序并不总是固定。今天“姓名”在第 2 列明天可能就被插到第 4 列。如果代码里写死row[1]表示姓名数据一变就会出错。更好的做法是先把表头读取成一个字典再用字典取值# read_excel_demo.py import openpyxl workbook openpyxl.load_workbook(学生成绩表.xlsx) worksheet workbook[成绩表] # 制作列名 - 0起始索引的映射 headers list(worksheet[1]) header_index {} for index, cell in enumerate(headers): header_index[cell.value] index print(header_index) # 输出类似: {学号: 0, 姓名: 1, 语文: 2, 数学: 3, 英语: 4, 总分: 5, 等级: 6} for row in worksheet.iter_rows(min_row2, values_onlyTrue): # 即使列顺序变化只要表头仍有“姓名”和“语文”代码依然正确 print(row[header_index[姓名]], row[header_index[语文]])这一段虽然代码量稍有增加但在做真实自动化脚本时非常值得因为业务方调整字段顺序是家常便饭。6. 核心流程 03修改 Excel 单元格并另存为新文件读取只是第一步办公自动化更常见的场景是“根据已有数据自动计算出结果并写回表格”。下面让程序自动计算每名学生的总分和等级。6.1 修改前的关键提醒使用openpyxl.load_workbook()读取文件后一旦调用workbook.save(原文件.xlsx)原文件会被覆盖。如果代码里不小心写错了逻辑原数据就丢了。因此基础阶段的铁律是不要覆盖源文件总是保存成新文件。等熟练后再考虑按日期生成备份文件。6.2 完整示例代码# update_scores.py import openpyxl SRC_FILE 学生成绩表.xlsx DST_FILE 学生成绩表_已处理.xlsx workbook openpyxl.load_workbook(SRC_FILE) worksheet workbook[成绩表] # 表头映射 headers list(worksheet[1]) header_index {} for index, cell in enumerate(headers): header_index[cell.value] index # 遍历第 2 行到最后一行 for row in worksheet.iter_rows(min_row2, values_onlyFalse): # 如果学号为空说明这一行没有有效数据 student_no row[header_index[学号]].value if student_no is None: continue # 注意当数字为空时用 or 0 可以保证相加不会报错 chinese row[header_index[语文]].value or 0 math row[header_index[数学]].value or 0 english row[header_index[英语]].value or 0 total chinese math english if total 270: level 优秀 elif total 240: level 良好 else: level 待提升 # 直接修改这一行的单元格对象 row[header_index[总分]].value total row[header_index[等级]].value level # 另存为新文件 workbook.save(DST_FILE) print(处理完成已生成:, DST_FILE)6.3 代码逻辑讲解这里真正值得注意的不是if判断而是row[header_index[语文]].value total这种写法。iter_rows返回的row不一定是一个 Python 列表但在openpyxl中可以通过方括号下标访问单元格对象并且修改单元格对象的.value属性后工作簿内存中的数据会同步更新。此外使用or 0处理空值是一种很常见的写法但要注意它的限制如果单元格的值是字符串00 or 0会返回字符串0因为它非空。对纯数字表格来说影响不大如果是严格的数据校验场景应该增加类型判断。运行完成后可以打开学生成绩表_已处理.xlsx检查总分列出现了 273、255、195、297 等数值等级列对应生成了“优秀”“良好”“待提升”等文字。7. 进阶示例用 openpyxl 从零生成带样式的 Excel 报表处理已有数据是基础另一个常见场景是从空白文件开始创建一张报表。报表往往需要表头加粗、背景色统一、列宽适当才能发给同事或领导查看。7.1 使用样式类设置字体、背景和对齐openpyxl提供了Font、PatternFill、Alignment三个样式类分别控制字体、填充色和对齐方式。下面生成一张“项目进度表”并给表头加上深蓝色背景和白色字体# create_report.py import openpyxl from openpyxl.styles import Font, PatternFill, Alignment from openpyxl.utils import get_column_letter workbook openpyxl.Workbook() worksheet workbook.active worksheet.title 项目进度 # 准备表头和数据 headers [任务名称, 负责人, 状态, 完成日期] rows [ (需求整理, 张三, 已完成, 2025-06-01), (开发联调, 李四, 进行中, None), (测试验证, 王五, 未开始, None), ] worksheet.append(headers) for row in rows: worksheet.append(row) # 设置表头样式 header_font Font(boldTrue, colorFFFFFF) header_fill PatternFill(start_color4F81BD, end_color4F81BD, fill_typesolid) for cell in worksheet[1]: cell.font header_font cell.fill header_fill cell.alignment Alignment(horizontalcenter, verticalcenter) # 调整列宽 column_widths [18, 10, 12, 16] for i, width in enumerate(column_widths, start1): worksheet.column_dimensions[get_column_letter(i)].width width # 保存 workbook.save(项目进度表.xlsx) print(报表已生成项目进度表.xlsx)7.2 说明Excel 报表自动化里的“样式”是否重要很多人处理 Excel 表格时遇到的最大阻力不是数据计算而是“做完的数据太丑”。实际工作中如果脚本生成的表格要直接发出去建议把表头加粗、设置填充色、调整列宽这三件事做成固定函数而不是在每张报表代码里重复写一遍。样式设置也要克制。自动化报表追求的是格式一致、信息清晰不需要追求花哨的配色。反而要特别注意每次加载同事提供的工作簿再保存可能会让原有格式发生变化所以重要流程在工作前先备份。8. 综合实战用 pandas 批量汇总多个 Excel 文件到这一步基础读写已经跑通。接下来要进入更贴近办公痛点的场景多个 Excel 文件合并成一个汇总表。用openpyxl手写循环也可以但用pandas的read_excel加concat会更简洁后续做统计也更方便。8.1 pandas 和 openpyxl 的定位差异openpyxl的核心抽象是“一个 Excel 文件里的单元格”操作单位很细适合改单元格、设置格式、生成模板。pandas的核心抽象是“一张二维表”也就是 DataFrame。读取 Excel 后每一行都是一个样本每一列都是一个变量所有数据处理语法都围绕行和列展开。遇到“需要把多个 Sheet 按某列匹配”“需要统计类别数量”“需要过滤某个月的数据”这类问题时用pandas会快得多。8.2 准备多个待合并的 Excel 文件在项目目录下新建一个文件夹monthly_detail并在其中放入至少两个结构相同的 Excel 文件例如20250601.xlsx、20250602.xlsx每个文件的第一行是表头后续是明细数据。如果手边没有现成文件可以用前面的generate_demo.py思路稍微改一下文件名生成几个结构相同的.xlsx文件再合并。8.3 合并代码# merge_excel_with_pandas.py import pandas as pd from pathlib import Path # 1. 获取所有 Excel 文件路径 data_dir Path(monthly_detail) excel_files data_dir.glob(*.xlsx) # 2. 逐个读取并拼接 merged_df pd.DataFrame() for excel_file in excel_files: # dtypestr 把数据统一读成字符串避免长数字被转成科学计数法 tmp_df pd.read_excel(excel_file, dtypestr) # 新增一列记录数据来自哪个文件便于追溯 tmp_df[来源文件] excel_file.name merged_df pd.concat([merged_df, tmp_df], ignore_indexTrue) # 3. 删除整行为空的无效记录 merged_df merged_df.dropna(howall) # 4. 清洗列名中的空格 merged_df.columns [str(col).strip() if col is not None else 未命名 for col in merged_df.columns] # 5. 输出到一个 Excel 文件包含两个工作表 with pd.ExcelWriter(2025年6月_合并明细.xlsx, engineopenpyxl) as writer: merged_df.to_excel(writer, indexFalse, sheet_name全部明细) # 统计每个文件有多少条记录 summary merged_df.groupby(来源文件).size().to_frame(name记录数) summary.to_excel(writer, sheet_name统计) print(合并完成共, len(merged_df), 条记录)8.4 合并脚本里的踩坑点第一pd.concat合并时必须设置ignore_indexTrue否则结果会保留每个小文件里的原始行号造成索引重复。第二dropna(howall)只能删除所有列都为空的记录。如果某些行列是空的其他列有值不会被删除这是符合预期的。第三用dtypestr读数据可以防止“账号、订单号”被 Excel 转成浮点数但代价是所有数据都变成字符串。如果真的要做数值计算应当在to_excel前先把需要的列转换成数字类型。第四pd.ExcelWriter的with语法非常重要。如果不使用with写完第一个to_excel后文件可能已经关闭第二个工作表就不会写入。9. 运行结果与效果验证代码写完不等于流程结束。判断脚本是否成功不能只看“没有报错”还要验证生成的文件内容是否符合预期。9.1 检查脚本控制台输出运行update_scores.py后控制台会显示处理完成已生成: 学生成绩表_已处理.xlsx运行merge_excel_with_pandas.py后控制台会显示合并完成共 6 条记录这里“6 条记录”只是一个示例实际行数与输入的 Excel 文件行数相关。9.2 检查生成文件的基本信息用openpyxl快速读取生成文件确认关键数据是否存在# verify_result.py import openpyxl workbook openpyxl.load_workbook(学生成绩表_已处理.xlsx) worksheet workbook[成绩表] print(总行数:, worksheet.max_row) print(总列数:, worksheet.max_column) for row in worksheet.iter_rows(min_row1, max_row3, values_onlyTrue): print(row)预期第二行、第三行的总分和等级不再是None(001, 小明, 90, 88, 95, 273, 优秀) (002, 小红, 80, 85, 90, 255, 良好)9.3 如果失败先按这个顺序排查第一步确认当前工作目录是否正确。打印Path.cwd()看脚本实际运行在哪个目录生成的 Excel 文件在这个目录下搜索。第二步确认文件没有被 Excel 软件以独占方式打开。Windows 下只要 Excel 进程还开着对应文件save就会因为文件占用而报PermissionError。第三步确认文件确实是.xlsx而不是把.xls改了后缀。如果文件损坏或根本不是标准格式openpyxl.load_workbook会报BadZipFile。10. 常见问题与排查思路下面这张表整理的是实际使用频率最高的几个问题。遇到报错时先对照问题现象定位原因再决定是改代码还是改文件处理方式。问题现象可能原因排查方式解决方案ModuleNotFoundError: No module named openpyxl库没有安装或装到了别的 Python 环境执行python -m pip list查看安装列表用python -m pip install openpyxl安装到当前解释器PermissionError: [Errno 13] Permission denied要保存的文件被 Excel 程序打开看错误信息中给出的文件路径关闭 Excel 后重新运行或另存为其他文件名BadZipFile: File is not a zip file目标文件不是标准的.xlsx可能是.xls或损坏文件用压缩软件尝试打开该文件在 Excel 中另存为.xlsx后再处理KeyError: 成绩表工作簿中不存在这个名字的工作表打印workbook.sheetnames查看实际名称修改选中工作表的名字读取公式所在单元格得到 Noneopenpyxl默认保存的是公式字符串而不是计算后的值确认单元格内容是否以等号开头使用data_onlyTrue读取缓存结果但要求文件已被 Excel 保存过计算值某些日期数据显示成数字单元格格式是日期但数据读取方式不合适打印该单元格的具体类型在pandas中用parse_dates处理或在写入时指定日期格式中文内容在合并后乱码数据的原始编码与读取编码不一致检查源文件是 CSV 还是 ExcelExcel 文件一般不涉及CSV 文件需指定encodinggbk或encodingutf-8-sig11. 最佳实践与工程级建议11.1 始终保留原始数据文件办公自动化脚本成功运行一次并不难难的是它需要长期运行而且运行过程中数据可能持续变化。如果每次运行都把“读取、修改、覆盖源文件”放在一个脚本里一旦中间某天数据格式异常原始文件就再难恢复。工程建议输入文件与输出文件分开目录或者在保存前用时间戳生成新文件名from datetime import datetime timestamp datetime.now().strftime(%Y%m%d_%H%M%S) dst_file f学生成绩表_处理_{timestamp}.xlsx11.2 不要把文件路径写死在脚本中真实工作场景中文件路径往往带中文、空格、日期子目录。与其每次打开脚本修改代码不如把源文件路径和输出路径提取成配置from pathlib import Path import openpyxl input_dir Path(data/input) output_dir Path(data/output) output_dir.mkdir(parentsTrue, exist_okTrue) src_path input_dir / 学生成绩表.xlsx dst_path output_dir / 学生成绩表_已处理.xlsx使用pathlib.Path后跨平台路径拼接会安全很多也方便后续接入定时任务。11.3 修改单元格前先校验表头和数据格式办公自动化脚本最容易在拿到“脏数据”时崩溃。一个好的防御习惯是在启动处理逻辑前断言想要的表头确实存在。例如required_headers [学号, 姓名, 语文, 数学, 英语] for header in required_headers: if header not in header_index: raise ValueError(f表头缺少必需列: {header})先失败、再处理比处理到一半才发现数据问题要容易定位得多。11.4 提示不要把日志只打印在控制台当脚本被定时任务触发时控制台输出往往无处查看。建议使用 Python 内置的logging模块把关键步骤和错误写入文件方便第二天排查。import logging logging.basicConfig( filenameexcel_automation.log, levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s, ) logging.info(开始处理学生成绩表)这样即使脚本在无人值守时运行失败也能从日志中定位到具体模块而不是让同事打电话告诉你“脚本好像没跑”。11.5 处理大文件时按需使用只读模式如果某个 Excel 表格有几十 MB直接load_workbook会把整个文件读入内存。面对超大文件可以加上read_onlyTrue并只遍历需要的行workbook openpyxl.load_workbook(large_file.xlsx, read_onlyTrue, data_onlyTrue) worksheet workbook[数据] for row in worksheet.iter_rows(values_onlyTrue): # 按行处理而不是一次性把所有数据加载进内存 pass需要注意只读模式下的工作簿无法保存适合用于数据提取不适合用于修改并写回。11.6 该不该设置自动定时运行当一个 Excel 脚本稳定后很多人会想让它每天自动运行。对于基础阶段我的建议是先用普通方式手动运行两周确认数据边界没有重大问题再考虑接入操作系统的定时任务。Windows 可以用任务计划程序Linux 可以用cron但定时任务会掩盖“数据格式变化”这类问题工程上要配合日志和监控才能使用。12. 总结与下一步学习方向这篇文章从一个明确的办公痛点出发走完了 Python 操作 Excel 的基础闭环。现在可以回过头来检查自己是否真的掌握了以下能力能否用openpyxl新建并保存一个.xlsx文件能否读取指定工作表并动态定位列能否在遍历时修改单元格并另存能否使用pandas批量汇总多个 Excel遇到文件占用、格式不对、编码混乱等问题时是否有清晰的排查路径。如果这些都没问题下一步可以按照这个顺序继续深入先学习openpyxl的合并单元格、条件格式、图表和公式写入掌握如何生成更接近业务模板的报表再学习pandas的数据清洗能力包括去重、填充缺失值、日期解析、多表关联最后可以尝试把脚本改成可复用函数封装成一个小工具库让同事通过命令行参数直接使用。Excel 办公自动化最难的从来不是某个 API 记不住而是处理真实数据时永远会遇到意外。建议把本文的代码存成一套可复现的练习文件在本地反复修改数据结构、人为制造错误文件多磨几次再去看第 84 个场景时就会顺手很多。