2024-06-27 16:51:28 +03:00
|
|
|
|
import openpyxl
|
|
|
|
|
from openpyxl.drawing.image import Image
|
|
|
|
|
import requests
|
|
|
|
|
from io import BytesIO
|
2024-06-28 22:27:15 +03:00
|
|
|
|
from PIL import Image
|
2024-06-27 16:51:28 +03:00
|
|
|
|
|
|
|
|
|
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"
|
2024-06-28 22:27:15 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Увімкнення захисту листа з налаштуваннями
|
2024-06-28 22:31:03 +03:00
|
|
|
|
ws.protection.objects = True # Блокування об'єктів
|
2024-06-28 22:27:15 +03:00
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
2024-06-27 16:51:28 +03:00
|
|
|
|
|
|
|
|
|
# Зміна ширини стовпця до 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:
|
2024-06-28 22:27:15 +03:00
|
|
|
|
# Координати клітинки фото
|
|
|
|
|
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)
|
2024-06-27 16:51:28 +03:00
|
|
|
|
|
2024-06-28 22:31:03 +03:00
|
|
|
|
# Блокування клітинки з назвою товару
|
2024-06-28 22:27:15 +03:00
|
|
|
|
ws[photo_coordinates].protection = openpyxl.styles.Protection(locked=True)
|
2024-06-27 16:51:28 +03:00
|
|
|
|
|
|
|
|
|
except requests.exceptions.HTTPError as http_err:
|
|
|
|
|
print(f"HTTP помилка: {http_err}")
|
|
|
|
|
except requests.exceptions.RequestException as req_err:
|
|
|
|
|
print(f"Помилка запиту: {req_err}")
|
2024-06-28 22:27:15 +03:00
|
|
|
|
except Exception as e:
|
|
|
|
|
print(f"Виникла помилка: {e}")
|
2024-06-27 16:51:28 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Координати клітинки назви товару
|
|
|
|
|
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)
|
|
|
|
|
|
2024-06-28 22:27:15 +03:00
|
|
|
|
|
2024-06-27 16:51:28 +03:00
|
|
|
|
#Запис до файлу
|
|
|
|
|
for i in range(len(selected_products)):
|
|
|
|
|
|
|
|
|
|
# Виклик функції запису
|
|
|
|
|
add_to_file(selected_products[i], i+1)
|
|
|
|
|
|
|
|
|
|
# Збережння файлу
|
|
|
|
|
wb.save("products.xlsx")
|