Python实现数据库数据自动化导出PDF报告
作者:IT小本本
本文将介绍如何使用Python构建一个自动化工具,实现从MySQL数据库提取员工数据,并为每位员工生成包含定制化表格的PDF报告。通过该方案,可显著提升数据导出效率,避免手动操作误差,同时支持灵活的格式定制。
需求:从MySQL数据库提取员工数据,并为每位员工生成包含定制化表格的PDF报告。
最终想要的结果:
技术栈与核心功能
主要技术组件
数据库连接:使用pymysql
实现Python与MySQL的交互,支持字符集配置和字典游标(便于数据处理)。
PDF生成:基于reportlab
库构建PDF文档,支持表格样式定制、中文字体渲染和动态内容生成。
异常处理:通过try-except
结构和traceback
模块捕获运行时错误,提供详细日志便于调试。
文件管理:自动创建输出目录,使用时间戳确保文件名唯一,避免文件覆盖。
功能亮点
自动检测数据库表结构,支持动态字段提取
为每位员工生成独立PDF,包含姓名、薪资等关键信息
定制化表格样式(背景色、字体、边框等)
完整的中文字体支持(通过注册系统字体实现)
核心代码解析
1. 数据库连接与数据获取
import pymysql def 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 connection except 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, data except 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 path except 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报告的详细内容,更多关于Python数据库数据导出为PDF的资料请关注脚本之家其它相关文章!