Как экспортировать Qr-коды в виде изображений в файл excel на Python и Django?

Я пытаюсь создать утилиту для экспорта изображений Qr-кодов в файл excel для маркировки. Я использую библиотеку qrcode для генерации QR-кодов и библиотеку openpyxl для создания файла электронной таблицы. До сих пор экспорт электронной таблицы отлично работает без колонки Qr-кода, но как только я добавляю код для добавления qr-кода в колонку excel, мой сервер падает и останавливается без какого-либо сообщения.

Ниже приведен мой рабочий сниппет кода без сниппета qr-кода:

import openpyxl
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, Border, Side, PatternFill
from openpyxl.utils import get_column_letter
from openpyxl.styles.colors import BLACK

def process_tagging_export(queryset):
    response = HttpResponse(content_type='application/vnd.openxmlformatsofficedocument.spreadsheetml.sheet',)
    response['Content-Disposition'] = 'attachment; filename=QR_Code_Tags.xlsx'
    workbook = Workbook()
    workbook.remove(workbook.active)
    header_font = Font(name='Calibri', bold=True)
    centered_alignment = Alignment(horizontal='center')
    borders = Border(bottom=Side(border_style='medium', color='FF000000'),top=Side(border_style='medium', color='FF000000'),right=Side(border_style='medium', color='FF000000'),left=Side(border_style='medium', color='FF000000'),)
    wrapped_alignment = Alignment(vertical='top',wrap_text=True)
    columns = [
        ('Asset Code', 30),
        ('Asset Name', 30),
    ]
    worksheet = workbook.create_sheet(
        title="QR Code Tags",
        index=1,
    )
    row_num = 1
    fill = PatternFill(
        start_color='b3b3b3',
        end_color='b3b3b3',
        fill_type='solid',
    )
    for col_num, (column_title, column_width) in enumerate(columns, 1):
        cell = worksheet.cell(row=row_num, column=col_num)
        cell.value = column_title
        cell.font = header_font
        cell.border = borders
        cell.alignment = centered_alignment
        cell.fill = fill
        column_letter = get_column_letter(col_num)
        column_dimensions = worksheet.column_dimensions[column_letter]
        column_dimensions.width = column_width
    for item in queryset:
       row_num += 1
       asset_code = item.asset_code
       asset_name = item.name
       row = [
           (asset_code, 'Normal'),
           (asset_name, 'Normal'),
       ]
       for col_num, (cell_value, cell_format) in enumerate(row, 1):
        cell = worksheet.cell(row=row_num, column=col_num)
        cell.value = cell_value
        cell.style = cell_format
        cell.alignment = wrapped_alignment
    worksheet.freeze_panes = worksheet['A2']
    worksheet.sheet_properties.tabColor = '00666699'
    workbook.save(response)
    return response

Вот код, который не работает, когда я пытаюсь добавить изображения Qr-кода в столбец электронной таблицы:

import openpyxl
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, Border, Side, PatternFill
from openpyxl.utils import get_column_letter
from openpyxl.styles.colors import BLACK
import qrcode
from openpyxl.drawing.image import Image

def process_tagging_export(queryset):
    response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',)
    response['Content-Disposition'] = 'attachment; filename=QR_Code_Tags.xlsx'
    workbook = Workbook()
    workbook.remove(workbook.active)
    header_font = Font(name='Calibri', bold=True)
    centered_alignment = Alignment(horizontal='center')
    borders = Border(bottom=Side(border_style='medium', 
    color='FF000000'),top=Side(border_style='medium', 
    color='FF000000'),right=Side(border_style='medium', 
    color='FF000000'),left=Side(border_style='medium', color='FF000000'),)
    wrapped_alignment = Alignment(vertical='top',wrap_text=True)
    columns = [
        ('Asset Code', 30),
        ('Asset Name', 30),
        ('Qr Code', 35),
    ]
    worksheet = workbook.create_sheet(
        title="QR Code Tags",
        index=1,
    ) 
    row_num = 1
    fill = PatternFill(
        start_color='b3b3b3',
        end_color='b3b3b3',
        fill_type='solid',
    )
    for col_num, (column_title, column_width) in enumerate(columns, 1):
        cell = worksheet.cell(row=row_num, column=col_num)
        cell.value = column_title
        cell.font = header_font
        cell.border = borders
        cell.alignment = centered_alignment
        cell.fill = fill
        column_letter = get_column_letter(col_num)
        column_dimensions = worksheet.column_dimensions[column_letter]
        column_dimensions.width = column_width
    for item in queryset:
        row_num += 1
        asset_code = item.asset_code
        asset_name = item.name
        img = qrcode.make(asset_code)
        img_name = '{}{}'.format(asset_code, '.png')
        img.save(img_name)
        formatted_img = openpyxl.drawing.image.Image(img)
        row = [
            (asset_code, 'Normal'),
            (asset_name, 'Normal'),
            (formatted_img, 'Normal'),
        ]
        for col_num, (cell_value, cell_format) in enumerate(row, 1):
            cell = worksheet.cell(row=row_num, column=col_num)
            cell.value = cell_value
            cell.style = cell_format
            cell.alignment = wrapped_alignment
    worksheet.freeze_panes = worksheet['A2']
    worksheet.sheet_properties.tabColor = '00666699'
    workbook.save(response)
    return response

    
Вернуться на верх