发布于2026-07-01 阅读(0)
扫一扫,手机访问
不少学习 Python 的朋友,在接触到办公自动化这个概念时,心里都会冒出一个很自然的念头:能不能写个脚本,把 Excel 里的数据批量处理一下,然后自动生成一份像模像样的统计报表?

如果你的目标是“高质量地生成 Excel 文件”,那 XlsxWriter 绝对是一个值得花时间掌握的库。它尤其擅长这些事儿:
不过,在深入之前,得先把一个关键点讲透:
XlsxWriter 的强项是“创建”和“写出” Excel 文件,它不负责读取已有的 .xlsx 文件。
换句话说,如果你需要“读取旧 Excel 再修改”,那 openpyxl 更适合你;但如果你已经在 Python 里有了数据,想高质量地输出一份崭新的 Excel 报表,XlsxWriter 用起来会更顺手。
这篇文章会带你系统地掌握 XlsxWriter 的核心用法,并通过一个完整的实战案例,学会如何自动生成一份拿得出手的统计报表。
XlsxWriter 是一个专门用于创建 Excel .xlsx 文件的 Python 库。
它最典型的应用场景包括:
和 openpyxl 相比,XlsxWriter 的定位更聚焦在“生成结果文件”这一端。简单理解就是:
openpyxl:更适合“读 + 改 + 保存”XlsxWriter:更适合“从 0 开始,生成一份漂亮的 Excel”很多初学者看到这个名字时,会下意识地以为它和 openpyxl 一样,既能读也能写。但实际情况是:
XlsxWriter 可以创建新的 .xlsx所以,如果你的原始数据已经在:
pandas.DataFrame那么 XlsxWriter 就很好用。
如果你的原始数据只存在于“某个现成的 Excel 文件”里,通常的组合做法是:
openpyxl 或 pandas 读取数据XlsxWriter 负责输出最终报表这也是实际工作中非常常见的协作模式。
安装命令很简单,一行搞定:
pip install XlsxWriter
导入方式如下:
import xlsxwriter
没有报错,就说明安装成功了。
用 XlsxWriter 时,你打交道最多的对象主要有 3 个:
Workbook:代表整个 Excel 文件Worksheet:代表工作表Format:代表单元格格式对象它们的关系可以直观地理解为:
Workbook -> Worksheet -> Cell Data + Format
其中 Format 尤其重要,因为 XlsxWriter 很擅长做“格式化输出”,这也是它的一大卖点。
先来看一个最小可运行的示例,找找感觉:
import xlsxwriter
workbook = xlsxwriter.Workbook("sales_demo.xlsx")
worksheet = workbook.add_worksheet("销售数据")
worksheet.write("A1", "日期")
worksheet.write("B1", "销售员")
worksheet.write("C1", "地区")
worksheet.write("D1", "销售额")
worksheet.write("A2", "2026-04-01")
worksheet.write("B2", "张三")
worksheet.write("C2", "华东")
worksheet.write("D2", 5800)
worksheet.write_row("A3", ["2026-04-01", "李四", "华北", 7200])
worksheet.write_row("A4", ["2026-04-02", "王五", "华南", 4300])
workbook.close()
运行后,你会得到一个 sales_demo.xlsx 文件。这里有两个核心写法可以先记住:
write():写单个单元格write_row():按一整行写入如果你有大量二维数据,write_row() 会非常方便。
XlsxWriter 的一大优势,就是对 Excel 格式的控制非常友好。比如我们想给表头加粗、加背景色:
import xlsxwriter
workbook = xlsxwriter.Workbook("format_demo.xlsx")
worksheet = workbook.add_worksheet("示例")
header_format = workbook.add_format({
"bold": True,
"font_color": "white",
"bg_color": "#4F81BD",
"align": "center",
"valign": "vcenter",
"border": 1,
})
worksheet.write("A1", "姓名", header_format)
worksheet.write("B1", "部门", header_format)
worksheet.write("C1", "工资", header_format)
workbook.close()
你会发现,Format 对象是可以统一复用的。也就是说,先定义好格式,然后就可以在多个单元格上反复使用,这在生成正式报表时非常常见。
自动报表往往离不开公式和金额格式。例如:
import xlsxwriter
workbook = xlsxwriter.Workbook("formula_demo.xlsx")
worksheet = workbook.add_worksheet("统计")
money_format = workbook.add_format({"num_format": "#,##0.00"})
worksheet.write("A1", "金额1")
worksheet.write("A2", "金额2")
worksheet.write_number("B1", 5800, money_format)
worksheet.write_number("B2", 7200, money_format)
worksheet.write_formula("B3", "=SUM(B1:B2)", money_format)
workbook.close()
这里有几个要点:
write_number():明确按数字写入write_formula():写 Excel 公式num_format:控制金额、百分比、日期等显示格式很多 Excel 自动化任务,本质上不是“改老表”,而是“把已有数据生成一份新报表”。
例如:
在这些场景下,XlsxWriter 就显得非常合适,因为它在以下方面表现得相当不错:
简单来说,如果你希望脚本的输出结果,是那种“领导能直接打开看一眼”的 Excel 文件,那它绝对是个好工具。
下面我们一起来做一个完整的示例。注意,这次我们不从 Excel 读取源数据,而是模拟“你的业务数据已经在 Python 中”的情况,这更符合 XlsxWriter 的真实定位。
假设程序里已经有一批销售明细数据:
| 日期 | 销售员 | 地区 | 产品 | 销售额 |
|---|---|---|---|---|
| 2026-04-01 | 张三 | 华东 | 键盘 | 5800 |
| 2026-04-01 | 李四 | 华北 | 显示器 | 7200 |
| 2026-04-02 | 张三 | 华东 | 鼠标 | 1600 |
| 2026-04-02 | 王五 | 华南 | 笔记本 | 12500 |
| 2026-04-03 | 李四 | 华北 | 扩展坞 | 2300 |
我们的目标是输出一个 sales_report_xlsxwriter.xlsx,其中需要包含:
下面这段代码可以直接运行:
from collections import defaultdict
import xlsxwriter
sales_data = [
["2026-04-01", "张三", "华东", "键盘", 5800],
["2026-04-01", "李四", "华北", "显示器", 7200],
["2026-04-02", "张三", "华东", "鼠标", 1600],
["2026-04-02", "王五", "华南", "笔记本", 12500],
["2026-04-03", "李四", "华北", "扩展坞", 2300],
["2026-04-03", "赵六", "华东", "耳机", 3600],
["2026-04-04", "王五", "华南", "平板", 8900],
["2026-04-04", "张三", "华东", "支架", 900],
]
def build_report(output_file):
workbook = xlsxwriter.Workbook(output_file)
detail_sheet = workbook.add_worksheet("订单明细")
summary_sheet = workbook.add_worksheet("统计报表")
header_format = workbook.add_format({
"bold": True,
"font_color": "white",
"bg_color": "#4F81BD",
"align": "center",
"valign": "vcenter",
"border": 1,
})
title_format = workbook.add_format({
"bold": True,
"font_size": 16,
})
money_format = workbook.add_format({
"num_format": "#,##0.00",
"border": 1,
})
text_format = workbook.add_format({
"border": 1,
})
bold_format = workbook.add_format({
"bold": True,
})
headers = ["日期", "销售员", "地区", "产品", "销售额"]
for col, header in enumerate(headers):
detail_sheet.write(0, col, header, header_format)
for row_num, row_data in enumerate(sales_data, start=1):
for col_num, value in enumerate(row_data):
if col_num == 4:
detail_sheet.write_number(row_num, col_num, value, money_format)
else:
detail_sheet.write(row_num, col_num, value, text_format)
detail_sheet.set_column("A:A", 14)
detail_sheet.set_column("B:C", 12)
detail_sheet.set_column("D:D", 14)
detail_sheet.set_column("E:E", 14)
seller_total = defaultdict(float)
region_total = defaultdict(float)
total_amount = 0
order_count = 0
for sale_date, seller, region, product, amount in sales_data:
seller_total[seller] += amount
region_total[region] += amount
total_amount += amount
order_count += 1
a vg_amount = total_amount / order_count if order_count else 0
summary_sheet.write("A1", "销售统计报表", title_format)
summary_sheet.write("A3", "总订单数", bold_format)
summary_sheet.write("B3", order_count)
summary_sheet.write("A4", "总销售额", bold_format)
summary_sheet.write_number("B4", total_amount, money_format)
summary_sheet.write("A5", "平均订单金额", bold_format)
summary_sheet.write_number("B5", a vg_amount, money_format)
summary_sheet.write("A7", "按销售员汇总", bold_format)
summary_sheet.write("A8", "销售员", header_format)
summary_sheet.write("B8", "销售额", header_format)
seller_start_row = 8
seller_items = sorted(seller_total.items(), key=lambda item: item[1], reverse=True)
for index, (seller, amount) in enumerate(seller_items, start=1):
summary_sheet.write(seller_start_row + index, 0, seller, text_format)
summary_sheet.write_number(seller_start_row + index, 1, amount, money_format)
region_title_row = seller_start_row + len(seller_items) + 3
summary_sheet.write(region_title_row, 0, "按地区汇总", bold_format)
summary_sheet.write(region_title_row + 1, 0, "地区", header_format)
summary_sheet.write(region_title_row + 1, 1, "销售额", header_format)
region_items = sorted(region_total.items(), key=lambda item: item[1], reverse=True)
for index, (region, amount) in enumerate(region_items, start=1):
summary_sheet.write(region_title_row + 1 + index, 0, region, text_format)
summary_sheet.write_number(region_title_row + 1 + index, 1, amount, money_format)
summary_sheet.set_column("A:A", 16)
summary_sheet.set_column("B:B", 14)
summary_sheet.set_column("D:J", 12)
chart = workbook.add_chart({"type": "column"})
chart.add_series({
"name": "销售员业绩",
"categories": ["统计报表", seller_start_row + 1, 0, seller_start_row + len(seller_items), 0],
"values": ["统计报表", seller_start_row + 1, 1, seller_start_row + len(seller_items), 1],
})
chart.set_title({"name": "销售员业绩统计"})
chart.set_x_axis({"name": "销售员"})
chart.set_y_axis({"name": "销售额"})
chart.set_style(10)
summary_sheet.insert_chart("D3", chart, {"x_scale": 1.3, "y_scale": 1.2})
workbook.close()
if __name__ == "__main__":
build_report("sales_report_xlsxwriter.xlsx")
print("统计报表已生成:sales_report_xlsxwriter.xlsx")
如果你是初学者,下面这几个部分是重点,值得仔细看看。
这里我们直接把原始数据放在 sales_data 列表里。这其实很符合很多真实项目的情况,因为数据不一定来自 Excel,也可能来自数据库查询结果、某个 API 的返回值、CSV 文件,或者是经过 pandas 处理后的结果。而 XlsxWriter 负责的,就是最后那个“导出报表”的环节。
代码里创建了一系列格式对象:header_format、title_format、money_format、text_format、bold_format。这是 XlsxWriter 非常典型的写法:先把各种格式定义好,再批量应用到不同的单元格上。
程序先把订单明细写入“订单明细”这个 Sheet。关键之处在于,金额列使用了 detail_sheet.write_number(row_num, col_num, value, money_format),这样 Excel 会把它当作数值对待,而不是文本,这对于后续的公式计算和格式统一非常重要。
这里使用了 defaultdict(float) 来高效地统计每个销售员和每个地区的总销售额,同时也计算了所有订单的总金额和平均订单金额。这几乎是所有自动报表里最常见的一类逻辑了。
这是 XlsxWriter 的强项之一。通过 chart = workbook.add_chart({"type": "column"}),你可以很方便地生成柱状图、折线图等图表,并精确地插入到报表的指定位置。
运行脚本后,你会得到一个 sales_report_xlsxwriter.xlsx 文件。打开它,你会看到:
对于很多办公自动化的需求来说,这已经是一份可以直接拿去交付的 Excel 报表了。
如果你在工作中经常遇到以下任务,那 XlsxWriter 是非常值得学习的工具:
一句话总结:当你的重点是“把数据优雅地输出成 Excel 文件”时,XlsxWriter 就是那个非常合适的工具。
很多初学者都会纠结这个问题。可以这样来记:
把这两个库的分工理解清楚,选型的时候就不会乱了。
这一点最重要,千万不要把它当作一个“万能 Excel 库”来用。
如果不关闭工作簿,文件可能不会正确写出,这是一个非常常见的坑。
像 write_number()、write_string()、write_formula() 这样的 API,语义更清晰,也能让报表结果的稳定性更好。
XlsxWriter 的定位是“输出”。复杂的清洗、转换、聚合操作,最好先在 Python 的逻辑层算好,然后再交给它去写到 Excel 里。
XlsxWriter 是一个非常适合做 Excel 报表输出的 Python 库。它最强的点不在于“读取现有工作簿”,而在于:
如果你经常需要把程序处理的结果导出给别人看,或者想把一些重复性的表格汇总工作自动化,XlsxWriter 非常值得掌握。对于 Python 学习者来说,它也是一个很好的练手方向,因为你能很快看到自己的代码变成实实在在的成果。
你现在更常遇到的是哪一类 Excel 需求?是读取旧表并修改,还是直接生成新报表,或者是批量导出业务数据,抑或做带图表的汇总文件?
如果愿意分享,下一篇可以继续写更实战的内容,比如:
pandas + XlsxWriter 自动导出多 Sheet 报表XlsxWriter 生成带条件格式的财务报表openpyxl 和 XlsxWriter 的实际选型对比也欢迎直接留言说说:你现在最想自动化掉的 Excel 工作,到底是哪一种?
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8