Python操作Excel表格:办公自动化高效入门实战 在日常办公中Excel 表格几乎是绕不开的数据载体。无论是做数据统计、排班表、项目进度跟踪还是整理从系统里导出的明细数据很多人每天都要花大量时间在复制、粘贴、筛选、填格式这些重复操作上。而 Python 这门语言之所以在办公自动化领域非常流行很大一部分原因就是它能用脚本帮我们处理这些 Excel 表格任务把手工操作变成自动化逻辑。本文聚焦于“Python 办公自动化 Excel 表格基础”这个方向从环境准备、核心库讲解、openpyxl 常用操作到 pandas 快速读取与统计再到完整实战案例和常见报错排查尽量整理成一条清晰的学习路径。如果你是刚接触 Python 的办公人员或者想系统学习 Python 处理 Excel 的开发者这篇文章都适合作为入门参考。1. 为什么用 Python 操作 Excel 表格1.1 办公自动化中的高频需求Excel 表格在办公场景中的使用频率极高几乎每个业务部门都会用到。常见的操作包括汇总多个分表的销售数据生成一张总表。按条件筛选出符合规则的行例如筛选某个日期范围内的订单。把不同格式的报表统一成标准模板。每月定时生成数据分析报表。根据一个 Excel 表格中的数据批量生成 Word 文件或邮件内容。清洗从系统导出的一批杂乱数据去掉重复项、修正格式、填充空值。这些任务如果全部用手工操作不仅耗时而且容易出错。尤其是数据量达到几千行甚至几万行时人眼核对和手动拖拽的效率非常低。Python 的解决方案是用脚本读取 Excel 结构把表格变成程序中的二维数据结构再用逻辑处理每一行、每一列最后把结果写回新的 Excel 文件。1.2 Python 处理 Excel 的优势批量处理能力强。同样的操作手工做 100 次和用 Python 写一个循环做 100 次时间成本差别很大。可重复执行。写好的脚本一旦稳定后续每月、每周都能复用。逻辑更透明。处理过程可以在代码中体现方便检查和调整规则。跨平台性较好。只要安装了 Python 和相关库Windows、Linux、macOS 都可以运行脚本。与 VBA 宏相比Python 的处理方式更接近工程化。VBA 与 Excel 深度绑定很多逻辑只在 Excel 内部运行Python 则可以把数据从 Excel 中取出后结合数据库、Web 接口、邮件服务、Word 等其他工具完成更复杂的自动化流程。本文内容围绕 Python 操作 Excel 表格的基础技能展开对应的训练场景可以概括为学会用 Python 创建工作簿、读取数据、修改单元格、保存文件并通过案例实现一个简单但完整的办公自动化任务。2. 环境准备Python、pip 与第三方库2.1 检查 Python 环境在开始写代码之前先确保电脑上已经安装了 Python并且 pip 命令可用。可以在命令行工具Windows 下的 cmd 或 PowerShellmacOS/Linux 下的终端中输入python --version如果输出类似下面的信息说明 Python 已经安装Python 3.10.11如果没有安装 Python需要先去 Python 官网下载对应操作系统的安装包。安装过程中需要注意勾选“Add Python to PATH”选项这样后续在命令行直接输入 python 或 pip 才能正常识别。如果电脑上同时安装了多个 Python 版本可以在命令行中用 python3 代替 python 进行区分。具体使用哪个命令取决于你环境中的配置。2.2 安装操作 Excel 的第三方库Python 处理 Excel 的常用库包括openpyxl读写 .xlsx 格式文件支持样式修改适合大多数场景。xlrd读取 .xls 格式文件较老版本 .xls 专用。xlwt写入 .xls 格式文件老项目中使用较多。pandas数据分析场景下的利器读取 Excel 非常方便底层依赖 openpyxl 或 xlrd 处理 Excel 格式。本文主要使用 openpyxl 和 pandas 两个库来演示。安装命令如下pip install openpyxl pandas如果你的网络环境使用默认源比较慢可以使用国内镜像源安装例如pip install openpyxl pandas -i https://pypi.tuna.tsinghua.edu.cn/simple版本方面不需要刻意追求最新版重点是保证 openpyxl 和 pandas 能正常导入。不同版本之间的 API 差异不大示例代码在常用版本中均可运行。2.3 验证库能否正常导入安装完成后在 Python 交互式环境或新建的 .py 文件中执行import openpyxl import pandas as pd print(openpyxl.__version__)如果没有报错说明环境已经准备完毕。后续所有示例都建议在项目目录中创建一个单独的文件夹方便统一管理 Excel 文件和脚本。示例项目结构可以如下excel_automation/ ├── data/ # 存放原始 Excel 文件 ├── output/ # 存放生成结果 └── main.py # 主脚本3. Excel 文件基础与 Python 库的选择3.1 理解 Excel 文件结构要操作 Excel 表格首先需要理解它的几个层级概念工作簿Workbook一个 .xlsx 文件就是一个工作簿。工作表Worksheet工作簿中的每一张页签例如“Sheet1”“Sheet2”。行Row工作表中的横向数据用数字编号。列Column工作表中的纵向数据用字母编号例如 A、B、C。单元格Cell由列字母和行号唯一确定例如 A1、B2。区域Range连续多行多列的单元格集合例如 A1:C10。用 openpyxl 操作 Excel 时需要先加载工作簿再选择工作表最后定位到单元格或遍历区域。3.2 常用库横向对比库名支持文件格式主要用途是否支持样式openpyxl.xlsx读写、修改、样式是xlrd.xls读取旧格式否xlwt.xls写入旧格式支持有限pandas.xlsx、.xls 等数据分析、读写表格有限xlsxwriter.xlsx写入并生成图表、格式是对于现代办公场景绝大多数文件都是 .xlsx 格式因此 openpyxl 是最直接的选择。如果只需要快速统计和筛选数据pandas 会更简洁。两者不是互斥关系可以结合使用。3.3 为什么优先掌握 openpyxlopenpyxl 能完成的功能非常靠近人工操作 Excel 的体验新建或打开 .xlsx 文件。创建、重命名、删除工作表。读取指定单元格和区域。写入数据并调整字号、对齐、边框。合并单元格、设置行高列宽。添加筛选器、排序规则。它不需要 Excel 软件本身运行在服务器端也可以处理 Excel 文件这让办公自动化脚本的部署更加灵活。4. openpyxl 核心操作详解4.1 创建工作簿与工作表下面的代码创建一个全新的工作簿并在默认工作表之外新增两张表from openpyxl import Workbook # 创建一个工作簿对象 wb Workbook() # 获取默认工作表 default_sheet wb.active default_sheet.title 汇总表 # 创建新的工作表 sheet1 wb.create_sheet(2024年数据) sheet2 wb.create_sheet(2025年数据) # 保存文件 wb.save(output/工作簿示例.xlsx)这里需要注意创建 Workbook 对象时会自动生成一个名为 Sheet 的默认工作表。通过 wb.active 可以拿到它再用 title 修改名称。执行上面的代码后会在 output 目录下生成工作簿示例.xlsx。代码中的 output 目录需要提前创建好或者使用 os.makedirs 自动创建。4.2 读取工作簿与工作表读取已存在的 Excel 文件时使用 load_workbookfrom openpyxl import load_workbook # 加载工作簿 wb load_workbook(output/工作簿示例.xlsx) # 获取所有工作表名称 print(wb.sheetnames) # 选择指定工作表 ws wb[汇总表] # 获取当前工作表名称 print(ws.title)遍历所有工作表时可以直接使用 for 循环for sheet_name in wb.sheetnames: sheet wb[sheet_name] print(f工作表{sheet_name}最大行数{sheet.max_row}最大列数{sheet.max_column})max_row 和 max_column 属性返回的是当前工作表中包含数据的最大行号和列号非常适合确定遍历范围。4.3 读取单元格数据读取单元格最简单的方式是通过坐标访问# 获取 A1 单元格的值 cell_value ws[A1].value print(cell_value) # 获取 B2 单元格的值 cell_value ws.cell(row2, column2).value print(cell_value)推荐使用 ws.cell(row, column) 的方式因为在循环中可以通过变量控制行列号写法更灵活。假设 Excel 中第一行是表头从第二行开始是数据可以用两层循环遍历整个区域for row in range(1, ws.max_row 1): row_data [] for col in range(1, ws.max_column 1): cell ws.cell(rowrow, columncol) row_data.append(cell.value) print(row_data)这里把每一行读取成一个列表后续就可以对列表进行各类处理。4.4 写入数据并保存向单元格写入数据时直接给 value 属性赋值即可ws[A1] 部门 ws[B1] 销售额 ws[A2] 技术部 ws[B2] 10000 wb.save(output/工作簿示例.xlsx)也可以使用 append 方法按照列表顺序向下一行追加数据ws.append([市场部, 25000]) ws.append([运营部, 18000])append 方法会把数据追加到当前工作表的末尾适合批量写入行数据。4.5 修改已有 Excel 文件修改已有文件时先加载工作簿再选择工作表修改单元格后保存即可。需要注意保存时会覆盖原文件。如果希望保留原始文件应该另存为新文件名。from openpyxl import load_workbook wb load_workbook(data/原始数据.xlsx) ws wb.active # 修改第 2 行第 3 列的数据 ws.cell(row2, column3).value 修改后的内容 wb.save(output/修改后数据.xlsx)如果只修改特定单元格内容这种方法非常高效。4.6 设置单元格样式的基本操作办公自动化中经常需要在生成报表时设置表头加粗、背景色、边框等。openpyxl 通过 Font、PatternFill、Alignment、Border 实现。示例代码如下from openpyxl import Workbook from openpyxl.styles import Font, PatternFill, Alignment, Border, Side wb Workbook() ws wb.active ws.title 销售报表 headers [部门, 销售额, 负责人] ws.append(headers) # 设置表头样式 header_font Font(boldTrue, colorFFFFFF) header_fill PatternFill(start_color4F81BD, end_color4F81BD, fill_typesolid) center_alignment Alignment(horizontalcenter, verticalcenter) for col in range(1, len(headers) 1): cell ws.cell(row1, columncol) cell.font header_font cell.fill header_fill cell.alignment center_alignment # 写入数据 ws.append([技术部, 10000, 张三]) ws.append([市场部, 25000, 李四]) ws.append([运营部, 18000, 王五]) # 保存 wb.save(output/带样式的报表.xlsx)在这个例子中Font 负责字体加粗和颜色PatternFill 负责单元格背景色Alignment 负责对齐方式。需要绘制边框时可以用 Side 和 Border 配合。thin_border Border( leftSide(stylethin), rightSide(stylethin), topSide(stylethin), bottomSide(stylethin) ) for row in ws.iter_rows(min_row1, max_rowws.max_row, max_colws.max_column): for cell in row: cell.border thin_border样式设置一旦掌握就能生成比较规范的报表模板。5. 实战案例多分表数据汇总5.1 案例描述假设你现在收到了一个文件夹里面是多个地区的销售数据 Excel 文件文件名称分别为“北京.xlsx”“上海.xlsx”“广州.xlsx”。每个地区文件的结构相同内容如下产品销售额笔记本12000显示器8000键盘3000现在需要编写一个 Python 脚本把三个文件的数据汇总到一张总表中并在最上方添加表头最后输出到一个新的汇总文件。这个案例在办公自动化中非常典型属于单文件处理能力掌握后再延伸出来的多文件批量场景。5.2 完整代码实现首先确保 data 文件夹下存在三个文件。然后新建 main.py代码逻辑拆分为函数。import os from openpyxl import Workbook, load_workbook def read_and_collect_data(file_path): 读取一个 Excel 文件返回其中的数据行列表。 第一行会被视为表头直接跳过。 wb load_workbook(file_path) ws wb.active data_rows [] for row in ws.iter_rows(min_row2, values_onlyTrue): # 如果整行为空可以选择跳过 if all(cell is None for cell in row): continue data_rows.append(row) return data_rows def create_summary_file(output_path, city_files): 汇总多个城市的销售明细到一个 Excel 文件。 # 创建汇总工作簿 wb Workbook() ws wb.active ws.title 销售汇总 # 写入表头 headers [地区, 产品, 销售额] ws.append(headers) # 循环处理每个城市文件 for city_file in city_files: city_name os.path.basename(city_file).replace(.xlsx, ) data_rows read_and_collect_data(city_file) for row in data_rows: # 在每行数据前加上地区名称 ws.append([city_name] list(row)) # 保存汇总文件 wb.save(output_path) print(f汇总文件已生成{output_path}) if __name__ __main__: city_files [ data/北京.xlsx, data/上海.xlsx, data/广州.xlsx ] create_summary_file(output/销售汇总.xlsx, city_files)read_and_collect_data 函数负责单个文件的读取。使用 iter_rows 时加上 values_onlyTrue可以直接获取单元格的值而不需要再用 cell.value 获取。create_summary_file 函数负责创建汇总表并在每行城市数据前插入地区列。最终生成的文件格式如下地区产品销售额北京笔记本12000北京显示器8000北京键盘3000上海笔记本15000.........5.3 运行与验证在命令行中执行python main.py如果 data 文件夹中存在三个格式正确的 Excel 文件脚本运行完会输出提示信息。打开 output/销售汇总.xlsx就可以看到所有数据已经被合并到一张表中。在实际办公场景中文件夹里的文件数量可能不止三个。可以使用 Python 的 os.listdir 或 glob 自动扫描文件而不是手动写死文件列表。改造方法如下import glob file_list glob.glob(data/*.xlsx) print(file_list)glob 能匹配满足路径规则的所有文件这样即使后续新增了地区文件也不需要修改代码。6. pandas 读取 Excel 做快速数据统计6.1 pandas 在 Excel 处理中的定位openpyxl 能完成精细化的单元格操作但如果遇到较大数据集纯 openpyxl 的遍历方式写起来比较繁琐。pandas 把 Excel 读取为 DataFrame 对象处理方式更接近数据库表可以非常方便地过滤、排序、分组。例如要统计每个产品的总销售额使用 openpyxl 需要手动汇总使用 pandas 只需要一行 groupby 操作。pandas 读取 Excel 的底层依赖 openpyxl 或 xlrd所以安装 pandas 时通常也会自动装上 openpyxl。如果读取 .xlsx 时报错检查环境中是否安装了 openpyxl。6.2 读取 Excel 文件import pandas as pd df pd.read_excel(data/北京.xlsx) print(df.head())head() 方法默认显示前 5 行。如果 Excel 文件中有多个工作表可以通过 sheet_name 参数指定读取哪一张表。默认读取第一张表。df pd.read_excel(data/销售数据.xlsx, sheet_name2024年)读取时不希望把第一行作为列名可以使用 headerNone然后自行设置列名df pd.read_excel(data/销售数据.xlsx, headerNone, names[产品, 销售额])6.3 数据筛选与统计例如读取多张表然后按条件筛选。import pandas as pd df pd.read_excel(output/销售汇总.xlsx) # 查看销售额大于 10000 的记录 high_sales df[df[销售额] 10000] print(high_sales)按产品分组统计总销售额result df.groupby(产品)[销售额].sum().reset_index() print(result)如果 Excel 中没有列名或者列名是中文读取后直接按列名字符串访问即可。6.4 将数据写入 Excelpandas 的 to_excel 方法可以把 DataFrame 直接写回 Excel 文件。result.to_excel(output/产品销售汇总.xlsx, indexFalse)indexFalse 表示不把行索引写入 Excel。如果不设置Excel 中第一列会出现 0、1、2 这样的序号通常不是我们想要的。pandas 也可以同时写入多个工作表需要借助 ExcelWriterwith pd.ExcelWriter(output/多表输出.xlsx) as writer: df.to_excel(writer, sheet_name原始数据, indexFalse) result.to_excel(writer, sheet_name统计结果, indexFalse)这种方式适合生成包含多张页签的报表文件。6.5 使用场景选择pandas 更适合以下任务对数据做分组、透视、筛选。合并多个结构相同的表。快速查看数据规模和分布。将处理结果输出到新表。openpyxl 更适合以下任务修改某个单元格的样式。合并单元格、调整行高列宽。清除指定区域内容。控制 Excel 的页面设置。两者选择不冲突。很多实际项目中先用 pandas 读取和处理数据再用 openpyxl 美化输出格式。7. 常见问题与排查思路7.1 openpyxl 报错找不到文件现象运行 load_workbook 时提示 FileNotFoundError。原因文件路径不正确或文件不在当前执行目录下。排查步骤检查文件是否存在。打印当前工作目录确认路径相对位置。import os print(os.getcwd())使用绝对路径临时验证。解决思路建议在项目目录中统一维护 data 和 output 文件夹避免路径混乱。7.2 pandas 提示缺少 openpyxl 依赖现象运行 pd.read_excel 时提示 ImportError例如 Missing optional dependency openpyxl。原因当前环境没有安装 openpyxl或 pandas 无法定位到该库。解决思路执行 pip install openpyxl 后重新运行程序。7.3 读取 Excel 文件时报“外部表不是预期的格式”现象某些工具连接或读取 Excel 时提示“连接到数据库失败。常规功能故障外部表不是预期的格式”。原因这类报错常见于非 Python 环境下的数据连接例如 ArcGIS 连接 Excel、其他数据库工具读取 Excel。本质原因是 Excel 文件本身并非标准 .xlsx 表结构或者文件实际是 HTML、CSV、XML 格式只是扩展名改成了 .xlsx也可能是 .xls 和 .xlsx 版本混用导致读取工具不识别。解决思路用 Excel 软件打开文件另存为真正的 .xlsx 格式。确认读取工具支持的版本。.xls 和 .xlsx 是不同格式不能随意更改扩展名解决。对于 Python 脚本可以先用 openpyxl.load_workbook 尝试加载如果失败再用 pandas 尝试并打印具体异常信息来定位原因。如果文件内容本身是被 Excel 打开过的 HTML 表格建议先在 Excel 中转换格式。Python 侧排查代码import traceback try: from openpyxl import load_workbook wb load_workbook(data/问题文件.xlsx) print(openpyxl 读取成功) except Exception as e: print(openpyxl 读取失败) traceback.print_exc() try: import pandas as pd df pd.read_excel(data/问题文件.xlsx) print(pandas 读取成功) print(df.head()) except Exception as e: print(pandas 读取失败) traceback.print_exc()7.4 修改 Excel 后原文件内容丢失现象运行保存代码后文件中的图表、宏、某些格式消失。原因openpyxl 对 .xlsx 中部分高级特性支持有限。包含宏的文件通常扩展名是 .xlsm宏代码不是 openpyxl 的主要支持对象。解决思路保存前先备份原文件。如果文件包含宏考虑使用其他工具或保留原文件版本并在副本上处理。如果普通样式丢失检查代码中是否在加载后重新创建了 Workbook而不是加载原文件。7.5 读取单元格显示为 None现象明明 Excel 中单元格有文字但 Python 读取后值为 None。原因单元格实际位于另一个工作表。数据是公式生成的结果而 openpyxl 默认读取时可能获取到公式本身或缓存值。文件不是标准 Excel 格式可能只是网页文件或文本文件改后缀。排查思路打印 ws.max_row 和 ws.max_column 确认读取范围正确。用 Excel 打开文件检查单元格位置是否与代码预期一致。如果是公式单元格设置 data_onlyTrue 加载缓存值wb load_workbook(data/公式示例.xlsx, data_onlyTrue)注意data_onlyTrue 只有在文件被 Excel 打开过并保存后才能读取到公式的缓存结果。如果文件刚由 openpyxl 写入且从未被 Excel 打开公式缓存可能不存在。7.6 中文内容乱码或写入后无法打开现象生成的文件用 Excel 打开时显示乱码或保存后提示文件损坏。原因文件扩展名和实际格式不一致例如用 openpyxl 写出后错误命名为 .xls或者保存时使用了错误路径。解决思路openpyxl 只支持 .xlsx 格式的保存文件命名时要使用 .xlsx。不要在代码中手工拼写文件后缀为 .xls。wb.save(output/正确输出.xlsx)7.7 遍历大 Excel 文件时速度慢现象几千行表格遍历可以接受但几万行以上时明显变慢。解决思路使用 pandas 做数据层处理避免逐单元格获取。如果必须使用 openpyxl尽量减少样式访问次数。只读取需要的列而不是全表遍历。处理完成后一次性 save不要在循环中反复保存。8. 最佳实践与工程建议8.1 文件备份意识不能丢涉及到修改或删除 Excel 中数据的操作一定要先把原文件复制一份作为备份尤其是处理生产数据或他人交付的数据时。办公自动化脚本一旦上线可能每月定时运行如果逻辑有误会在没有人工干预的情况下修改大量文件。稳妥的做法是脚本每次运行前自动生成带时间戳的备份目录把原文件复制进去。import shutil from datetime import datetime backup_dir backup/ datetime.now().strftime(%Y%m%d_%H%M%S) os.makedirs(backup_dir, exist_okTrue) shutil.copy(data/原始数据.xlsx, backup_dir /原始数据.xlsx)8.2 路径与命名规范在办公自动化脚本中建议统一使用相对路径或基于项目根目录的路径拼接。不要直接在脚本中写死某个同事电脑上的绝对路径否则换一台机器就宕机。文件命名尽量使用日期和业务含义组合例如 销售明细_20241201.xlsx有利于追溯和归档。脚本输出文件也建议加入日期标示避免覆盖历史文件。8.3 代码分层与函数化不要把所有逻辑都堆在同一个脚本的顶层里。建议把单文件读取、数据清洗、汇总、导出等功能拆分为函数这样后续维护时只需要改一个函数不会影响其他逻辑。例如parse_excel_file(file_path)负责读取文件。merge_data(file_list)负责汇总数据。export_report(result_df, output_path)负责导出报表。8.4 对原始数据先做结构检查办公自动化的数据来源往往五花八门。有人会在表格中插入标题行、合并单元格、空行、备注文字导致程序读取的位置和我们预期不一致。正式处理前应该先用脚本打印一下表头位置和行数确认结构。df pd.read_excel(data/待处理文件.xlsx) print(列名, list(df.columns)) print(数据行数, len(df)) print(df.head(3))确认无误后再进行后续统计和写入操作。8.5 异常处理与日志记录脚本运行在真实环境中总会遇到意想不到的文件格式。建议在关键环节增加 try-except并用日志记录错误信息方便定位是哪一步出问题。import logging logging.basicConfig( levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s ) try: df pd.read_excel(data/异常文件.xlsx) logging.info(f读取成功共 {len(df)} 行) except Exception as e: logging.error(f读取失败{e})不要在生产逻辑中只写一个空的 except这样会把所有错误吞掉导致排查困难。至少需要把异常信息打印或记录到日志文件。8.6 对外输出时注意数据安全如果处理的 Excel 中包含员工工资、身份证号、手机号等敏感信息在生成对外文件前要确认是否有权限导出、是否需要脱敏。如果只是本地练习也尽量不要把真实敏感数据提交到公开代码仓库或共享平台。8.7 性能优化方向批量写入时使用列表收集行数据最后一次性写入。多表合并时使用 pandas.concat 比逐行 append 更快。不需要修改样式时尽量关闭样式读取提升加载速度。对大文件只读取必要列用 usecols 参数控制。df pd.read_excel(data/大数据文件.xlsx, usecols[产品, 销售额])9. 基础掌握后的下一步方向本篇内容主要解决了“用 Python 读写 Excel”的基础问题掌握了这些内容你已经可以处理以下常见办公需求把多个文件追加合并到一张总表。按条件筛选 Excel 数据。修改指定单元格并保留新格式。生成带表头的规范报表。如果想继续深入可以考虑以下方向用 openpyxl 生成复杂图表。把 Excel 数据批量写入 Word 模板或 PPT 模板。使用 pandas 做数据透视和高级统计。结合 schedule 或系统计划任务让脚本每天定时运行。将 Excel 数据导入数据库或用 SQL 操作大量数据后回写 Excel。批量处理 PDF、邮件、文件夹文件形成跨工具自动化流程。Excel 办公自动化不仅是某一个固定函数库的熟练度问题更重要的是把工作流程拆解成“输入—处理—输出”的思考方式。拿到一个重复性任务时先不要急着打开软件手工做可以想一想它的输入是什么文件、要做什么判断规则、最后输出什么格式。这个思考习惯一旦建立工作效率会明显提升。如果在学习过程中遇到本文没有覆盖的报错建议优先打印异常信息再用最小数据量复现问题。许多 Excel 处理问题并不是代码本身复杂而是数据结构不符合预期。把文件结构搞清楚离解决问题就不远了。动手把案例代码运行一遍再尝试改造成本部门的具体业务才是最好的学习方式。