
本文介绍如何利用 openpyxl 库将 sqlite 查询得到的列表数据(尤其是字典列表)高效、规范地导出为 excel 文件,并修正原始代码中的逻辑错误与异常处理缺陷。
本文介绍如何利用 openpyxl 库将 sqlite 查询得到的列表数据(尤其是字典列表)高效、规范地导出为 excel 文件,并修正原始代码中的逻辑错误与异常处理缺陷。
在 Python 中将结构化数据(如从数据库读取的记录)保存为 Excel 文件,是数据分析和自动化报表开发中的常见需求。初学者常误以为只需简单调用 Workbook().save() 即可完成,但实际需注意数据组织方式、库依赖、异常捕获及资源管理等关键细节。
首先,确保已安装 openpyxl(专用于 .xlsx 文件读写的纯 Python 库):
pip install openpyxl
接着,对原始代码进行系统性优化:
✅ 修复核心逻辑错误:原代码中 projects.append(dict_temp) 被错误地写在 for row in projects_data 循环外部,导致仅最后一行数据被保存;现已移入循环内。
✅ 简化字典构建:使用字典推导式风格替代冗长的逐项赋值,提升可读性与维护性。
✅ 正确写入 Excel:ws.append(project.values()) 直接将字典值按列顺序写入一行,无需手动索引;注意 values() 返回顺序与字典定义顺序一致(Python 3.7+ 保证插入序)。
✅ 增强异常处理:用 except Exception as e 显式捕获并打印错误,避免静默失败;删除不安全的裸 except: 和无效的 wb.SaveAs()(openpyxl 不支持该方法)。
✅ 移除冗余操作:删除重复的 wb.save() 调用及未定义变量 save_workbook,确保文件仅保存一次。
完整可运行示例代码如下:
from openpyxl import Workbook
try:
# 假设 sqlite_cursor 和 query 已正确定义并连接数据库
sqlite_cursor.execute(query)
projects_data = sqlite_cursor.fetchall()
# 构建字典列表:每条记录转为一个字典
projects = []
for row in projects_data:
project_dict = {
'GivenName': row[0],
'surname': row[1],
'DeptDesc': row[2],
'Region': row[3],
'LicType': row[4],
'LicClass': row[5],
'Licence_Number': row[6],
'License_Holder_Name': row[7],
'License_Description': row[8],
'LicStatus': row[9],
'Issue_Date': row[10],
'Expiry_Date': row[11],
}
projects.append(project_dict)
# 创建工作簿与工作表
wb = Workbook()
ws = wb.active
ws.title = "Licenses" # 可选:设置工作表名称
# 写入表头(推荐显式添加,提升可读性)
headers = list(projects[0].keys()) if projects else []
ws.append(headers)
# 写入数据行
for project in projects:
ws.append(list(project.values()))
# 保存文件
wb.save('DriverLicense.xlsx')
print('✅ Excel file "DriverLicense.xlsx" saved successfully.')
except Exception as e:
print(f'❌ Error occurred while saving Excel: {e}')
# 此处可补充日志记录或清理逻辑,如关闭数据库连接
finally:
# 推荐:确保资源释放(如 sqlite_cursor.close() 等)
pass
⚠️ 注意事项:
- 若需写入 .xls(旧版格式),请改用 xlwt(仅支持写)或 pandas + openpyxl 组合;openpyxl 仅支持 .xlsx/.xlsm/.xltx/.xltm。
- 对于大数据量(>10 万行),建议使用 pandas.DataFrame.to_excel()(底层仍调用 openpyxl/xlsxwriter),它自动处理表头、类型推断与性能优化。
- 如需样式(字体、边框、颜色)、多工作表或公式,openpyxl 提供丰富 API,但会增加代码复杂度——此时应权衡简洁性与功能需求。
掌握此方法后,你不仅能导出数据库结果,还可轻松扩展至 CSV、JSON 或数据库写回等场景,为 Python 数据处理打下坚实基础。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











