diff --git a/db_to_xlsx.py b/db_to_xlsx.py index 1b13e30..e4855a6 100644 --- a/db_to_xlsx.py +++ b/db_to_xlsx.py @@ -2,6 +2,7 @@ import openpyxl from openpyxl.drawing.image import Image import requests from io import BytesIO +from PIL import Image from models import Product @@ -16,9 +17,23 @@ except Exception as e: wb = openpyxl.Workbook() ws = wb.active ws.title = "Sheet" -# Захист об'єктів -ws.protection.objects = True -ws.protection.password = '' + + +# Увімкнення захисту листа з налаштуваннями +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 # встановлюємо ширину стовпця у символах @@ -30,19 +45,23 @@ def add_to_file(product, row_num): ws.row_dimensions[row_num].height = 200 * 0.75 try: - # Отримання зображення - response = requests.get(product.photo_url) - img_data = BytesIO(response.content) - # Об'єкт зображення - img = Image(img_data) + # Координати клітинки фото + photo_coordinates = 'B' + str(row_num) - # Додаємо зображення на лист - ws.add_image(img, '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}") # Координати клітинки назви товару @@ -52,16 +71,12 @@ def add_to_file(product, row_num): # Стилізація: перенесення тексту, позиціювання по центру у вертикалі 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) - - - -# Встановлюємо захист для всього листа з паролем -ws.protection.enable() # Збережння файлу wb.save("products.xlsx")