使用 openpyxl 将 python 个字典列表写入 xlsx

write python list of dicts to xlsx using openpyxl

我尝试使用 openpyxlsx

dictslist 写入 xlsx 文件
products= [{'id':46329', 
            'discription':'AD BLeu', 
            'marque':'AZERT',
            'category':'liquid',
            'family': 'ADBLEU', 
            'photos':'D:\hamzawi\hamza\image2py\46329_1.png'},
            {dict2 ...},
            {dictn...}
           ]

 # creat a workbook
 filena = "produitimage.xlsx"
 workbook = Workbook()
 sheet = workbook.active
 #add headers
 sheet.append(["Product ID", "Product Name", "Marque",
          "Category", "Family", "Photos"])
 for product in products:
    for item in product.items():
        for row, entry in enumerate(item, start=3):
            sheet.cell(row=row, column=1, value=entry)
 #add some images
 images = [item['photos'] for item in products]
 for image in images:
     logo = Image(image)
     #logo.height = 150
     #logo.width = 150
     sheet.add_image(logo)
 workbook.save(filename=filena)

我得到了只有 headers 没有数据的 xlsx 文件

您的代码中存在一些问题。
首先,您在设置它的循环中递增 next_row 值,因此递增无效并且每次迭代 next_row 的值等于 3.
其次,您正在尝试将 dict 值列表写入 excel 单元格,但我认为您希望将其写成一行。因此,您只需像在循环上方使用 header 那样附加它:

for product in products:
    sheet.append(list(product.values()))

如果您需要在一行中的最后一个单元格中插入图像,您可以这样重写循环:

for row_index, product in enumerate(products):
    values = list(product.values())
    sheet.append(values[:-1])
    col_row = get_column_letter(len(values)) + str(row_index+1) 
    photo_path = values[-1]
    sheet.add_image(Image(photo_path), col_row)

Question: append list of dict

import openpyxl

products = [{'id':46329, 
             'discription':'AD BLeu', 
             'marque':'AZERT',
             'category':'liquid',
             'family': 'ADBLEU', 
             'photos':'D:\hamzawi\hamza\image2py\46329_1.png'}
            ]

# Dictionarys are not in order by default
# Define a `list` of `keys` in desired order
fieldnames = ['id', 'discription', 'marque', 'category', 'family', 'photos']

# create a new workbook
wb = openpyxl.Workbook()
ws = wb.active

# append headers
ws.append(["Product ID", "Product Name", "Marque", "Category", "Family", "Photos"])

# append data
# iterate `list` of `dict`
for product in products:
    # create a `generator` yield product `value`
    # use the fieldnames in desired order as `key`
    values = (product[k] for k in fieldnames)

    # append the `generator values`
    ws.append(values)

# show Worksheet Values
for row_values in ws.iter_rows(values_only=True):
    for value in row_values:
        print(value, end='\t')
    print()

Output:

Product ID  Product Name    Marque  Category    Family  Photos  
46329       AD BLeu         AZERT   liquid      ADBLEU  D:\hamzawi\hamza\image2py329_1.png   

如果您想要图像而不是图像文件路径,请更改以下内容:

# remove 'photos' from fieldnames
fieldnames = \
['id', 'discription', 'marque', 'category', 'family']

# you need the Row index, add a `enumerate(..., 2)`
for row, product in enumerate(products,2):
    values = (product[k] for k in fieldnames)
    sheet.append(values)

    # after append the `values` add the image
    # Here, Column 'F'
    ws.add_image(Image(product['photos']), 'F{}'.format(row))