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

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()。
清理、标准化、验证并汇总杂乱的 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 的核心概念和高级技巧!










