Python脚本如何生成Word报告

wen 实用脚本 1

本文目录导读:

Python脚本如何生成Word报告

  1. 使用python-docx(最常用)
  2. 高级样式设置
  3. 使用其他库
  4. 从模板生成报告
  5. 实战:完整的报告生成函数
  6. 最佳实践建议

我来介绍几种在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)

最佳实践建议

  1. 使用模板:对于固定格式的报告,使用模板更高效
  2. 异常处理:添加try-except处理文件操作
  3. 内存管理:处理大量图片时注意内存使用
  4. 版本兼容:python-docx不支持.docx格式以外的文档

选择哪种方法取决于你的具体需求:

  • 简单报告:python-docx
  • 复杂格式:ReportLab
  • 模板化:基于模板的生成方式
  • 数据分析报告:结合pandas和python-docx

抱歉,评论功能暂时关闭!