Openpyxl и задачи по сравнению прайсов

Привет всем! Сегодня в продолжение записи, посвященной Python и работе с Excel я поделюсь своим вариантом решения задачи по сравнению прайсов (о ней говорилось тут).

Итак, у нас имеется некоторое количество прайс-листов, которые нужно сравнить с нашим (для упрощения задачи предположим, что структура прайс-листов совершенно одинакова). Значит, нам понадобится библиотека Openpyxl (для работы с файлами Excel), и библиотека Glob, благодаря которой мы сможем сформировать список файлов для работы. Подключаем их:
import openpyxl #Библиотека для обработки файлов Excel
import glob #Библиотека для работы с файлами

Теперь нужно понять, где находится наш прайс-лист, и прайс-листы конкурентов. Для этого вводим в программу две переменных: original_path — отвечает за путь к нашему прайс-листу, и path — переменная, обозначающая путь к каталогу с прайс-листами конкурентов.
original_path = ‘ ‘ #Путь к прайсу с нашими ценами
path = ‘ ‘ #Задали переменную с путем к рабочей папке

Настала пора сформировать список, содержащий все файлы с расширением .xlsx — на случай, если вдруг в папке с прайс-листами конкурентов окажутся иные файлы. Для этого используем библиотеку glob:
list_files = glob.glob(path + ‘*.xlsx’) #Сформировали переменную, содержащую список всех файлов Excel в рабочей папке

Начинаем обработку файлов. Учитывая, что количество файлов неизвестно, используем цикл for, который будет работать пока не обработает все файлы в списке:
for file in list_files:
    print(‘Обрабатываем файл: ‘, file) #Выводим сообщение — какой файл в обработке

Теперь начинаем получать данные из нашего прайс-листа:
    wb_orig = openpyxl.load_workbook(original_path) #Открываем Excel-файл
    sheets_list_original = wb_orig.sheetnames #Создали переменную, содержащую список всех листов в открытом Excel-файле
     sheet_active_original = wb_orig[sheets_list_original[0]] #Создали переменную, содержащую первую страницу в открытом файле
    row_count_original = sheet_active_original.max_row #Получили количество строк в открытом файле
    column_count_original = sheet_active_original.max_column #Получили количество строк в открытом файле

Теперь, когда у нас есть все необходимые данные из нашего прайс-листа аналогично получаем данные из прайс-листа конкурентов:
    wb = openpyxl.load_workbook(file) #Открыли прайс-лист конкурентов
    sheets_list = wb.sheetnames #Получили список всех листов в открытом файле
    sheet_active = wb[sheets_list[0]] #Сделали активной самую первую страницу
    row_count = sheet_active.max_row #Получили количество строк на странице
    column_count = sheet_active.max_column #Получили количество колонок на странице

Кажется, теперь пора сравнивать цены и позиции. Но я решил добавить проверку на соответствие прайсов друг другу. Делается это просто: учитывая, что изначально прайс-листы равны по количеству товаров, но не по стоимости товаров, я решил делать проверку по количеству колонок и строк. Если они равны — программа работает дальше. Если нет — программа выдает сообщение о ошибке:
    print(‘В нашем прайсе’, original_path, ‘\n — строк: ‘, row_count_original, ‘\n — колонок: ‘, column_count_original)
    print(‘В документе’, file, ‘\n — строк: ‘, row_count, ‘\n — колонок: ‘, column_count, ‘\n’)
    if row_count != row_count_original or column_count != column_count_original:
        print(‘Прайсы не совпадают, проверьте данные! \n’)
        break
    else:
        print(‘Прайсы совпадают, работаем! \n’)

Создаем переменные, отвечающие за начальное значение ячейки и колонки:
        max_row = 1
        worksheet_a = ‘A’
        worksheet_b = ‘B’

И теперь, наконец, начинаем обработку данных:
        while max_row <= row_count: #Начинаем цикл, который будет обрабатывать данные поячеечно
        cell_a = worksheet_a + str(max_row) #Создаем переменную, которая состоит из рабочей ячейки и номера
        cell_b = worksheet_b + str(max_row) #Создаем переменную, которая состоит из рабочей ячейки и номера
        from_cell_a = sheet_active[cell_a].value #Получаем значение ячейки A из прайса конкурентов
        from_cell_b = sheet_active[cell_b].value #Получаем значение ячейки B из прайса конкурентов
        from_cell_a_orig = sheet_active_original[cell_a].value #Получаем значение ячейки А из нашего прайса
        from_cell_b_orig = sheet_active_original[cell_b].value #Получаем значение ячейки В из нашего прайса
        if from_cell_b > from_cell_b_orig: #Начинаем ветку на случай, если у конкурентов товар дороже
            print(from_cell_a, ‘: \n — у конкурентов: ‘, from_cell_b, ‘\n — у нас: ‘, from_cell_b_orig)
            print(‘У конкурентов позиция дороже!\n’)
            # Пишем в итоговый файл все — пока еще в процессе доработки
        elif from_cell_b < from_cell_b_orig: #А эта ветка отвечает за случай, если у конкурентов товар дешевле
            print(from_cell_a, ‘: \n — у конкурентов: ‘, from_cell_b, ‘\n — у нас: ‘, from_cell_b_orig)
            print(‘У конкурентов позиция дешевле\n’)
            #Пишем в итоговый файл все — пока еще в процессе доработки
        elif from_cell_b == from_cell_b_orig: #Данная ветка — на случай, если стоимость товарной позиции равна
            print(from_cell_a, ‘: \n — у конкурентов: ‘, from_cell_b, ‘\n — у нас: ‘, from_cell_b_orig)
            print(‘Стоимость товара равная\n’)
            #Пишем в итоговый файл все — пока еще в процессе доработки 🙂
        max_row = max_row + 1

#Увеличиваем значение переменной на единицу, что бы цикл работал верно

В полном виде код доступен по ссылке на Git

В планах на самое ближайшее время дописать все же код: результаты проверки стоимости товарной позиции записываются постранично в итоговый Excel-файл с цветовым выделением. И оптимизировать код — ибо многие вещи можно сделать с помощью процедур, но я с ними почему-то не дружу 🙂 Но научусь, фигли…

  1. import openpyxl
  2. import glob #Библиотека для работы с файлами
  3.  
  4. print('Начинаем работу: \n')
  5.  
  6. #Формируем список файлов для работы
  7. original_path = 'c:\\Users\\Oleksiy\\Desktop\\Git\\Netology\\Excel\\Original\\Original_price.xlsx' #Путь к прайсу с нашими ценами
  8. path = 'c:\\Users\\Oleksiy\\Desktop\\Git\\Netology\\Excel\\' #Задали переменную с путем к рабочей папке
  9.  
  10. list_files = glob.glob(path + '*.xlsx') #Сформировали переменную, содержащую список всех файлов Excel в рабочей папке
  11. print(glob.glob(path + '*.xlsx')) #Вывели список всех файлов с расширением Excel
  12. for file in list_files:
  13.     print('Обрабатываем файл: ', file)
  14.  
  15.     #Получаем данные из нашего прайса (для сравнения)
  16.     wb_orig = openpyxl.load_workbook(original_path)
  17.     sheets_list_original = wb_orig.sheetnames
  18.     sheet_active_original = wb_orig[sheets_list_original[0]]
  19.     row_count_original = sheet_active_original.max_row
  20.     column_count_original = sheet_active_original.max_column
  21.  
  22.     #Начинаем получать данные из прайса конкурента
  23.     wb = openpyxl.load_workbook(file)
  24.     sheets_list = wb.sheetnames
  25.     sheet_active = wb[sheets_list[0]] #Сделали активной самую первую страницу
  26.     row_count = sheet_active.max_row
  27.     column_count = sheet_active.max_column
  28.  
  29.     print('В нашем прайсе', original_path, '\n - строк: ', row_count_original, '\n - колонок: ', column_count_original)
  30.     print('В документе', file, '\n - строк: ', row_count, '\n - колонок: ', column_count, '\n')
  31.     if row_count != row_count_original or column_count != column_count_original:
  32.         print('Прайсы не совпадают, проверьте данные! \n')
  33.         break
  34.     else:
  35.         print('Прайсы совпадают, работаем! \n')
  36.         max_row = 1
  37.         worksheet_a = 'A'
  38.         worksheet_b = 'B'
  39.  
  40.         while max_row <= row_count:
  41.             cell_a = worksheet_a + str(max_row)
  42.             cell_b = worksheet_b + str(max_row)
  43.             from_cell_a = sheet_active[cell_a].value #Получаем значение ячейки A #а нафига? Если прайсы одиннаковые - может проще писать в тот, что есть
  44.             from_cell_b = sheet_active[cell_b].value #Получаем значение ячейки B
  45.             from_cell_a_orig = sheet_active_original[cell_a].value #Получаем значение ячейки А из нашего прайса
  46.             from_cell_b_orig = sheet_active_original[cell_b].value #Получаем значение ячейки В из нашего прайса
  47.             if from_cell_b > from_cell_b_orig:
  48.                 print(from_cell_a, ': \n - у конкурентов: ', from_cell_b, '\n - у нас: ', from_cell_b_orig)
  49.                 print('У конкурентов позиция дороже!\n')
  50.                 # Пишем в итоговый файл все
  51.             elif from_cell_b < from_cell_b_orig:
  52.                 print(from_cell_a, ': \n - у конкурентов: ', from_cell_b, '\n - у нас: ', from_cell_b_orig)
  53.                 print('У конкурентов позиция дешевле\n')
  54.                 # Пишем в итоговый файл все
  55.             elif from_cell_b == from_cell_b_orig:
  56.                 print(from_cell_a, ': \n - у конкурентов: ', from_cell_b, '\n - у нас: ', from_cell_b_orig)
  57.                 print('Стоимость товара равная\n')
  58.                 #Пишем в итоговый файл все
  59.             max_row = max_row + 1

Спасибо за внимание! Все вопросы-мысли-предложения по поводу задачи по сравнению прайсов вы можете озвучить мне лично либо по почте, либо — с помощью он-лайн чатика в правом нижнем углу экрана 😉 И не забывайте кликать на рекламу!