本文目录导读:

我来介绍几种在Python中生成Word报告的方法:
使用python-docx(最常用)
安装
pip install python-docx
基本用法示例
from docx import Document
from docx.shared import Inches, Pt, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.style import WD_STYLE_TYPE
import datetime
def create_report():
# 创建文档
doc = Document()
# 1. 添加标题= doc.add_heading('数据分析报告', level=0)alignment = WD_ALIGN_PARAGRAPH.CENTER
# 2. 添加副标题
subtitle = doc.add_paragraph()
subtitle.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = subtitle.add_run(f'生成日期:{datetime.datetime.now().strftime("%Y-%m-%d")}')
run.font.size = Pt(12)
run.font.color.rgb = RGBColor(128, 128, 128)
# 3. 添加章节
doc.add_heading('一、概述', level=1)
p = doc.add_paragraph()
p.add_run('这是报告的内容').bold = True
p.add_run(',这是普通文本。')
# 4. 添加列表
doc.add_heading('二、主要发现', level=1)
items = ['发现1:数据增长20%', '发现2:用户满意度提升', '发现3:成本降低15%']
for item in items:
doc.add_paragraph(item, style='List Bullet')
# 5. 添加表格
doc.add_heading('三、数据表格', level=1)
table = doc.add_table(rows=4, cols=3)
table.style = 'Light Grid Accent 1'
# 表头
headers = ['指标', '上季度', '本季度']
for i, header in enumerate(headers):
cell = table.rows[0].cells[i]
cell.text = header
cell.paragraphs[0].runs[0].bold = True
# 数据
data = [
['收入', '100万', '120万'],
['用户数', '1000', '1200'],
['满意度', '85%', '92%']
]
for row_idx, row_data in enumerate(data, 1):
for col_idx, cell_data in enumerate(row_data):
table.rows[row_idx].cells[col_idx].text = cell_data
# 6. 添加图片
doc.add_heading('四、图表分析', level=1)
# doc.add_picture('chart.png', width=Inches(5))
# 7. 添加分页
doc.add_page_break()
# 8. 设置页面大小
section = doc.sections[0]
section.page_width = Cm(21)
section.page_height = Cm(29.7)
# 保存文档
doc.save('数据报告.docx')
print("报告生成成功!")
# 运行
create_report()
高级样式设置
from docx import Document
from docx.shared import Pt, RGBColor, Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn
def create_styled_report():
doc = Document()
# 自定义样式
style = doc.styles['Normal']
font = style.font
font.name = 'Microsoft YaHei'
font.size = Pt(11)
style.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei')
# 标题样式
heading = doc.styles['Heading 1']
heading.font.color.rgb = RGBColor(0, 51, 102)
heading.font.size = Pt(16)
# 添加内容
p = doc.add_paragraph()
run = p.add_run('重要的内容')
run.font.size = Pt(14)
run.font.color.rgb = RGBColor(255, 0, 0)
run.font.bold = True
# 设置段落间距
p.paragraph_format.space_before = Pt(12)
p.paragraph_format.space_after = Pt(12)
p.paragraph_format.line_spacing = 1.5
# 添加页眉页脚
section = doc.sections[0]
header = section.header
header_para = header.paragraphs[0]
header_para.text = "公司机密文件"
footer = section.footer
footer_para = footer.paragraphs[0]
footer_para.text = "第 1 页"
doc.save('样式化报告.docx')
使用其他库
使用 ReportLab(更专业的PDF/Word生成)
# 安装:pip install reportlab
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import inch
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, Image
def create_reportlab_report():
doc = SimpleDocTemplate("reportlab_report.pdf", pagesize=A4)
styles = getSampleStyleSheet()
story = []
# 标题= Paragraph("数据分析报告", styles['Title'])
story.append(title)
# 内容
story.append(Spacer(1, 0.5*inch))
text = """这是报告的主体内容,我们可以在这里写很多文字,
可以使用HTML标签来格式化文本。<b>粗体</b>和<i>斜体</i>等。"""
p = Paragraph(text, styles['Normal'])
story.append(p)
# 表格
data = [['名称', '数值', '备注'],
['指标1', '100', '正常'],
['指标2', '200', '注意'],
['指标3', '300', '警告']]
table = Table(data)
story.append(table)
# 生成
doc.build(story)
print("报告生成成功!")
从模板生成报告
from docx import Document
import json
def generate_from_template(template_path, data_dict):
"""
从模板生成报告
data_dict: {'{{name}}': '张三', '{{date}}': '2024-01-01'}
"""
doc = Document(template_path)
# 替换文本
for paragraph in doc.paragraphs:
for key, value in data_dict.items():
if key in paragraph.text:
for run in paragraph.runs:
if key in run.text:
run.text = run.text.replace(key, value)
# 替换表格中的文本
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
for paragraph in cell.paragraphs:
for key, value in data_dict.items():
if key in paragraph.text:
for run in paragraph.runs:
if key in run.text:
run.text = run.text.replace(key, str(value))
doc.save('生成的报告.docx')
# 使用示例
template_data = {
'{{title}}': '月度销售报告',
'{{date}}': '2024年1月',
'{{sales}}': '1,000,000元',
'{{profit}}': '200,000元'
}
# generate_from_template('模板.docx', template_data)
实战:完整的报告生成函数
import pandas as pd
from docx import Document
from docx.shared import Inches, Pt
from docx.enum.text import WD_ALIGN_PARAGRAPH
import matplotlib.pyplot as plt
import io
def generate_comprehensive_report(data_df, report_name="分析报告"):
"""
生成包含数据分析的完整报告
data_df: pandas DataFrame
"""
doc = Document()
# 设置标题
doc.add_heading(f'{report_name}', level=0)
# 1. 数据概览
doc.add_heading('数据概览', level=1)
overview = f"""
数据集包含 {data_df.shape[0]} 行,{data_df.shape[1]} 列。
时间范围:{data_df.index.min()} 至 {data_df.index.max()}
"""
doc.add_paragraph(overview.strip())
# 2. 数据统计
doc.add_heading('基本统计', level=1)
stats_df = data_df.describe()
# 创建统计表格
table = doc.add_table(rows=len(stats_df)+1, cols=len(stats_df.columns)+1)
table.style = 'Light Grid Accent 1'
# 表头
table.rows[0].cells[0].text = '统计量'
for j, col in enumerate(stats_df.columns, 1):
table.rows[0].cells[j].text = col
# 数据
for i, index in enumerate(stats_df.index, 1):
table.rows[i].cells[0].text = index
for j, col in enumerate(stats_df.columns, 1):
table.rows[i].cells[j].text = f'{stats_df.loc[index, col]:.2f}'
# 3. 可视化(可选)
doc.add_heading('趋势图', level=1)
# 生成图表
fig, ax = plt.subplots(figsize=(8, 4))
data_df.plot(ax=ax)
plt.title('数据趋势')
plt.legend(loc='best')
# 保存到内存并插入文档
img_buffer = io.BytesIO()
plt.savefig(img_buffer, format='png', dpi=300, bbox_inches='tight')
plt.close()
img_buffer.seek(0)
doc.add_picture(img_buffer, width=Inches(5))
# 保存
doc.save(f'{report_name}.docx')
print(f"报告已保存为 {report_name}.docx")
return doc
# 使用示例
# df = pd.read_csv('your_data.csv')
# generate_comprehensive_report(df)
最佳实践建议
- 使用模板:对于固定格式的报告,使用模板更高效
- 异常处理:添加try-except处理文件操作
- 内存管理:处理大量图片时注意内存使用
- 版本兼容:python-docx不支持.docx格式以外的文档
选择哪种方法取决于你的具体需求:
- 简单报告:python-docx
- 复杂格式:ReportLab
- 模板化:基于模板的生成方式
- 数据分析报告:结合pandas和python-docx