【问题标题】:openpyxl generating broken workbookopenpyxl 生成损坏的工作簿
【发布时间】:2018-08-03 22:37:47
【问题描述】:

我有以下代码从 MongoDB 获取数据并将其写入 excel,但是当我打开生成的工作簿时它给出了一个错误(“我们在 ~workbook_name~... 中发现了一个问题”)。

代码:

ws = wb.active
client = pymongo.MongoClient("...")
db = client['...']
collection = db['...']
r = 2
for doc in collection.find({'is_timeline_valid': True}):
    for dic in doc['timeline']['datas']:
        if 'pedido' in dic['tramite'].lower():
           ws.cell(row = r, column = 1).value =doc['id_process_unformatted']
        ws.cell(row = r, column = 2).value = dic['data']
        ws.cell(row = r, column = 3).value = dic['tramite']
        wb.save('pedido.xlsx')
        print('*****************************')
        print(dic['tramite'])
        # print('check!')
        r += 1

【问题讨论】:

  • 尝试在 ws.cell(row = r, column = 1).value =doc['id_process_unformatted'] 中使用 dic 而不是 doc。您可能希望通过获取字符串表示形式将值设置为字符串。
  • 为什么? id_process_unformatted 是 doc 而非 dic 的键。
  • 哦,我的错。我实际上认为这是一个错字。

标签: python excel pymongo openpyxl


【解决方案1】:

设置单元格值完成后保存工作簿。

另外,将单元格中设置的值转换为适当的格式。我选择在这里使用str。您可以根据值的内容使用json.dumps

from itertools import count
from openpyxl import Workbook

wb = Workbook()
ws = wb.active
client = pymongo.MongoClient("...")
db = client['...']
collection = db['...']
valid_timelines = collection.find({'is_timeline_valid': True})
counter = count(start=2)

for doc in valid_timelines:
    for row, dic in zip(counter, doc['timeline']['datas']):
        if 'pedido' in dic['tramite'].lower():
           ws.cell(row=row, column=1, value=str(doc['id_process_unformatted']))

        ws.cell(row=row, column=2, value=str(dic['data']))
        ws.cell(row=row, column=3, value=str(dic['tramite']))

wb.save('pedido.xlsx')

【讨论】:

  • 也许存档是问题所在。但是由于我在 mongo 中有很多数据,所以最后无法保存,因此分部分保存是一种可能的解决方案。非常感谢@Oluwafemi
  • 您可以尝试保存每n 行左右。 if row % n == 0: wb.save()。还需要考虑最后添加的行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-31
  • 1970-01-01
相关资源
最近更新 更多