用openpyxl填充Excel文件

2024-05-23 14:23:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用JSON文件中的数据填充excel文件

JSON文件具有以下格式:

"checklist": {
    "0": {
        "Verdict": "",
        "Issue description": "",
        "Due date": "",
        "Resolution": ""
    }, 
    "1": ....
}

它有很多字典都遵循这种格式

Excel文件的第一行有一个标题,第二行的cols上有该字典的键

我需要使用包含等于“FAIL”、“NC”或“ISSUE”的判定值的字典,用JSON文件中包含的数据填充Excel文件的行

我的python代码如下所示:

wb = load_workbook("template.xlsx")
ws = wb['Sheet1']
verdict = ['FAIL', 'NC', 'ISSUE']
for row in ws.iter_rows(min_row=3):
    for key in input_data['checklist']:
        if input_data['checklist'][key]['Verdict'] in verdict:
            row[1].value = input_data['checklist'][key]['Issue description'] 
            row[2].value = input_data['checklist'][key]['Due date']
            row[3].value = input_data['checklist'][key]['Resolution']
wb.save('file.xlsx')

我遇到的问题是,Excel文件在许多行中填充了相同的值,而不是每个匹配字典只填充一行


Tags: 文件数据keyinjsoninputdata字典
1条回答
网友
1楼 · 发布于 2024-05-23 14:23:17

看起来您遇到了一个问题,因为您使用的是嵌套循环:对于每一行,您再次循环检查表,这就是为什么您在每一行中看到相同的值。对于这样的任务,您可以使用zip并行循环多个项目,假设它们具有相同的长度,或者如果您知道一个列表更长,则使用ziplongest。这对于openpyxl中的iter_rows()尤其重要,因为如果工作表是新的,它很快就会耗尽。在这种情况下,使用ws.append()更容易

对于嵌套的数据结构,使用临时变量通常也很有用,以便进行长时间且容易出错的查找

因此,将清单字典转换为如下列表:

checklist = input_data['checklist']) # remove one level
for key, values in sorted(checklist.items()):
     if values['Verdict'] in verdict:
         row = values['Issue description'], values['Due date'], values['Resolution']
         ws.append(row)

在新工作表上,您可以通过先添加两个空工作表前进到第三行:

ws.append([])
ws.append([])

(类似地,如果要插入(例如)从列C padding=[None]*2而不是A插入,可以用None填充确实添加的行。)

否则,如果使用现有图纸,则需要手动设置行

for (idx, item), row in zip(sorted(checklist.items()), ws.iter_rows(min_row=3, max_col=3, max_row=len(checklist)+3)):
   for cell, key in zip(row, ['Issue description', 'Due date', 'Resolution']):
       cell.value = item[key]

但是,由于您有一个条件步骤,这可能会导致不满足条件的空行。在这种情况下,您可以创建自己的计数器–这是不可取的,因为“off by 1”错误是世界上最常见的错误之一,尤其是在openpyxl中,我们使用基于1的索引。这里更好的选择是在开始添加行之前过滤结果

filtered = [(key, value) for key, value in sorted(checklist.items()) if value['Verdict' in verdict]

注意:这里的代码只是为了说明如何通过充分利用Python和openpyxl API来解决您的问题。我无法访问您的数据,也没有检查打字错误等

相关问题 更多 >