日常做数据处理、生成运营报表的时候,用 Python 导出 Excel 是非常高频的需求。主流的实现方案基本就两个:pandas 和 openpyxl。
两者适用场景差得挺多,这里整理下实际开发中的用法和踩过的坑。
如果数据本身是规整的结构化数据,优先用 pandas。DataFrame 接口写起来很简洁,几行代码就能导出文件。

import pandas as pd
# 创建示例数据
data = {
'姓名': ['张三', '李四', '王五'],
'年龄': [25, 30, 28],
'城市': ['北京', '上海', '广州']
}
# 创建DataFrame
df = pd.DataFrame(data)
# 写入Excel文件(单工作表)
df.to_excel('output_pandas.xlsx', index=False, sheet_name='员工信息')
index=False 这个参数建议默认带上,不然导出的文件会多一列行号,大部分场景下都没用。我一开始写的时候经常忘,每次都要重新导一次。
需要往同一个 Excel 里写多个工作表的话,用 ExcelWriter 上下文管理器就可以,不用自己手动保存关闭。
# 写入多工作表
with pd.ExcelWriter('output_pandas_multi.xlsx') as writer:
df.to_excel(writer, sheet_name='Sheet1', index=False)
df.head(2).to_excel(writer, sheet_name='Sheet2', index=False)
这种写法适合批量导出不同维度的数据,比如按部门分 sheet,逻辑写起来很清晰。
要是需求里带格式要求,比如表头要加粗改颜色、单元格要居中、固定列宽,甚至要合并单元格、加公式,pandas 就不够用了。
这种场景一般用 openpyxl,能做到单元格级别的控制。
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment
# 创建工作簿和工作表
wb = Workbook()
ws = wb.active
ws.title = "员工数据"
# 设置表头样式
header_font = Font(bold=True, color="FF0000")
header_alignment = Alignment(horizontal="center")
# 写入表头
headers = ["姓名", "年龄", "城市"]
for col_num, header in enumerate(headers, 1):
cell = ws.cell(row=1, column=col_num, value=header)
cell.font = header_font
cell.alignment = header_alignment
# 写入数据
data_rows = [
["张三", 25, "北京"],
["李四", 30, "上海"],
["王五", 28, "广州"]
]
for row_num, row_data in enumerate(data_rows, 2):
for col_num, cell_value in enumerate(row_data, 1):
ws.cell(row=row_num, column=col_num, value=cell_value)
# 设置列宽
ws.column_dimensions['A'].width = 15
ws.column_dimensions['B'].width = 10
ws.column_dimensions['C'].width = 15
# 保存文件
wb.save("output_openpyxl.xlsx")
openpyxl 的行和列都是从 1 开始计数的,刚接触的时候很容易和从 0 开始的列表下标搞混,写循环的时候多注意下。
列宽这些参数可以根据实际内容调整,要是嫌麻烦也可以写个自动计算列宽的函数,不过大部分场景下手动给个固定值也够用。
依赖安装直接用 pip 装就行,下面是常用的版本要求,太老的版本可能会有兼容性问题。
pandas>=1.3.0
openpyxl>=3.0.0
xlsxwriter>=3.0.0
xlsxwriter 也可以用来写 Excel,不过平时用得少,这里就不展开了,有兴趣可以自己试试。
上面几段代码跑通之后,会生成对应的几个 xlsx 文件。单工作表导出的是 output_pandas.xlsx,多工作表的是 output_pandas_multi.xlsx,带格式的是 output_openpyxl.xlsx。实际用的时候替换成自己的数据源和输出路径就行。
选型的时候其实很简单,纯数据导出、想少写代码就选 pandas;有复杂格式要求、需要操作单个单元格就上 openpyxl。
域名验证总是失败,试试来此加密的DNS代理(CNAME解析)方案。无需频繁修改DNS记录,一次配置CNAME指向,即可实现后续所有证书申请的自动验证。这种方案极大地降低了误操作风险,同时也为那些无法提供API权限的域名提供了优雅的自动化路径。
大部分常规场景 pandas 都能覆盖,真碰到产品提格式需求了再切 openpyxl 也完全来得及。
聊点题外话,平时做后端服务或者内部系统的时候,经常要处理 SSL 证书的申请和续期。
之前都是手动走流程,到期了还容易忘,出过几次线上告警。后来用了 lcjmSSL,体验还不错。免费就能申请,支持多域名、泛域名和 IP 证书,全自动化申请、验证和部署,还有简洁的 API 接口,写个定时任务就能完全不用管了。底层基于 Let's Encrypt、Google Trust Services 这些支持 ACME 的可信机构,证书兼容性也没问题,省了不少琐事。