如何利用Python连接MongoDB并动态生成报表Excel_PyMongo取出数据后结合openpyxl写入并提供下载

胖墨君_6813

胖墨君_6813

2026-04-11

548人浏览

原创

PyMongo连接失败主因是密码错误或URI格式不当,需确认服务运行、URI含数据库名及正确参数,认证信息须URL编码;cursor需转list或遍历消费;openpyxl写入应避免append、注意只读问题和保存;Web下载须设对响应头、UTF-8编码中文名、异步清理临时文件。

如何利用python连接mongodb并动态生成报表excel_pymongo取出数据后结合openpyxl写入并提供下载

PyMongo 连接 MongoDB 失败的常见报错和修复

连不上不是密码错了就是 URI 格式不对,ConnectionRefusedError 或 ServerSelectionTimeoutError 几乎都指向这两点。

  • 确认 MongoDB 服务确实在运行:mongod 进程是否启动,或云数据库地址/端口是否填对(默认是 27017,但 Atlas 用的是 mongodb+srv:// 开头)
  • URI 中不能漏掉数据库名,比如 mongodb://localhost:27017/mydb;用 Atlas 时必须带 ?retryWrites=true&w=majority
  • 如果开了认证,用户名密码要 URL 编码,尤其是 @、/、: 这些字符,否则 Invalid URI 直接报错
  • 本地测试别用 127.0.0.1 代替 localhost(某些系统 DNS 解析行为不同),优先统一用 localhost

用 PyMongo 查询数据时,cursor 转 list 的时机很关键

直接把 collection.find() 返回的 cursor 传给 openpyxl 写入会出错——它不是可迭代的“行列表”,而是惰性查询对象,且只能遍历一次。

  • 务必先转成 list 或用 for doc in cursor: 显式消费,否则第二次遍历时为空
  • 大数据量别无脑 list(cursor),内存爆掉前先加 .limit(1000) 测试;真要导全量,得流式写入 Excel(见下一条)
  • find({}) 默认不返回 _id 字段?错,它默认返回。如不想导 _id,得显式投影:find({}, {"_id": 0})
  • 日期字段从 MongoDB 读出来是 datetime 类型,openpyxl 能直接识别并写入为 Excel 时间格式,不用手动转字符串

openpyxl 写入 Excel 时,避免“只读工作表”和内存暴涨

用 Workbook() 新建文件没问题,但用 load_workbook() 打开已有模板再写,常遇到 ReadOnlyWorksheet 错误,或者写完保存后 Excel 打不开——多半是没关游标或没调 save()。

tidy-excel-data
tidy-excel-data

清理、标准化、验证并汇总杂乱的 Excel 工作簿。当 Codex 需要处理 `.xlsx`、`.xls`、`.xlsm` 或 `.csv` 格式的数据时使用,包括:统一表头格式、删除空白行与空白列、修剪文本内容、去重记录、检测数据质量问题、拆分或合并工作表、生成清洗后的工作簿,以及为业务电子表格生成审计摘要。

下载
  • 模板文件如果被 Excel 程序占用(哪怕只是开着没编辑),openpyxl 会静默失败或写入异常,务必关掉所有 Excel 进程再试
  • 写入大量数据时,别用 ws.append(row) 循环——每调一次都触发样式重算,性能极差;改用 ws.cell(row=i, column=j, value=...) 批量定位写入
  • 写完必须调 wb.save("report.xlsx"),且不能在同一个进程里反复 load_workbook → save 同一个文件(会锁死)
  • 生成完文件,记得用 send_file(Flask)或 FileResponse(FastAPI)提供下载,别返回路径字符串——用户看不到服务器路径

Web 框架中提供 Excel 下载,注意响应头和临时文件清理

用户点击就生成并下载,看似简单,但文件没删干净或响应头错一个字母,前端就卡在“正在下载”不动。

  • 响应头必须设 Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,别写成 xlsx 或漏掉 vnd.
  • 文件名中文要用 Content-Disposition 做 UTF-8 编码,例如:attachment; filename*=UTF-8''%E6%8A%A5%E8%A1%A8.xlsx
  • 用 tempfile.NamedTemporaryFile(delete=False) 创建临时 Excel,生成完立刻 close(),再用 send_file 发送,最后在响应发送后异步删(或用 atexit 注册清理)
  • 别在请求处理函数里直接 os.remove(path) ——文件可能还没发完就被删了,导致下载中断或 0 字节

生成 Excel 不难,难的是 MongoDB 查询稳定性、openpyxl 写入效率、以及 Web 下载链路里每个环节的容错。尤其注意 cursor 只能用一次、临时文件不能提前删、中文文件名要编码——这三个点,线上最容易默默出问题。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1831

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4864

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1769

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

29077

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3487

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3487

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1223

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2703

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 44.9万人学习

成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 3.6万人学习