在数据处理和业务分析场景中,定期生成格式统一的分析报告是高频需求,通过Python可以实现从数据读取、分析计算到PDF和Excel文件输出的全流程自动化,避免重复的人工操作。

核心依赖库介绍
实现PDF和Excel输出需要用到以下常用库:
- pandas:用于数据读取、清洗和分析计算,是处理结构化数据的核心工具
- openpyxl:用于生成和编辑Excel文件,支持设置单元格样式、合并单元格等操作
- reportlab:用于生成PDF文件,支持添加文本、表格、图片等元素,可自定义排版样式
- matplotlib:用于生成分析图表,可导出为图片插入到PDF报告中
Excel报告生成实现
首先演示如何将分析结果输出为Excel文件,包含数据表和简单的统计结果。
基础Excel输出示例
以下代码实现读取CSV数据,计算基础统计指标,输出到Excel文件并设置基础样式:
import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import Font, Alignment
# 读取原始数据,假设数据文件为sales_data.csv,包含日期、销售额、地区字段
data = pd.read_csv("sales_data.csv")
# 计算各地区总销售额
region_sales = data.groupby("地区")["销售额"].sum().reset_index()
# 输出到Excel文件
with pd.ExcelWriter("销售分析报告.xlsx", engine="openpyxl") as writer:
# 写入原始数据表
data.to_excel(writer, sheet_name="原始数据", index=False)
# 写入统计结果表
region_sales.to_excel(writer, sheet_name="地区销售统计", index=False)
# 获取工作簿对象,设置表头样式
workbook = writer.book
for sheet_name in writer.sheets:
worksheet = writer.sheets[sheet_name]
# 设置表头字体为加粗,居中对齐
for cell in worksheet[1]:
cell.font = Font(bold=True)
cell.alignment = Alignment(horizontal="center")
# 设置列宽自适应
for column in worksheet.columns:
max_length = 0
column_letter = column[0].column_letter
for cell in column:
try:
if len(str(cell.value)) > max_length:
max_length = len(str(cell.value))
except:
pass
adjusted_width = (max_length + 2) * 1.2
worksheet.column_dimensions[column_letter].width = adjusted_width
print("Excel报告生成完成")
PDF报告生成实现
PDF报告适合用于正式的场景分发,以下演示如何生成包含分析结论、表格和图表的PDF文件。
基础PDF输出示例
以下代码实现生成包含标题、统计表格、分析结论的PDF报告:
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.platypus import SimpleDocTemplate, Paragraph, Table, TableStyle
from reportlab.lib import colors
import pandas as pd
import matplotlib.pyplot as plt
# 先生成分析图表并保存为图片
data = pd.read_csv("sales_data.csv")
region_sales = data.groupby("地区")["销售额"].sum().reset_index()
plt.figure(figsize=(8, 4))
plt.bar(region_sales["地区"], region_sales["销售额"])
plt.title("各地区销售额对比")
plt.xlabel("地区")
plt.ylabel("销售额")
plt.savefig("sales_chart.png", dpi=100, bbox_inches="tight")
plt.close()
# 生成PDF报告
doc = SimpleDocTemplate("销售分析PDF报告.pdf", pagesize=A4)
styles = getSampleStyleSheet()
# 自定义标题样式
title_style = ParagraphStyle(
name="TitleStyle",
parent=styles["Heading1"],
fontSize=16,
alignment=1, # 居中对齐
spaceAfter=20
)
# 自定义正文样式
body_style = ParagraphStyle(
name="BodyStyle",
parent=styles["Normal"],
fontSize=12,
leading=18,
spaceAfter=10
)
# 组装报告内容
content = []
# 添加标题
content.append(Paragraph("2024年销售分析报告", title_style))
# 添加分析结论
content.append(Paragraph("本次分析覆盖全国5个销售区域,统计周期为全年,核心结论如下:", body_style))
content.append(Paragraph("1. 华东地区销售额最高,占总销售额的35%", body_style))
content.append(Paragraph("2. 西北地区销售额最低,仍有较大增长空间", body_style))
# 添加统计表格
table_data = [["地区", "总销售额"]] + region_sales.values.tolist()
table = Table(table_data, colWidths=[200, 200])
table.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, 0), colors.grey),
("TEXTCOLOR", (0, 0), (-1, 0), colors.whitesmoke),
("ALIGN", (0, 0), (-1, -1), "CENTER"),
("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
("GRID", (0, 0), (-1, -1), 1, colors.black)
]))
content.append(table)
# 添加图表
from reportlab.platypus import Image
img = Image("sales_chart.png", width=400, height=200)
content.append(img)
# 生成PDF文件
doc.build(content)
print("PDF报告生成完成")
常见问题与优化建议
- Excel输出时如果需要兼容旧版本Office,可以将引擎切换为
openpyxl的兼容模式,避免文件无法打开 - PDF生成时如果需要支持中文字体,需要额外注册中文字体文件,避免中文显示乱码
- 可以将报告生成逻辑封装为函数,结合定时任务实现定期自动生成报告,进一步提升效率
- 如果数据量较大,建议先对数据进行分页处理,避免生成的Excel或PDF文件过大无法打开