本文目录导读:

我来介绍几种在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
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播