Python實現(xiàn)數(shù)據(jù)庫數(shù)據(jù)自動化導(dǎo)出PDF報告
本文將介紹如何使用Python構(gòu)建一個自動化工具,實現(xiàn)從MySQL數(shù)據(jù)庫提取員工數(shù)據(jù),并為每位員工生成包含定制化表格的PDF報告。通過該方案,可顯著提升數(shù)據(jù)導(dǎo)出效率,避免手動操作誤差,同時支持靈活的格式定制。
需求:從MySQL數(shù)據(jù)庫提取員工數(shù)據(jù),并為每位員工生成包含定制化表格的PDF報告。

最終想要的結(jié)果:

技術(shù)棧與核心功能
主要技術(shù)組件
數(shù)據(jù)庫連接:使用pymysql實現(xiàn)Python與MySQL的交互,支持字符集配置和字典游標(便于數(shù)據(jù)處理)。
PDF生成:基于reportlab庫構(gòu)建PDF文檔,支持表格樣式定制、中文字體渲染和動態(tài)內(nèi)容生成。
異常處理:通過try-except結(jié)構(gòu)和traceback模塊捕獲運行時錯誤,提供詳細日志便于調(diào)試。
文件管理:自動創(chuàng)建輸出目錄,使用時間戳確保文件名唯一,避免文件覆蓋。
功能亮點
自動檢測數(shù)據(jù)庫表結(jié)構(gòu),支持動態(tài)字段提取
為每位員工生成獨立PDF,包含姓名、薪資等關(guān)鍵信息
定制化表格樣式(背景色、字體、邊框等)
完整的中文字體支持(通過注冊系統(tǒng)字體實現(xiàn))
核心代碼解析
1. 數(shù)據(jù)庫連接與數(shù)據(jù)獲取
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("數(shù)據(jù)庫連接成功!")
return connection
except Exception as e:
# 詳細異常日志記錄
print(f"數(shù)據(jù)庫連接錯誤: {str(e)}")
print("詳細錯誤信息:\n", traceback.format_exc())
return None
關(guān)鍵配置:使用DictCursor直接返回字典格式數(shù)據(jù),便于后續(xù)處理;charset='utf8mb4'確保支持 emoji 等特殊字符。
健壯性設(shè)計:通過異常捕獲避免程序因數(shù)據(jù)庫連接失敗崩潰,并提供堆棧跟蹤信息。
數(shù)據(jù)表內(nèi)容:

2. 數(shù)據(jù)提取與表結(jié)構(gòu)校驗
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
# 提取表結(jié)構(gòu)與數(shù)據(jù)
cursor.execute("SHOW COLUMNS FROM employees")
columns = [col['Field'] for col in cursor.fetchall()]
cursor.execute("SELECT * FROM employees")
data = cursor.fetchall()
print(f"表結(jié)構(gòu): {columns}, 獲取到 {len(data)} 條記錄")
return columns, data
except Exception as e:
# 數(shù)據(jù)操作異常處理
print(f"獲取數(shù)據(jù)錯誤: {str(e)}", traceback.format_exc())
return None, None
預(yù)處理邏輯:先校驗表是否存在,避免后續(xù)操作拋出未知錯誤。
數(shù)據(jù)格式:返回字段列表和字典數(shù)組,便于與PDF生成模塊對接。
3. 個性化PDF生成
def create_pdf_for_employee(employee_data, columns):
try:
# 目錄創(chuàng)建
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()
# 中文字體注冊(關(guān)鍵步驟)
pdfmetrics.registerFont(TTFont('SimHei', 'SimHei.ttf'))
title_style = ParagraphStyle(
'CustomTitle',
parent=styles['Heading1'],
fontName='SimHei',
fontSize=24,
spaceAfter=30
)
# 表格數(shù)據(jù)與樣式
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'), # 中文字體應(yīng)用
('GRID', (0,0), (-1,-1), 1, colors.black) # 邊框設(shè)置
]))
# 文檔元素組裝
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放在程序目錄或指定路徑),解決中文亂碼問題。
樣式定制技巧:
- 分層設(shè)置背景色(表頭灰色,內(nèi)容米色)
- 不同層級字體大小(表頭14pt,內(nèi)容12pt)
- 全局居中對齊與邊框線增強可讀性
文件名策略:使用姓名+時間戳組合,確保唯一性并便于文件管理。
運行前準備
1、 安裝依賴庫:
pip install pymysql reportlab
2、 字體文件準備:
- 從Windows系統(tǒng)字體目錄(
C:\Windows\Fonts\SimHei.ttf)復(fù)制到程序目錄 - 或替換為其他中文字體(如思源黑體),注意修改注冊字體名稱
3、 數(shù)據(jù)庫配置:
- 確保
employees表存在,包含name和salary字段 - 根據(jù)實際環(huán)境修改數(shù)據(jù)庫連接參數(shù)(主機、用戶名、密碼等)
運行后的效果

以上就是Python實現(xiàn)數(shù)據(jù)庫數(shù)據(jù)自動化導(dǎo)出PDF報告的詳細內(nèi)容,更多關(guān)于Python數(shù)據(jù)庫數(shù)據(jù)導(dǎo)出為PDF的資料請關(guān)注腳本之家其它相關(guān)文章!
- 通過Python編程將CSV文件導(dǎo)出為PDF文件的方法
- Python利用pdfplumber提取PDF文檔中的表格數(shù)據(jù)并導(dǎo)出
- Python實現(xiàn)將Excel內(nèi)容批量導(dǎo)出為PDF文件
- 基于Python實現(xiàn)數(shù)據(jù)庫表結(jié)構(gòu)導(dǎo)出工具
- Python實現(xiàn)將MySQL數(shù)據(jù)庫查詢結(jié)果導(dǎo)出到Excel
- 利用Python批量導(dǎo)出mysql數(shù)據(jù)庫表結(jié)構(gòu)的操作實例
- Python實現(xiàn)將數(shù)據(jù)庫一鍵導(dǎo)出為Excel表格的實例
相關(guān)文章
python 實現(xiàn)dict轉(zhuǎn)json并保存文件
今天小編就為大家分享一篇python 實現(xiàn)dict轉(zhuǎn)json并保存文件,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
Python實現(xiàn)OCR識別之pytesseract案例詳解
這篇文章主要介紹了Python實現(xiàn)OCR識別之pytesseract案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07
tensorflow沒有output結(jié)點,存儲成pb文件的例子
今天小編就為大家分享一篇tensorflow沒有output結(jié)點,存儲成pb文件的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01

