Python导出MongoDB数据至Excel仅保存一行的问题求助
解决MongoDB数据导出Excel仅保存一行的问题
常见原因及修复方案
1. 循环内重复创建/覆盖Excel文件/工作表
如果你的代码在遍历MongoDB查询结果的循环里,每次都执行创建工作簿、获取工作表的操作,会导致每次循环覆盖之前的内容,最终只剩最后一行。
错误示例:
import pymongo from openpyxl import Workbook client = pymongo.MongoClient("mongodb://localhost:27017/") db = client["your_db"] collection = db["your_collection"] for doc in collection.find(): wb = Workbook() # 每次循环新建工作簿,覆盖原有内容 ws = wb.active ws.append([doc["field1"], doc["field2"]]) wb.save("output.xlsx")
修复:将创建工作簿和保存文件的逻辑移到循环外部:
import pymongo from openpyxl import Workbook client = pymongo.MongoClient("mongodb://localhost:27017/") db = client["your_db"] collection = db["your_collection"] wb = Workbook() ws = wb.active # 可选:写入表头 ws.append(["字段1", "字段2"]) for doc in collection.find(): ws.append([doc["field1"], doc["field2"]]) # 循环内仅追加数据行 wb.save("output.xlsx")
2. 使用覆盖式写入而非批量写入
如果用pandas的to_excel方法,默认每次调用会覆盖文件,循环内调用只会保留最后一次写入的行。
错误示例:
import pymongo import pandas as pd client = pymongo.MongoClient("mongodb://localhost:27017/") db = client["your_db"] collection = db["your_collection"] for doc in collection.find(): df = pd.DataFrame([doc]) df.to_excel("output.xlsx", index=False) # 每次覆盖文件
修复:先将所有数据存入列表,再一次性转为DataFrame写入:
import pymongo import pandas as pd client = pymongo.MongoClient("mongodb://localhost:27017/") db = client["your_db"] collection = db["your_collection"] data_list = [] for doc in collection.find(): # 可选:将MongoDB的ObjectId转为字符串,避免序列化报错 doc["_id"] = str(doc["_id"]) data_list.append(doc) df = pd.DataFrame(data_list) df.to_excel("output.xlsx", index=False)
3. 确认MongoDB查询结果行数
先验证你的查询是否真的返回多行数据,可添加统计代码:
print("查询到的数据总行数:", collection.count_documents({}))
如果输出为1,说明MongoDB中目标集合本身只有一行数据,和代码逻辑无关。
额外提示
- 处理MongoDB的
ObjectId时,需转为字符串才能正常写入Excel,否则可能触发序列化错误。 - 若数据量较大,建议使用
openpyxl的流式写入或分块处理,避免内存占用过高。
内容的提问来源于stack exchange,提问作者j ton
相关产品推荐
相关产品推荐

