Python 用openpyxl填充Excel文件
我试图用JSON文件中的数据填充excel文件 JSON文件具有以下格式:Python 用openpyxl填充Excel文件,python,json,excel,dictionary,openpyxl,Python,Json,Excel,Dictionary,Openpyxl,我试图用JSON文件中的数据填充excel文件 JSON文件具有以下格式: "checklist": { "0": { "Verdict": "", "Issue description": "", "Due date": "", "Resolution&q
"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文件在许多行中填充了相同的值,而不是每个匹配字典只填充一行。看起来您遇到了问题,因为您使用了嵌套循环:对于每一行,您再次循环检查表,这就是为什么您在每一行中看到相同的值。对于这样的任务,您可以使用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来解决您的问题。我无法访问您的数据,也没有检查打字错误等。非常感谢您的回答。我理解你的方法,这似乎是最好的方法。但是,此行抛出一个错误:cell.value=item[key]TypeError:string索引必须是整数听起来像是在使用第二种方法。您可以轻松地检查打印语句中的
项
,并相应地调整代码。这可能只是字典的钥匙。我会相应地更新我的代码。第二种方法对我来说非常适合。非常感谢你!