繁体   English   中英

用 openpyxl 填充 Excel 文件

[英]Filling an Excel file with openpyxl

我正在尝试使用 JSON 文件中的数据填充 excel 文件。

JSON 文件格式如下:

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

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

Excel 文件在第一行有一个 header,在第二行的 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 来解决您的问题。 我无权访问您的数据,也没有检查错别字等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM