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 文件”里通常会这样组合用openpyxl或pandas读取数据用XlsxWriter负责输出最终报表这也是实际工作中很常见的做法。3. 安装 XlsxWriter安装命令很简单pipinstallXlsxWriter导入方式如下importxlsxwriter如果没有报错就说明安装成功了。4. 先认识几个核心对象用XlsxWriter时最常见的对象有 3 个Workbook整个 Excel 文件Worksheet工作表Format单元格格式对象可以理解为Workbook - Worksheet - Cell Data Format其中Format很重要因为XlsxWriter很擅长做“格式化输出”。5. 最基础的 Excel 写入示例先看一个最小可运行示例importxlsxwriter workbookxlsxwriter.Workbook(sales_demo.xlsx)worksheetworkbook.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 workbookxlsxwriter.Workbook(format_demo.xlsx)worksheetworkbook.add_worksheet(示例)header_formatworkbook.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 workbookxlsxwriter.Workbook(formula_demo.xlsx)worksheetworkbook.add_worksheet(统计)money_formatworkbook.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张三华东键盘58002026-04-01李四华北显示器72002026-04-02张三华东鼠标16002026-04-02王五华南笔记本125002026-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):workbookxlsxwriter.Workbook(output_file)detail_sheetworkbook.add_worksheet(订单明细)summary_sheetworkbook.add_worksheet(统计报表)header_formatworkbook.add_format({bold:True,font_color:white,bg_color:#4F81BD,align:center,valign:vcenter,border:1,})title_formatworkbook.add_format({bold:True,font_size:16,})money_formatworkbook.add_format({num_format:#,##0.00,border:1,})text_formatworkbook.add_format({border:1,})bold_formatworkbook.add_format({bold:True,})headers[日期,销售员,地区,产品,销售额]forcol,headerinenumerate(headers):detail_sheet.write(0,col,header,header_format)forrow_num,row_datainenumerate(sales_data,start1):forcol_num,valueinenumerate(row_data):ifcol_num4: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_totaldefaultdict(float)region_totaldefaultdict(float)total_amount0order_count0forsale_date,seller,region,product,amountinsales_data:seller_total[seller]amount region_total[region]amount total_amountamount order_count1avg_amounttotal_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_row8seller_itemssorted(seller_total.items(),keylambdaitem:item[1],reverseTrue)forindex,(seller,amount)inenumerate(seller_items,start1):summary_sheet.write(seller_start_rowindex,0,seller,text_format)summary_sheet.write_number(seller_start_rowindex,1,amount,money_format)region_title_rowseller_start_rowlen(seller_items)3summary_sheet.write(region_title_row,0,按地区汇总,bold_format)summary_sheet.write(region_title_row1,0,地区,header_format)summary_sheet.write(region_title_row1,1,销售额,header_format)region_itemssorted(region_total.items(),keylambdaitem:item[1],reverseTrue)forindex,(region,amount)inenumerate(region_items,start1):summary_sheet.write(region_title_row1index,0,region,text_format)summary_sheet.write_number(region_title_row1index,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)chartworkbook.add_chart({type:column})chart.add_series({name:销售员业绩,categories:[统计报表,seller_start_row1,0,seller_start_rowlen(seller_items),0],values:[统计报表,seller_start_row1,1,seller_start_rowlen(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_formattitle_formatmoney_formattext_formatbold_format这是XlsxWriter很典型的写法。你通常会先把各种格式定义好再批量应用到不同单元格。第三步写入明细表程序先把订单明细写进订单明细这个 Sheet。其中金额列使用了detail_sheet.write_number(row_num,col_num,value,money_format)这样 Excel 会把它按数值看待而不是按文本。第四步统计汇总这里使用defaultdict(float)来统计每个销售员的总销售额每个地区的总销售额所有订单的总金额平均订单金额这是自动报表里最常见的一类逻辑。第五步插入图表这一步是XlsxWriter的强项之一。通过chartworkbook.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生成带条件格式的财务报表openpyxl和XlsxWriter的实际选型对比也欢迎你直接留言说说你现在最想自动化掉的 Excel 工作到底是哪一种我可以按大家最常见的场景继续整理更贴近实际工作的 Python 表格自动化教程。