如何写一个脚本自动生成年度报告

wen 实用脚本 3

本文目录导读:

如何写一个脚本自动生成年度报告

  1. 方法一:基于静态模板(最简单,适合纯文本/表格报告)
  2. 方法二:生成动态图表报告(适合数据分析师)
  3. 方法三:从数据库自动拉取并生成(企业级)
  4. 方法四:使用低代码/BI工具(无需写太多代码)
  5. 完整脚本的通用结构建议
  6. 进阶技巧
  7. 注意事项

编写一个自动生成年度报告的脚本需要结合数据收集、模板渲染、图表生成和文档输出,根据你的技术水平和报告来源(数据库、Excel、在线API),有几种不同难度的方案。

以下是几种主流的实现思路和代码示例(以Python为例,因为它最通用):

基于静态模板(最简单,适合纯文本/表格报告)

如果你的年度报告主要是文字和表格(如:销售额、用户数),可以使用 Jinja2 + Python 生成 Word/HTML/文本文件。

步骤:

  1. 准备模板:创建一个 report_template.htmlreport_template.docx 文件,用 {{ variable }} 占位。
  2. 准备数据:从数据库或CSV中提取数据。
  3. 渲染并输出

核心代码示例(Python + HTML输出):

import json
from datetime import datetime
from jinja2 import Environment, FileSystemLoader
# 模拟数据(通常从数据库或API获取)
data = {
    "year": 2024,
    "company_name": "XX科技",
    "total_revenue": 12345678.90,
    "growth_rate": 15.6,
    "user_count": 50000,
    "top_product": "智能手环",
    "report_date": datetime.now().strftime("%Y年%m月%d日")
}
# 加载模板
env = Environment(loader=FileSystemLoader('.'))
template = env.get_template('report_template.html')
# 渲染
output = template.render(data)
# 保存为HTML文件
with open(f'年度报告_{data["year"]}.html', 'w', encoding='utf-8') as f:
    f.write(output)
print(f"报告已生成:年度报告_{data['year']}.html")
# 可选:使用pdfkit转换为PDF
# import pdfkit
# pdfkit.from_string(output, f'年度报告_{data["year"]}.pdf')

模板文件 report_template.html 示例:

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>{{ company_name }} {{ year }}年度报告</title></head>
<body>
<h1>{{ company_name }} {{ year }}年度报告</h1>
<h2>核心数据</h2>
<ul>
    <li>总收入:¥{{ "%.2f"|format(total_revenue) }}</li>
    <li>同比增长:{{ growth_rate }}%</li>
    <li>服务用户数:{{ user_count }} 人</li>
    <li>最受欢迎产品:{{ top_product }}</li>
</ul>
<p>报告生成日期:{{ report_date }}</p>
</body>
</html>

生成动态图表报告(适合数据分析师)

如果你的报告需要包含折线图、柱状图(月度趋势、部门对比),使用 Matplotlib + Word/Python-pptx

步骤:

  1. pandas 读取数据。
  2. matplotlib 生成图表并保存为图片。
  3. python-docxpython-pptx 将图片和文字组合成文档。

核心代码示例(生成带图表的Word文档):

import pandas as pd
import matplotlib.pyplot as plt
from docx import Document
from docx.shared import Inches
import os
# 1. 模拟数据(例如每月销售额)
months = ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月']
sales = [120, 135, 150, 142, 160, 175, 190, 185, 200, 210, 195, 220]
df = pd.DataFrame({'月份': months, '销售额(万元)': sales})
# 2. 生成图表
plt.figure(figsize=(10, 6))
plt.plot(df['月份'], df['销售额(万元)'], marker='o', linestyle='-', color='b')'2024年度销售额趋势图')
plt.xlabel('月份')
plt.ylabel('销售额(万元)')
plt.grid(True, linestyle='--', alpha=0.7)
plt.tight_layout()
chart_path = 'sales_trend.png'
plt.savefig(chart_path)
plt.close()
# 3. 生成Word报告
doc = Document()
doc.add_heading('2024年度销售报告', 0)
# 添加文字段落
doc.add_paragraph(f'全年总销售额:{df["销售额(万元)"].sum()} 万元')
doc.add_paragraph(f'月度最高销售额:{df["销售额(万元)"].max()} 万元({df.loc[df["销售额(万元)"].idxmax(), "月份"]})')
doc.add_paragraph('月度销售趋势如下:')
# 插入图表
doc.add_picture(chart_path, width=Inches(6))
# 添加表格
doc.add_heading('月度数据明细', level=2)
table = doc.add_table(rows=len(df)+1, cols=2)
table.style = 'Light Shading Accent 1'
# 表头
table.cell(0,0).text = '月份'
table.cell(0,1).text = '销售额(万元)'
# 填充数据
for i, row in df.iterrows():
    table.cell(i+1, 0).text = str(row['月份'])
    table.cell(i+1, 1).text = str(row['销售额(万元)'])
# 保存
doc.save('年度销售报告_2024.docx')
os.remove(chart_path)  # 清理临时图片
print("Word报告已生成:年度销售报告_2024.docx")

从数据库自动拉取并生成(企业级)

如果数据在 MySQL/PostgreSQL 中,脚本可以定时执行(如:每天凌晨3点,但年报通常只需跑一次)。

要点:

import pymysql
# 连接数据库
conn = pymysql.connect(host='localhost', user='root', password='pass', db='your_db')
cursor = conn.cursor()
# 执行SQL
sql = "SELECT SUM(amount) as total, COUNT(*) as orders FROM orders WHERE YEAR(order_date) = 2024"
cursor.execute(sql)
result = cursor.fetchone()
total_revenue = result[0]
total_orders = result[1]
cursor.close()
conn.close()

然后将 total_revenue 代入上述的模板或Word脚本中。


使用低代码/BI工具(无需写太多代码)

如果你的目标是“快速自动化”但不想维护复杂脚本,可以考虑:

  1. Excel VBA:如果数据在Excel中,可以用宏自动生成图表和总结页面。
  2. Python + Jupyter Notebook:编写一次notebook,每次修改数据源后运行所有单元格。
  3. BI工具(如PowerBI、Tableau、Metabase):配置好数据源和看板后,直接导出为PDF报告(但自动化发布可能需要Pro版)。

完整脚本的通用结构建议

generate_annual_report.py
├── 1. 配置模块 (config.py):数据库连接、路径、报告年份
├── 2. 数据获取模块 (data_fetcher.py):从DB/API/CSV拉取数据
├── 3. 分析计算模块 (analyzer.py):计算增长率、排行、统计
├── 4. 图表引擎 (chart_engine.py):生成必要图表
├── 5. 报告组装器 (report_builder.py):填入模板或构建文档
└── 6. 主入口 (main.py):按顺序调用上述模块

主入口 main.py 示例:

def main():
    year = 2024
    data = fetch_data(year)           # 从数据库读取
    analysis = calculate_kpi(data)    # 计算KPI
    charts = generate_charts(analysis) # 保存图表到临时文件
    build_report(analysis, charts)    # 合并成Word/PDF/HTML
    print(f"{year}年度报告已生成!")
if __name__ == "__main__":
    main()

进阶技巧

  • 发送邮件:生成报告后自动通过 smtplib 发送给领导。
  • 参数化年份:脚本接受一个年份参数(如 python report.py 2024),可以一次生成多年。
  • 异常处理:如果某个月份数据缺失,自动填充为0或跳过。
  • 日志记录:使用 logging 记录脚本运行过程和报错。

注意事项

  1. 图表美化:使用 seabornplotly 替代 matplotlib 可以得到更美观的图表。
  2. PDF输出:Word文档转换为PDF比较麻烦,推荐直接生成 PDF(使用 reportlabweasyprint,或者先HTML再转PDF)。
  3. 中文字体:在图表中显示中文时,需要指定系统已安装的中文字体(如 SimHeiMicrosoft YaHei)。
  4. 数据敏感:避免在脚本中明文存储数据库密码,建议使用环境变量或配置文件。

你可以根据你的数据来源(Excel、数据库、在线平台API)和输出格式(Word、PDF、网页)选择最适合的方法,如果提供更具体的需求(如数据源类型、报告篇幅、是否有复杂图表),我可以给你更精确的代码片段。

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