Python 操作 Excel 全流程指南:用 10 行代码告别 Ctrl+C / Ctrl+V
·
在日常工作中,Excel 永远是我们最亲密的“表格伙伴”。但当数据量暴增、报表模板增多、重复操作成为噩梦时,你会想:有没有办法让 Python 替我点鼠标?
答案是:有!本文带你 5 分钟上手 Python-Excel 自动化:从安装、读写到样式、图表、大数据,一站式打通。
一、武器库总览
| 库名 | 擅长场景 | 速度 | 备注 |
|---|---|---|---|
| pandas | 读/写/分析二维表,一行搞定 | ★★★★ | 依赖引擎,简单易用 |
| openpyxl | .xlsx 读写、样式、公式、图表 | ★★★ | 纯 Python,无依赖 |
| xlsxwriter | 创建精美报表、复杂格式 | ★★★ | 只能写,不能读 |
| xlrd/xlwt | 老 .xls 兼容 | ★★ | 已停止更新 |
| pywin32 | 直接调用 Windows Excel COM | ★★★★ | 仅 Windows,可操控界面 |
一句话总结:
- 读表 + 数据分析:
pandas - 写模板 + 样式:
openpyxl/xlsxwriter - 超大文件:
pandas + pyarrow(.xlsx 太慢就转 CSV/Parquet)
二、环境安装(30 秒)
# 推荐一次性装齐
pip install pandas openpyxl xlsxwriter xlrd
三、快速上手 3 连击
1️⃣ 读取 Excel → DataFrame
import pandas as pd
df = pd.read_excel('销售数据.xlsx', sheet_name='2024-05')
print(df.head())
2️⃣ 处理数据
# 新增一列
df['利润'] = df['销售额'] - df['成本']
summary = df.groupby('城市')['利润'].sum()
3️⃣ 写回 Excel(带样式)
with pd.ExcelWriter('结果.xlsx', engine='xlsxwriter') as writer:
summary.to_excel(writer, sheet_name='利润汇总')
workbook = writer.book
worksheet = writer.sheets['利润汇总']
# 加粗表头
bold = workbook.add_format({'bold': True})
worksheet.set_row(0, None, bold)
# 添加图表
chart = workbook.add_chart({'type':'column'})
chart.add_series({
'categories': ['利润汇总', 1, 0, len(summary), 0],
'values': ['利润汇总', 1, 1, len(summary), 1],
})
worksheet.insert_chart('D2', chart)
print('Done!')
👉 运行后打开 结果.xlsx,图表、格式一步到位!
四、进阶招式
① openpyxl 精修样式
from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill
wb = load_workbook('结果.xlsx')
ws = wb['利润汇总']
header_font = Font(bold=True, color='FFFFFF')
fill = PatternFill('solid', fgColor='4F81BD')
for cell in ws[1]:
cell.font = header_font
cell.fill = fill
wb.save('结果_精修.xlsx')
② 批量拆分工作表
for city, sub in df.groupby('城市'):
sub.to_excel(f'{city}.xlsx', index=False)
③ 大文件极速读写
# 读取 100 万行不卡死
df = pd.read_excel('big.xlsx', engine='openpyxl', usecols=['订单号', '金额'])
# 写入加速(xlsxwriter)
df.to_excel('big_out.xlsx', engine='xlsxwriter', index=False)
五、常见坑 & 解决方案
| 问题 | 解决口诀 |
|---|---|
xlrd 报 .xlsx 不支持 |
安装 openpyxl 引擎:read_excel(..., engine='openpyxl') |
| 日期变成 44205 数字 | df['日期'] = pd.to_datetime(df['日期']) |
| 合并单元格导致读取错位 | read_excel(..., skiprows=[0]) 跳过表头 |
| 多线程并发写同一文件失败 | 先写到不同临时文件,再合并 |
六、实战案例:日报自动化
需求:每天 8:00 自动抓取 MySQL → 生成 Excel → 邮件发送
核心代码片段:
import pandas as pd
import sqlalchemy, datetime, smtplib
today = datetime.date.today()
sql = f"SELECT * FROM sales WHERE date='{today}'"
df = pd.read_sql(sql, sqlalchemy.create_engine('mysql+pymysql://user:pwd@host/db'))
file = f'日报_{today}.xlsx'
df.to_excel(file, index=False)
# 邮件发送(略)
七、一句话总结
Python 操作 Excel 就是:
读取用 pandas,样式用 openpyxl / xlsxwriter,大数据用引擎加速,复杂逻辑用循环模板。
更多推荐
所有评论(0)