python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python XlsxWriter生成Excel并自动输出

Python使用XlsxWriter生成Excel并自动输出统计报表

作者:yuanpan

很多 Python 学习者在接触办公自动化时,都会很自然地想到一个需求:能不能用 Python 批量处理 Excel,并自动生成一份像样的统计报表?这篇文章会带你系统掌握 XlsxWriter 的核心用法,并通过一个完整案例,学会如何自动生成一份统计报表,需要的朋友可以参考下

引言

很多 Python 学习者在接触办公自动化时,都会很自然地想到一个需求:能不能用 Python 批量处理 Excel,并自动生成一份像样的统计报表?

如果你的目标是“高质量地生成 Excel 文件”,那么 XlsxWriter 是一个非常值得掌握的库。它特别适合做这些事情:

不过在正式开始之前,我先把一个关键点讲清楚:

XlsxWriter 的强项是创建和写出 Excel 文件,它不负责读取已有的 .xlsx 文件

也就是说,如果你需要“读取旧 Excel 再修改”,更适合用 openpyxl;如果你已经有了 Python 中的数据,想高质量输出一个新 Excel 报表,XlsxWriter 往往会更顺手。

这篇文章会带你系统掌握 XlsxWriter 的核心用法,并通过一个完整案例,学会如何自动生成一份统计报表。

1. XlsxWriter 是什么

XlsxWriter 是一个专门用于创建 Excel .xlsx 文件的 Python 库。

它适合这些典型场景:

openpyxl 相比,XlsxWriter 的定位更聚焦在“生成结果文件”这一端。

简单理解:

2. 先说结论:它为什么不适合读取已有 Excel

很多初学者看到名字时,会自然以为它和 openpyxl 一样,既能读也能写。

但实际情况是:

所以如果你的原始数据已经在:

那么 XlsxWriter 就很好用。

如果你的原始数据只存在于“某个现成 Excel 文件”里,通常会这样组合:

这也是实际工作中很常见的做法。

3. 安装 XlsxWriter

安装命令很简单:

pip install XlsxWriter

导入方式如下:

import xlsxwriter

如果没有报错,就说明安装成功了。

4. 先认识几个核心对象

XlsxWriter 时,最常见的对象有 3 个:

可以理解为:

Workbook -> Worksheet -> Cell Data + Format

其中 Format 很重要,因为 XlsxWriter 很擅长做“格式化输出”。

5. 最基础的 Excel 写入示例

先看一个最小可运行示例:

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_row() 会很方便。

6. 如何设置单元格样式

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 对象是统一复用的。也就是说:

这在生成正式报表时很常见。

7. 如何写公式和数字格式

自动报表往往离不开公式和金额格式。

例如:

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()

这里的重点是:

8. 为什么 XlsxWriter 特别适合生成统计报表

很多 Excel 自动化任务,本质上不是“改老表”,而是“把已有数据生成一份新报表”。

例如:

这时候 XlsxWriter 很合适,因为它在这些方面表现不错:

如果你想把脚本结果做成“领导能直接打开看”的 Excel 文件,它很有价值。

9. 实战案例:自动生成销售统计报表

下面我们做一个完整示例。

注意,这次我们不从 Excel 读取源数据,而是模拟“你的业务数据已经在 Python 中”。这更符合 XlsxWriter 的真实定位。

9.1 业务数据结构

假设程序里已经有一批销售明细:

日期销售员地区产品销售额
2026-04-01张三华东键盘5800
2026-04-01李四华北显示器7200
2026-04-02张三华东鼠标1600
2026-04-02王五华南笔记本12500
2026-04-03李四华北扩展坞2300

我们的目标是输出一个 sales_report_xlsxwriter.xlsx,其中包含:

10. 完整代码示例

下面这段代码可以直接运行:

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

    avg_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", avg_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")

11. 这段代码做了什么

如果你是初学者,建议重点看下面几部分。

第一步:准备业务数据

这里我们直接把原始数据放在 sales_data 列表里。

这其实很符合很多真实项目的情况,因为数据不一定来自 Excel,也可能来自:

XlsxWriter 负责的是最后的“导出报表”。

第二步:定义格式对象

代码里创建了这些格式:

这是 XlsxWriter 很典型的写法。你通常会先把各种格式定义好,再批量应用到不同单元格。

第三步:写入明细表

程序先把订单明细写进 订单明细 这个 Sheet。

其中金额列使用了:

detail_sheet.write_number(row_num, col_num, value, money_format)

这样 Excel 会把它按数值看待,而不是按文本。

第四步:统计汇总

这里使用 defaultdict(float) 来统计:

这是自动报表里最常见的一类逻辑。

第五步:插入图表

这一步是 XlsxWriter 的强项之一。

通过:

chart = workbook.add_chart({"type": "column"})

你可以很方便地生成柱状图、折线图等图表,并插入到报表中。

12. 运行后能得到什么结果

运行脚本后,你会得到一个:

其中包含:

对于很多办公自动化需求来说,这已经是一份能直接交付使用的 Excel 报表了。

13. XlsxWriter 的典型应用场景

如果你在工作里经常遇到以下任务,XlsxWriter 非常值得学:

一句话总结:

当你的重点是“把数据优雅地输出成 Excel 文件”时,XlsxWriter 很合适。

14. XlsxWriter 和 OpenPyXL 怎么选

很多初学者都会问这个问题。

可以这样记:

更适合用 XlsxWriter 的情况

更适合用 OpenPyXL 的情况

如果你把两者分工理解清楚,选型就不会乱。

15. 使用 XlsxWriter 的几个注意点

15.1 它不读取已有.xlsx

这一点最重要。不要把它当成“万能 Excel 库”。

15.2 别忘了workbook.close()

如果不关闭工作簿,文件可能不会正确写出。

15.3 数字、字符串、公式最好分开写

write_number()write_string()write_formula() 这样的 API,语义更清楚,也更利于报表结果稳定。

15.4 复杂数据处理最好先在 Python 里完成

XlsxWriter 的定位是“输出”。复杂清洗、转换、聚合最好先在 Python 逻辑里算好,再交给它写到 Excel。

16. 总结

XlsxWriter 是一个非常适合做 Excel 报表输出的 Python 库。

它最强的地方不是“读取现有工作簿”,而是:

如果你经常需要把程序结果导出给别人看,或者想把重复的表格汇总工作自动化,XlsxWriter 很值得掌握。

对于 Python 学习者来说,它也是一个很好的练手方向,因为你能很快把代码变成实际成果。

17. 留言互动

你现在更常遇到的是哪一类 Excel 需求:

如果你愿意,我下一篇可以继续写更实战一点的内容,比如:

也欢迎你直接留言说说:你现在最想自动化掉的 Excel 工作,到底是哪一种?

以上就是Python使用XlsxWriter生成Excel并自动输出统计报表的详细内容,更多关于Python XlsxWriter生成Excel并自动输出的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文