import openpyxl from openpyxl.drawing.image import Image import requests from io import BytesIO from PIL import Image from models import Product # Отримання товарів із фото try: selected_products = Product.select().where(Product.photo_url.is_null(False)).limit(20) except Exception as e: print(f"Виникла помилка: {e}") # Створення воркбуку та аркушу wb = openpyxl.Workbook() ws = wb.active ws.title = "Sheet" # Увімкнення захисту листа з налаштуваннями ws.protection.objects = False # Заборонити редагування об'єктів (наприклад, зображень) ws.protection.scenarios = False ws.protection.formatCells = False ws.protection.formatColumns = False ws.protection.formatRows = False ws.protection.insertColumns = False ws.protection.insertRows = False ws.protection.insertHyperlinks = False ws.protection.deleteColumns = False ws.protection.deleteRows = False ws.protection.selectLockedCells = False ws.protection.selectUnlockedCells = False # Зміна ширини стовпця до 200px ws.column_dimensions["A"].width = ws.column_dimensions["B"].width = 200 / 7 # встановлюємо ширину стовпця у символах # Додавання назви та фото товару до аркушу ws def add_to_file(product, row_num): # Встановлення висоти рядка 200px ws.row_dimensions[row_num].height = 200 * 0.75 try: # Координати клітинки фото photo_coordinates = 'B' + str(row_num) photo = Image.open(requests.get(product.photo_url, stream=True).raw) img = openpyxl.drawing.image.Image(photo) ws.add_image(img, photo_coordinates) # Блокування клітинки з назвою товару ws[photo_coordinates].protection = openpyxl.styles.Protection(locked=True) except requests.exceptions.HTTPError as http_err: print(f"HTTP помилка: {http_err}") except requests.exceptions.RequestException as req_err: print(f"Помилка запиту: {req_err}") except Exception as e: print(f"Виникла помилка: {e}") # Координати клітинки назви товару name_coordinates = 'A' + str(row_num) # Запис назви товару ws[name_coordinates] = selected_products[i].product_name # Стилізація: перенесення тексту, позиціювання по центру у вертикалі ws[name_coordinates].alignment = openpyxl.styles.Alignment(vertical='center', wrap_text=True) #Запис до файлу for i in range(len(selected_products)): # Виклик функції запису add_to_file(selected_products[i], i+1) # Збережння файлу wb.save("products.xlsx")