报表系列"/>
Python报表系列
2019年7月16日15:45:02
前言
在Python环境下生成docx格式的报表,这里以折线图、柱状图、散点图、饼状图和表格举例。这里使用python-docx第三方库来处理docx文件,但问题在于该库暂时不支持折线图等图表的插入,官网和国外论坛的处理方法暂时也是 "生成折线图的图表图片,然后利用python-docx插入该图片"。
这里选用第三方库Matplotlib来生成图表图片,详细介绍可查看该博客的Matplotlib专栏。直接上代码,不截图了,根据自己需要调整代码即可。
环境
Python 3.6
python-docx(PDF处理的第三方库,默认不支持中文)
matplotlib (用来生成图表图片)
SimHei.ttf 字体文件 (用来处理中文显示乱码问题)
准备
- 1、pip install python-docx
- 2、pip install matplotlib
- 3、下载SimHei.ttf字体文件,放在所要执行的py文件同一目录下
百度网盘链接:
链接:
提取码:caxj 下载是一个压缩文件,自行解压后字体文件为SimHei.ttf即可,原字体文件百度网盘分享失败,提示包含敏感信息,只能压缩后分享。
代码如下:
demo_docx.py (主要执行文件)
# demo_docx.py
from docx import Document
from docx.shared import Inches
from word_tool import plt_bar, plt_plot, plt_pie, plt_scatterdocument = Document()# title
document.add_heading('Document Title', 0)# paragraph
p = document.add_paragraph('A plain paragraph having some ')
p.add_run('bold').bold = True # bold
p.add_run(' and some ')
p.add_run('italic.').italic = True # italicdocument.add_heading('Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='Intense Quote')document.add_paragraph('first item in unordered list', style='List Bullet'
)
document.add_paragraph('first item in ordered list', style='List Number'
)# make picturex_names = ['group_a', 'group_b', 'group_c']
y_values = [1, 10, 100]
plt_bar(x_names, y_values, "柱状图.jpg")
plt_plot(x_names, y_values, "折线图.jpg")
plt_scatter(x_names, y_values, "散点图.jpg")labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]
plt_pie(labels, sizes, "饼状图.jpg")document.add_picture('柱状图.jpg', width=Inches(6.25))
document.add_picture('折线图.jpg', width=Inches(6.25))
document.add_picture('饼状图.jpg', width=Inches(6.25))
document.add_picture('散点图.jpg', width=Inches(6.25))records = ((3, '101', 'Spam'),(7, '422', 'Eggs'),(4, '631', 'Spam, spam, eggs, and spam')
)table = document.add_table(rows=1, cols=3)
hdr_cells = table.rows[0].cells
hdr_cells[0].text = 'Qty'
hdr_cells[1].text = 'Id'
hdr_cells[2].text = 'Desc'
for qty, id, desc in records:row_cells = table.add_row().cellsrow_cells[0].text = str(qty)row_cells[1].text = idrow_cells[2].text = desc# next pages
document.add_page_break()document.save('demo.docx')
word_tool.py (所要调用文件)
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm# for chinese show
plt.rcParams['axes.unicode_minus'] = False
myfont = fm.FontProperties(fname='SimHei.ttf')"""
bar
"""def plt_bar(names, values, picture):plt.figure(figsize=(9, 3))plt.bar(names, values) # barplt.suptitle('柱状图', fontproperties=myfont)plt.savefig(picture) # eps, jpeg, jpg, pdf, pgf, png, ps, raw, rgba, svg, svgz, tif, tiff 都可以# plt.show()"""
line
"""def plt_plot(names, values, picture):plt.figure(figsize=(9, 3))plt.plot(names, values) # lineplt.suptitle('折线图', fontproperties=myfont)plt.savefig(picture) # eps, jpeg, jpg, pdf, pgf, png, ps, raw, rgba, svg, svgz, tif, tiff 都可以# plt.show()"""
pie
"""def plt_pie(labels, sizes, picture):# Pie chart, where the slices will be ordered and plotted counter-clockwise:explode = (0, 0.1, 0, 0) # only "explode" the 2nd slice (i.e. 'Hogs')fig1, ax1 = plt.subplots()ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',shadow=True, startangle=90)ax1.axis('equal') # Equal aspect ratio ensures that pie is drawn as a circle.plt.suptitle('饼状图', fontproperties=myfont)plt.savefig(picture) # eps, jpeg, jpg, pdf, pgf, png, ps, raw, rgba, svg, svgz, tif, tiff 都可以# plt.show()"""
scatter
"""def plt_scatter(names, values, picture):plt.figure(figsize=(9, 3))plt.scatter(names, values) # scatterplt.suptitle('散点图', fontproperties=myfont)plt.savefig(picture) # eps, jpeg, jpg, pdf, pgf, png, ps, raw, rgba, svg, svgz, tif, tiff 都可以# plt.show()if __name__ == '__main__':names = ['group_a', 'group_b', 'group_c']values = [1, 10, 100]labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'sizes = [15, 30, 45, 10]plt_bar(names, values, "柱状图.jpg")plt_plot(names, values, "折线图.jpg")plt_pie(labels, sizes, "饼状图.jpg")plt_scatter(names, values, "散点图.jpg")
运行
python demo_docx.py
运行上述代码即可查看生成docx文件,打开查看。
更多推荐
Python报表系列
发布评论