Как экспортировать 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