用Python实现数据库数据自动化导出PDF报告:从MySQL到个性化文档的全流程实践
本文将介绍如何使用Python构建一个自动化工具,实现从MySQL数据库提取员工数据,并为每位员工生成包含定制化表格的PDF报告。通过该方案,可显著提升数据导出效率,避免手动操作误差,同时支持灵活的格式定制。
需求:从MySQL数据库提取员工数据,并为每位员工生成包含定制化表格的PDF报告。
最终想要的结果:
技术栈与核心功能
主要技术组件
-
数据库连接:使用
pymysql
实现Python与MySQL的交互,支持字符集配置和字典游标(便于数据处理)。 -
PDF生成:基于
reportlab
库构建PDF文档,支持表格样式定制、中文字体渲染和动态内容生成。 -
异常处理:通过
try-except
结构和traceback
模块捕获运行时错误,提供详细日志便于调试。 -
文件管理:自动创建输出目录,使用时间戳确保文件名唯一,避免文件覆盖。
功能亮点
-
自动检测数据库表结构,支持动态字段提取
-
为每位员工生成独立PDF,包含姓名、薪资等关键信息
-
定制化表格样式(背景色、字体、边框等)
-
完整的中文字体支持(通过注册系统字体实现)
核心代码解析
1. 数据库连接与数据获取
import pymysqldef connect_to_database():try:connection = pymysql.connect(host='127.0.0.1',user='root',password='root',database='250515sj',charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor)print("数据库连接成功!")return connectionexcept Exception as e:# 详细异常日志记录print(f"数据库连接错误: {str(e)}")print("详细错误信息:\n", traceback.format_exc())return None
-
关键配置:使用
DictCursor
直接返回字典格式数据,便于后续处理;charset='utf8mb4'
确保支持 emoji 等特殊字符。 -
健壮性设计:通过异常捕获避免程序因数据库连接失败崩溃,并提供堆栈跟踪信息。
数据表内容:
2. 数据提取与表结构校验
def get_employees_data(connection):try:with connection.cursor() as cursor:# 表存在性校验cursor.execute("SHOW TABLES LIKE 'employees'")if not cursor.fetchone():print("错误:employees表不存在!")return None, None# 提取表结构与数据cursor.execute("SHOW COLUMNS FROM employees")columns = [col['Field'] for col in cursor.fetchall()]cursor.execute("SELECT * FROM employees")data = cursor.fetchall()print(f"表结构: {columns}, 获取到 {len(data)} 条记录")return columns, dataexcept Exception as e:# 数据操作异常处理print(f"获取数据错误: {str(e)}", traceback.format_exc())return None, None
-
预处理逻辑:先校验表是否存在,避免后续操作抛出未知错误。
-
数据格式:返回字段列表和字典数组,便于与PDF生成模块对接。
3. 个性化PDF生成
def create_pdf_for_employee(employee_data, columns):try:# 目录创建output_dir = "employee_pdfs"os.makedirs(output_dir, exist_ok=True)# 字段筛选与中文表头映射export_data = [employee_data[col] for col in ['name', 'salary']]filename = f"{employee_data['name']}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.pdf"path = os.path.join(output_dir, filename)# PDF文档初始化doc = SimpleDocTemplate(path, pagesize=letter)styles = getSampleStyleSheet()# 中文字体注册(关键步骤)pdfmetrics.registerFont(TTFont('SimHei', 'SimHei.ttf'))title_style = ParagraphStyle('CustomTitle',parent=styles['Heading1'],fontName='SimHei',fontSize=24,spaceAfter=30)# 表格数据与样式table_data = [['姓名', '薪资'], export_data]table = Table(table_data)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,-1), 'SimHei'), # 中文字体应用('GRID', (0,0), (-1,-1), 1, colors.black) # 边框设置]))# 文档元素组装elements = [Paragraph(f"{employee_data['name']}的个人信息", title_style),Spacer(1, 20),table]doc.build(elements)return pathexcept Exception as e:print(f"生成PDF错误: {str(e)}", traceback.format_exc())return None
-
中文字体解决方案:通过
TTFont
注册本地字体文件(需将SimHei.ttf
放在程序目录或指定路径),解决中文乱码问题。 -
样式定制技巧:
-
分层设置背景色(表头灰色,内容米色)
-
不同层级字体大小(表头14pt,内容12pt)
-
全局居中对齐与边框线增强可读性
-
-
文件名策略:使用
姓名+时间戳
组合,确保唯一性并便于文件管理。
运行前准备
1、 安装依赖库:
pip install pymysql reportlab
2、 字体文件准备:
-
从Windows系统字体目录(
C:\Windows\Fonts\SimHei.ttf
)复制到程序目录 -
或替换为其他中文字体(如思源黑体),注意修改注册字体名称
3、 数据库配置:
-
确保
employees
表存在,包含name
和salary
字段 -
根据实际环境修改数据库连接参数(主机、用户名、密码等)
运行后的效果
**完整代码已同步至百度网盘,需要者阅读此文章:用Python实现数据库数据自动化导出PDF报告:从MySQL到个性化文档的全流程实践,读到最后有获取方式
相关文章:

用Python实现数据库数据自动化导出PDF报告:从MySQL到个性化文档的全流程实践
本文将介绍如何使用Python构建一个自动化工具,实现从MySQL数据库提取员工数据,并为每位员工生成包含定制化表格的PDF报告。通过该方案,可显著提升数据导出效率,避免手动操作误差,同时支持灵活的格式定制。 需求&#…...

实战设计模式之状态模式
概述 作为一种行为设计模式,状态模式允许对象在其内部状态改变时,改变其行为。这种模式通过将状态逻辑从对象中分离出来,并封装到独立的状态类中来实现。每个状态类代表一种特定的状态,拥有自己的一套行为方法。当对象的状态发生变…...
人工智能、机器学习与深度学习:概念解析与内在联系
人工智能、机器学习与深度学习:概念解析与内在联系 一、人工智能(Artificial Intelligence, AI) (一)人工智能的定义 人工智能的定义随着技术发展不断演变。从广义上讲,人工智能是指通过计算机技术实现的…...

什么是着色器 Shader
本人就是图形学结课了,对 OpenGL着色器还有很多疑问嘿嘿 文章目录 为什么要有着色器vshaderfshader 本文围绕 vshader 和 fshader 代码示例讲解。 (着色器代码取自本人简单OpenGL项目 https://github.com/DBWGLX/-OpenGL-3D-Lighting-and-Shadow-Modeli…...

Redis的主从架构
主从模式 全量同步 首先主从同步过程第一步 会先比较replication id 判断是否是第一次同步假设为第一次同步 那么就会 启动bgsave异步生成RDB 同时fork子进程记录生成期间的新数据发送RDB给从节点 清空本地数据写入RDB 增量同步 对比ReplicationID不同因此选择增量同步在Rep…...

博客系统功能测试
博客系统网址:http://8.137.19.140:9090/blog_list.html 主要测试内容 功能测试、界面测试、性能测试、易用性测试、安全测试、兼容性测试、弱网测试、安装卸载测试、压力测试… 测试方法及目的 利用selenium和python编写测试脚本,对博客系统进行的相关…...

【深度学习新浪潮】什么是多模态大模型?
多模态大模型是人工智能领域的前沿技术方向,它融合了多种数据模态(如文本、图像、语音、视频、传感器数据等),并通过大规模参数模型实现跨模态的联合理解与生成。简单来说,这类模型就像人类一样,能同时“看”“听”“读”“说”,并将不同信息关联起来,完成复杂任务。 …...

机器学习前言2
1.机器学习 2.机器学习模型 3.模型评价方法 4.如何选择合适的模型 介绍 机器学习(Machine Learning, ML)是人工智能(AI)的核心分支,致力于通过数据和算法让计算机系统自动“学习”并改进性能,而无需显式编…...

【成品设计】基于Arduino的自动化农业灌溉系统
《基于STM32的单相瞬时值反馈逆变器》 硬件设计: ESP-C3最小系统板:主控芯片,内部集成wifi。土壤湿度传感器:采集土壤湿度。温度传感器:采集土壤温度。水泵模块:水泵继电器软管。按键3个:参数…...

前端页面 JavaScript数据交互
前言:学习JavaScript为前端设置动态效果,实现交互。JavaScript是一种广泛应用于网页开发的脚本语言,它能够使网页变得更加动态和交互性。作为一种客户端脚本语言,JavaScript可以被嵌入到HTML中,并且可以被所有现代的网…...

esp32课设记录(三)mqtt通信记录 附mqtt介绍
目录 安装mqttx(云端部署) 安装mosquitto(本地部署) 编程,连接wifi 编程,连接mqtt,实现数据接收 实际效果展示: 附录:mqtt介绍 工作流程简述: 工作流…...

string类(详解)
【本节目标】 1. 为什么要学习string类 2. 标准库中的string类 3. string类的模拟实现 4. 扩展阅读 1. 为什么学习string类? 1.1 C语言中的字符串 C 语言中,字符串是以 \0 结尾的一些字符的集合,为了操作方便, C 标准库中提供…...

MATLAB | R2025a 更新了哪些有趣的东西?
千呼万唤始出来,MATLAB R2025A 来见面,这次更新比往常晚了两个月,让我们看看更了哪些好玩的新东西叭:首先下载更新启动一气呵成,映入眼帘的是: 1 基本界面 基本界面变得和 MATLAB 网页版一模一样了&#…...

前缀和——和为K的子数组
作者感觉本题稍稍有点难度,看了题解也思考了有一会TWT 显然,暴力我们是不可取的,但这里我们可以采取一种新的遍历数组形式,从后向前,也就是以i位置为结尾的所有子数组,这个子数组只统计i位置之前的。 然后…...
React 第四十二节 Router 中useLoaderData的用途详解
一、前言 useLoaderData,用于在组件中获取路由预加载的数据。它通常与路由配置中的 loader 函数配合使用,用于在页面渲染前异步获取数据(如 API 请求),并将数据直接注入组件,从而简化数据流管理。 二、us…...
千问大模型部署
参考链接:https://zhuanlan.zhihu.com/p/19698254692 tips:部署比较简单,除去上述教程中的步骤外,该文章主要是想记录过程中遇到的问题。因为我是双平台(arm/x86)部署,x86在python3.xx版本成功…...

深入理解 ZAB:ZooKeeper 原子广播协议的工作原理
目录 ZAB 协议:ZooKeeper 如何做到高可用和强一致?🔒ZAB 协议的核心目标 🎯ZAB 协议的关键概念 💡ZAB 协议的运行阶段 🎬阶段一:Leader 选举 (Leader Election) 🗳️阶段二ÿ…...
GO语言语法---if语句
文章目录 1. 基本语法1.1 单分支1.2 双分支1.3 多分支 2. Go特有的if语句特性2.1 条件前可以包含初始化语句2.2 条件表达式不需要括号2.3 必须使用大括号2.4 判断语句所在行数控制 Go语言的if语句用于条件判断,与其他C风格语言类似,但有一些独特的语法特…...
Unix Bourne Shell
本文来源 : 腾讯元宝 Unix Bourne Shell(简称sh)是Unix系统中最经典的命令行解释器(shell),由Stephen Bourne于1977年在贝尔实验室开发,并成为后续众多shell(如bash、ksh等ÿ…...

GraphPad Prism项目的管理
《2025新书现货 GraphPad Prism图表可视化与统计数据分析(视频教学版)雍杨 康巧昆 清华大学出版社教材书籍 9787302686460 GraphPadPrism图表可视化 无规格》【摘要 书评 试读】- 京东图书 GraphPad Prism统计数据分析_夏天又到了的博客-CSDN博客 项目…...

驱动-Linux定时-timer_list
了解内核定时相关基础知识 文章目录 简要介绍timer_list 特点API 函数实验测试程序 - timer_mod.c编译文件-Makefile实验验证 注意事项总结 简要介绍 硬件为内核提供了一个系统定时器来计算流逝的时间(即基于未来时间点的计时方式, 以当前时刻为计时开始…...

STM32F103_LL库+寄存器学习笔记22 - 基础定时器TIM实现1ms周期回调
导言 如上所示,STM32F103有两个基本定时器TIM6与TIM7,所谓「基本定时器」,即功能最简单的定时器。 项目地址: github: LL库: https://github.com/q164129345/MCU_Develop/tree/main/stm32f103_ll_library22_Basic_Timer寄存器方…...

5个yyds的.Net商城开源项目
今天一起来盘点下5个商城开源项目。 1、支持多语言、多商店的商城,.Net7 EF7领域驱动设计架构(Smartstore) 项目简介 Smartstore 支持桌面和移动平台、多语言、多商店、多货币的商城,并支持SEO优化,支持无限数量的…...
C++:与7无关的数
【描述】 一个正整数,如果它能被7整除,或者它的十进制表示法中某一位上的数字为7,则称其为与7相关的数.现求所有小于等于n(n < 100)的与7无关的正整数的平方和. 【输入】 输入为一行,正整数n(n < 100) 【输出】 输出一行,包含一个整数,即小于等于n…...

[项目深挖]仿muduo库的并发服务器的解析与优化方案
标题:[项目深挖]仿muduo库的并发服务器的优化方案 水墨不写bug 文章目录 一、buffer 模块(1)线性缓冲区直接扩容---->环形缓冲区定时扩容(只会扩容一次)(2)使用双缓冲(Double Buf…...
c语言与python的异同之处
一、基本语法对比 1. 注释 // C语言单行注释/* C语言多行注释 */# Python单行注释 Python多行注释 2. 变量声明 // C语言int number 10;float price 3.14;char letter A;# Pythonnumber 10price 3.14letter A 3. 条件语句 // C语言if (condition) {// 代码块} else …...

国标GB28181视频平台EasyGBS校园监控方案:多场景应用筑牢安全防线,提升管理效能
一、方案背景 随着校园规模不断扩大,传统监控系统因设备协议不兼容、数据分散管理,导致各系统之间相互独立、数据无法互通共享。在校园安全防范、教学管理以及应急响应过程中,这种割裂状态严重影响工作效率。国标GB28181软件EasyGBS视频云…...
【视频】解决FFmpeg将RTSP转RTMP流时,出现的卡死、出错等问题
【视频】郭老二博文之:图像视频汇总 1、简述 如果不修改图像内容,可以使用FFmpeg命令来将RTSP转RTMP流。 SRS视频服务器就是这么干的,它没有使用FFmpeg接口,而是直接使用FFmpeg命令来转流。 但是在使用中,约到了一些问题,比如转流时卡死、转流出错等等,下面描述怎么解…...

SHIMADZU岛津 R300RC300 Operation Manual
SHIMADZU岛津 R300RC300 Operation Manual...

使用 Docker 部署 React + Nginx 应用教程
目录 1. 创建react项目结构2. 创建 .dockerignore3. 创建 Dockerfile4. 创建 nginx.conf5. 构建和运行6. 常用命令 1. 创建react项目结构 2. 创建 .dockerignore # 依赖目录 node_modules npm-debug.log# 构建输出 dist build# 开发环境文件 .git .gitignore .env .env.local …...