74_Python自动化办公之Excel操作

Python自动化办公:Excel操作完全手册

文章目录

前言

在办公场景中,Excel报表处理是一项高频且重复的劳动。无论是财务报表、考勤统计还是销售数据分析,手动操作Excel费时费力且容易出错。Python提供了openpyxlpandas两大利器,让Excel自动化变得简单高效。

openpyxl vs pandas:什么时候用哪个? 这是Excel自动化的第一个选型问题。简单来说,openpyxl适合"做格式"------设置字体、颜色、边框、合并单元格、插入图表,生成的Excel文件在视觉上等同于手工制作的专业报表。pandas适合"做计算"------数据筛选、分组聚合、透视表分析,几行代码就能完成在Excel中需要多次点击的操作。实际项目中,两者通常配合使用:先用pandas处理数据,再用openpyxl美化输出。本文涵盖Excel文件的新建、读取、样式设置以及数据分析,帮你彻底解放双手。

一、openpyxl基础:创建与写入

bash 复制代码
pip install openpyxl

openpyxl是Python中操作 .xlsx 格式Excel文件的标准库。它支持Excel 2010及以后的格式,功能覆盖创建、读写、样式设置、图表插入等几乎所有常用操作。

创建一个工作簿并写入数据时,有几种写入方式:cell() 方法按坐标精确写入,append() 方法按行追加,也可以直接将值赋给单元格(如 ws["A1"] = "值")。使用建议 :表头和数据行结构固定时用 append() 最简洁;需要写入特定单元格时用 cell() 或坐标赋值。

python 复制代码
from openpyxl import Workbook

wb = Workbook()
ws = wb.active          # 获取默认工作表
ws.title = "销售报表"    # 重命名工作表

# 写入数据
headers = ["日期", "产品", "销量", "单价", "总价"]
data = [
    ["2024-01-01", "产品A", 100, 12.5, 1250],
    ["2024-01-02", "产品B", 80, 20.0, 1600],
    ["2024-01-03", "产品A", 120, 12.5, 1500],
]

# 写入表头
for col, header in enumerate(headers, 1):
    ws.cell(row=1, column=col, value=header)

# 写入数据行
for row_idx, row_data in enumerate(data, 2):
    for col_idx, value in enumerate(row_data, 1):
        ws.cell(row=row_idx, column=col_idx, value=value)

# 使用append逐行添加(更简洁)
for row_data in data:
    ws.append(row_data)

wb.save("销售报表.xlsx")

二、openpyxl读取Excel

读取已有Excel文件是自动化中最常见的需求之一。load_workbook() 函数可以加载 .xlsx 格式的文件(注意:openpyxl不支持 .xls 格式,如果是老格式可以用 xlrd 库)。读取方式有两种:按行/列迭代(适合批量处理)、按单元格坐标读取(适合精确提取某个单元格的值)。values_only=True 参数让迭代只返回单元格的值而非Cell对象,通常更方便。

python 复制代码
from openpyxl import load_workbook

wb = load_workbook("销售报表.xlsx")
ws = wb.active

# 获取总行数总列数
print(f"行数: {ws.max_row}, 列数: {ws.max_column}")

# 遍历读取
for row in ws.iter_rows(min_row=2, values_only=True):
    date, product, sales, price, total = row
    print(f"{date} - {product}: {sales}件, 总价{total}元")

# 按单元格读取
sales_sum = sum(ws.cell(row=i, column=3).value for i in range(2, ws.max_row + 1))
print(f"总销量: {sales_sum}")

三、设置单元格样式

样式设置 让报表更专业美观。openpyxl提供了丰富的样式对象------Font(字体)、PatternFill(填充色)、Alignment(对齐方式)、Border(边框)等。这些对象都是不可变的共享实例,你可以在多个单元格上复用同一个样式对象,不必为每个单元格单独创建。常见需求:表头加粗居中、交替行着色(斑马条纹)、条件格式高亮,这些都可以通过样式设置实现。openpyxl还支持添加图表、图片等高级功能。

python 复制代码
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side

# 字体样式
title_font = Font(name="微软雅黑", size=14, bold=True, color="FFFFFF")
header_font = Font(name="微软雅黑", size=11, bold=True)
data_font = Font(name="微软雅黑", size=10)

# 填充颜色
title_fill = PatternFill(start_color="4472C4", end_color="4472C4", fill_type="solid")
header_fill = PatternFill(start_color="D9E2F3", end_color="D9E2F3", fill_type="solid")

# 边框
thin_border = Border(
    left=Side(style="thin"),
    right=Side(style="thin"),
    top=Side(style="thin"),
    bottom=Side(style="thin"),
)

# 应用样式
for cell in ws[1]:
    cell.font = header_font
    cell.fill = header_fill
    cell.alignment = Alignment(horizontal="center")
    cell.border = thin_border

# 设置列宽
ws.column_dimensions["A"].width = 15
ws.column_dimensions["B"].width = 12

# 合并单元格
ws.merge_cells("A1:E1")
ws["A1"] = "月度销售报表"
ws["A1"].font = title_font
ws["A1"].fill = title_fill
ws["A1"].alignment = Alignment(horizontal="center")

# 添加公式
ws["E2"] = "=C2*D2"  # 总价=销量*单价

四、pandas高效处理Excel

openpyxl适合精细控制,而pandas 适合批量数据处理和分析。pandas的DataFrame是Excel数据的最佳抽象------它既有表格的行列结构,又有强大的数据处理能力。pd.read_excel() 可以一键读取Excel文件为DataFrame,df.to_excel() 可以一键写出。在pandas中,你可以用SQL-like的操作(筛选、分组、聚合、连接)来处理Excel数据,而不需要在Excel中手动操作。注意pd.ExcelWriter 结合 engine="openpyxl" 可以在同一个工作簿中写入多个Sheet,这是生成综合报表的最佳方式。

python 复制代码
import pandas as pd

# 读取Excel
df = pd.read_excel("销售报表.xlsx", sheet_name="销售报表")

# 数据筛选
product_a = df[df["产品"] == "产品A"]
high_sales = df[df["销量"] >= 100]

# 分组聚合
summary = df.groupby("产品").agg({
    "销量": "sum",
    "总价": "sum"
}).reset_index()

# 新增计算列
df["利润率"] = df["总价"] * 0.3

# 写入Excel(保留多个Sheet)
with pd.ExcelWriter("销售分析报告.xlsx", engine="openpyxl") as writer:
    df.to_excel(writer, sheet_name="明细数据", index=False)
    summary.to_excel(writer, sheet_name="汇总统计", index=False)

print("报表生成完成!")

五、实战:多文件合并

多文件合并是Excel自动化中最常见的需求之一。想象一下:每个分公司上报一份月报Excel,你需要将这20份文件合并成一份汇总报表。手动操作就是打开20次、复制粘贴20次------有了Python,这一切只需要几行代码。下面是多文件合并的标准模板,适用于任何需要将结构相同的Excel文件汇总的场景。

python 复制代码
import os
import pandas as pd

folder = "./月度报表"
all_data = []

for filename in os.listdir(folder):
    if filename.endswith(".xlsx"):
        filepath = os.path.join(folder, filename)
        df = pd.read_excel(filepath)
        df["来源文件"] = filename  # 标记数据来源
        all_data.append(df)

result = pd.concat(all_data, ignore_index=True)
result.to_excel("合并汇总.xlsx", index=False)
print(f"成功合并 {len(all_data)} 个文件,共 {len(result)} 条记录")

代码解析 :核心逻辑是"遍历目录 → 逐个读取 → 添加来源标记 → 拼接合并"。pd.concat() 将多个DataFrame按行拼接,ignore_index=True 确保合并后的索引重新编号。额外添加的"来源文件"列让你在出现数据问题时能追踪到源文件------这在生产环境中非常重要。

总结

openpyxl适合需要精细控制格式 的场景(如模板报表、带图表的Excel),pandas适合批量数据处理和统计分析。两者结合可以覆盖绝大多数Excel自动化需求:用openpyxl生成格式化报表模板,用pandas进行数据清洗和聚合计算,最终输出专业美观的Excel文件。

实战建议:Excel自动化是Python最"接地气"的应用方向之一。你可以从自己日常工作中最重复的一个Excel任务开始------比如每月需要合并的多个部门报表、每天需要核对的数据表------用Python脚本替代手工操作。一开始可能会觉得写代码比手工操作还慢,但随着脚本的积累和复用,效率提升是几何级的。此外,将openpyxl和pandas结合使用是进阶方向:pandas负责数据层面的"批量计算",openpyxl负责视觉层面的"专业包装"。实践是最好的老师,建议从今天就开始动手尝试。

✅ 亮点总结

  • openpyxl 与 pandas 的双工具分工:前者精细控制样式和格式,后者高效批量处理数据
  • openpyxl 全流程演示:创建 Workbook、设置单元格样式、合并单元格、插入图表
  • pandas 的数据筛选、分组聚合、透视表功能,轻松完成 Excel 层面的数据分析
  • 实战案例:多文件合并,演示 glob + pandas 批量读取和拼接的全流程

适用场景

  • 财务报表生成:用 openpyxl 制作带格式、图表的月度/季度财务报表模板
  • 数据清洗与汇总:用 pandas 读取多个 Excel 文件,合并去重后输出统一报表
  • 自动化日报:从数据库/API 获取数据,填入预设的 Excel 模板并自动发送邮件

扩展方向

  • 学习 xlwings 库,通过 Python 操控 Excel 应用程序,实现更复杂的交互式操作
  • 探索 openpyxl 的图表(Chart)功能,生成柱状图、折线图、饼图等可视化报表
  • 结合 pywin32 直接操作 Windows 上的 Office 应用,实现 Word/Excel/PPT 全系列自动化
相关推荐
用户83562907805120 小时前
Python 实现 PDF 文件加密与解密方法
后端·python
用户83562907805120 小时前
使用 Python 冻结与拆分 Excel 窗格教程
后端·python
你好潘先生1 天前
别再记命令了,用 yeero do 说句人话就能跑脚本,而且不烧 token
服务器·python·命令行
Agent_大师1 天前
WebSocket 行情重连成功,K线缺口不会自动消失
python
荣码1 天前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python
copyer_xyf1 天前
FastAPI 如何连接 MySQL
后端·python
apocelipes2 天前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
用户8356290780512 天前
使用 Python 在 PDF 中创建与管理书签
后端·python
MeixianAgent2 天前
Python 回测数据入口怎么验?历史 K 线入库前先做 5 个检查
后端·python