当前位置: 首页 > news >正文

Python XlsxWriter 实战:生成 Excel 并自动输出统计报表,帮你高效完成表格工作

Python XlsxWriter 实战:生成 Excel 并自动输出统计报表,帮你高效完成表格工作

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

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

  • 批量写入 Excel 数据
  • 设置单元格格式和样式
  • 写公式
  • 插入图表
  • 生成日报、周报、月报
  • 输出适合直接交付的统计报表

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

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

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

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

1. XlsxWriter 是什么

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

它适合这些典型场景:

  • 把 Python 里的列表、字典、统计结果写成 Excel
  • 自动生成格式统一的业务报表
  • 创建带公式、条件格式、图表的工作簿
  • 输出给同事、领导、客户直接查看的 Excel 文件

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

简单理解:

  • openpyxl:更适合“读 + 改 + 保存”
  • XlsxWriter:更适合“从 0 开始生成一份漂亮的 Excel”

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

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

但实际情况是:

  • XlsxWriter可以创建新的.xlsx
  • 可以写工作表、写单元格、写公式、写图表
  • 不能打开一个已有 Excel 文件再去读取内容

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

  • Python 列表
  • 字典
  • 数据库查询结果
  • CSV 文件
  • pandas.DataFrame

那么XlsxWriter就很好用。

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

  • openpyxlpandas读取数据
  • XlsxWriter负责输出最终报表

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

3. 安装 XlsxWriter

安装命令很简单:

pipinstallXlsxWriter

导入方式如下:

importxlsxwriter

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

4. 先认识几个核心对象

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

  • Workbook:整个 Excel 文件
  • Worksheet:工作表
  • Format:单元格格式对象

可以理解为:

Workbook -> Worksheet -> Cell Data + Format

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

5. 最基础的 Excel 写入示例

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

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

6. 如何设置单元格样式

XlsxWriter很大的优势之一,就是对 Excel 格式控制比较友好。

比如我们给表头加粗、加背景色:

importxlsxwriter 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. 如何写公式和数字格式

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

例如:

importxlsxwriter 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:控制金额、百分比、日期等显示格式

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,其中包含:

  • 原始订单明细 Sheet
  • 统计报表 Sheet
  • 总订单数、总销售额、平均订单金额
  • 按销售员汇总
  • 按地区汇总
  • 销售员业绩柱状图

10. 完整代码示例

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

fromcollectionsimportdefaultdictimportxlsxwriter 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],]defbuild_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=["日期","销售员","地区","产品","销售额"]forcol,headerinenumerate(headers):detail_sheet.write(0,col,header,header_format)forrow_num,row_datainenumerate(sales_data,start=1):forcol_num,valueinenumerate(row_data):ifcol_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=0order_count=0forsale_date,seller,region,product,amountinsales_data:seller_total[seller]+=amount region_total[region]+=amount total_amount+=amount order_count+=1avg_amount=total_amount/order_countiforder_countelse0summary_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=8seller_items=sorted(seller_total.items(),key=lambdaitem:item[1],reverse=True)forindex,(seller,amount)inenumerate(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)+3summary_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=lambdaitem:item[1],reverse=True)forindex,(region,amount)inenumerate(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,也可能来自:

  • 数据库查询结果
  • 接口返回值
  • 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"})

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

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

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

  • sales_report_xlsxwriter.xlsx

其中包含:

  • 原始明细表
  • 统计报表
  • 总订单数
  • 总销售额
  • 平均订单金额
  • 销售员汇总
  • 地区汇总
  • 柱状图

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

13. XlsxWriter 的典型应用场景

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

  • 把程序统计结果导出成 Excel
  • 生成带格式的日报、周报、月报
  • 输出财务汇总表
  • 生成销售绩效报表
  • 做项目数据周报
  • 导出接口数据给业务同事查看

一句话总结:

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

14. XlsxWriter 和 OpenPyXL 怎么选

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

可以这样记:

更适合用 XlsxWriter 的情况

  • 你要新建 Excel 文件
  • 你要输出格式化报表
  • 你要插入图表和公式
  • 你的原始数据已经在 Python 中

更适合用 OpenPyXL 的情况

  • 你要读取已有 Excel
  • 你要修改旧工作簿
  • 你要基于已有模板做细粒度修改

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

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 库。

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

  • 把已有数据写成结构化 Excel
  • 控制样式和格式
  • 插入公式和图表
  • 自动生成可直接交付的统计报表

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

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

17. 留言互动

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

  • 读取旧表并修改
  • 直接生成新报表
  • 批量导出业务数据
  • 做带图表的汇总文件

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

  • pandas + XlsxWriter自动导出多 Sheet 报表
  • XlsxWriter生成带条件格式的财务报表
  • openpyxlXlsxWriter的实际选型对比

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

我可以按大家最常见的场景,继续整理更贴近实际工作的 Python 表格自动化教程。

http://www.jsqmd.com/news/694003/

相关文章:

  • LDBlockShow深度解析:高性能连锁不平衡热图绘制技术全攻略
  • 如何永久备份微信聊天记录:WeChatMsg完整数据导出指南
  • C23标准内存安全扩展深度解密(std::memsec.h草案+bounded_array_t+safe_ptr_t),2026年前必须掌握的5个迁移路径
  • Mem Reduct终极指南:Windows内存清理与实时监控的完整教程
  • JAVA-企业级 ERP 系统开发方案--需求分析与详细开发流程
  • LM文生图教程:如何用LM生成符合小红书封面尺寸的1242x1560图
  • 从理想模型到物理实现:基于ADS DemoKit的切比雪夫滤波器MMIC设计实战
  • 深入浅出聊信号发生器:用运放搭建可调波形电路,避开那些课本没讲的坑
  • 五一长沙开福寺附近住宿推荐,美团5折起+990元券,省心又省钱 - 资讯焦点
  • 若依框架v3.8.6实战:为小程序/APP独立设计用户表与登录接口(复用后台安全体系)
  • 经管科研数据选择指南:如何找到适合你研究的数据
  • # 软考软件设计师 · 每日一练 | 2026-04-21
  • 2026年值得收藏的素材网站推荐,含人物、背景图片、插画、样机、节日素材 - 品牌2025
  • 3步实现双层PDF转换:让扫描文档重获编辑与搜索能力
  • PDF工具箱不止mutool:对比Python pdfplumber与命令行工具的高效用法
  • Midscene.js系统级性能调优深度解析:从架构到工程实践的实战指南
  • 2026版企业免费商用字体+个人商用免费字体推荐,安全商用不踩坑 - 品牌2025
  • 从“七桥问题”到快递路线规划:用Python NetworkX玩转图论基础概念
  • 去洛阳看花怎么订酒店最合适?美团住宿活动直达,少花一半钱 - 资讯焦点
  • 2026年自费出书流程与机构选择指南 - 科技焦点
  • SAP ABAP弹窗实战:告别硬编码,用POPUP_TO_CONFIRM_STEP和POPUP_GET_VALUES优雅交互
  • 程序员面试最常被问的10道题,答对7道算你厉害(文末免费领简历模板)
  • 免费网盘下载助手终极指南:解锁六大云盘高速下载通道
  • 如何快速掌握QQ截图独立版:免登录专业截图工具的3大核心功能
  • 抖音视频批量下载神器:从新手到高手的完整指南
  • 避开这3个坑,你的微型内窥镜成像才清晰:镜片选型、装配公差与照明实战心得
  • DeepSeek V4 预览版实测:Agent、世界知识、推理能力,跟 V3 和 GPT-5.5/Claude 4.6 比到底什么水平?
  • 物联网设备OTA升级避坑指南:Bootloader设计中的5个关键细节与常见错误
  • 告别打印难题:在Vue中优雅集成Lodop/C-Lodop实现网页精准打印
  • 【QML】QML中界面与业务逻辑分离的思路