1. 项目背景与需求解析
在日常数据处理工作中,我们经常需要将数据库中的大量记录导出到Excel文件进行二次处理或分享。手动操作不仅效率低下,而且容易出错。Python凭借其强大的数据库连接能力和Excel处理库,成为自动化这一流程的绝佳选择。
这个方案特别适合以下场景:
- 定期生成业务报表
- 数据迁移备份
- 跨部门数据共享
- 数据分析前的数据准备
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术方案设计
2.1 核心组件选型
对于数据库连接,我们主要考虑:
- MySQL/PostgreSQL:使用PyMySQL/psycopg2
- SQLite:内置sqlite3模块
- Oracle:cx_Oracle
- SQL Server:pyodbc
Excel处理方面:
- openpyxl:功能全面,支持.xlsx格式
- xlwt/xlrd:处理旧版.xls格式
- pandas:简化数据处理流程
提示:新项目建议优先使用openpyxl,它支持Excel 2010+的所有新特性,且维护活跃。
2.2 架构设计
完整流程包含以下环节:
- 建立数据库连接
- 执行查询获取数据
- 数据处理与转换
- 创建Excel工作簿
- 写入数据并设置格式
- 保存文件
- 异常处理与资源释放
3. 详细实现步骤
3.1 数据库连接配置
以MySQL为例的典型连接代码:
python复制import pymysql
def create_connection():
try:
conn = pymysql.connect(
host='localhost',
user='username',
password='password',
database='dbname',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor
)
return conn
except pymysql.Error as e:
print(f"数据库连接失败: {e}")
return None
关键参数说明:
charset:建议使用utf8mb4以支持完整Unicodecursorclass:DictCursor可以让结果以字典形式返回
3.2 数据查询与获取
推荐使用上下文管理器确保资源正确释放:
python复制def fetch_data(conn, query, params=None):
try:
with conn.cursor() as cursor:
cursor.execute(query, params or ())
return cursor.fetchall()
except pymysql.Error as e:
print(f"查询执行失败: {e}")
return None
3.3 Excel文件生成
使用openpyxl创建带格式的工作簿:
python复制from openpyxl import Workbook
from openpyxl.styles import Font, Alignment
def create_excel(data, filename):
wb = Workbook()
ws = wb.active
# 添加标题行
headers = list(data[0].keys()) if data else []
for col, header in enumerate(headers, 1):
cell = ws.cell(row=1, column=col, value=header)
cell.font = Font(bold=True)
cell.alignment = Alignment(horizontal='center')
# 填充数据
for row, record in enumerate(data, 2):
for col, value in enumerate(record.values(), 1):
ws.cell(row=row, column=col, value=value)
# 自动调整列宽
for column in ws.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
ws.column_dimensions[column_letter].width = adjusted_width
wb.save(filename)
3.4 完整流程整合
将各模块组合成完整解决方案:
python复制def export_to_excel(db_config, query, filename, params=None):
conn = create_connection(**db_config)
if not conn:
return False
try:
data = fetch_data(conn, query, params)
if data is N
