Добавить в корзинуПозвонить
Найти в Дзене

Сортировка листов в excel c помощью библиотеки Python Openpyxl

Иногда возникает необходимость отсортировать листы в Microsoft Excel в соответствии с определенными параметрами. В самом простом варианте нам нужно произвести сортировку по наименованию в алфавитном порядке, сложностей в данном случае не возникает, так как существует функция .sort: Первым делом импортируем класс Workbook() и с помощью него создаем новую книгу с наименованием переменной wb, к которой мы будем применять ряд операций: 1) Создаем листы с помощью функции .create_sheet("Произвольное наименование") 2) Сортируем с использованием ключа по наименованию. (строка 10) 3) Сохраняем в файл. (строка 12) Данный способ удобно использовать в случаях, когда у нас есть файл с данными, которые необходимо распределить по листам внутри одной книги, а потом уже отсортировать по алфавиту. В моём случае стояла задача отсортировать листы в количестве 85 штук в соответствии с эталонным, куда эти данные будут впоследствии загружаться, порядок листов и их наименование должны строго соответствовать.

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

Первым делом импортируем класс Workbook() и с помощью него создаем новую книгу с наименованием переменной wb, к которой мы будем применять ряд операций:

1) Создаем листы с помощью функции .create_sheet("Произвольное наименование")

2) Сортируем с использованием ключа по наименованию. (строка 10)

3) Сохраняем в файл. (строка 12)

Данный способ удобно использовать в случаях, когда у нас есть файл с данными, которые необходимо распределить по листам внутри одной книги, а потом уже отсортировать по алфавиту.

В моём случае стояла задача отсортировать листы в количестве 85 штук в соответствии с эталонным, куда эти данные будут впоследствии загружаться, порядок листов и их наименование должны строго соответствовать.

Для начала импортируем необходимую библиотеку и функцию из библиотеки openpyxl:

Рисунок 1. Импорт библиотек
Рисунок 1. Импорт библиотек

Открываем файл (openpyxl.open('path'))*, в котором нам необходимо произвести изменения, и с помощью функции .sheetnames получаем список листов, содержащихся в нашей книге:

*путь указываем в зависимости от расположения файла, если он располагается в папке с программой, то к нему можно обратиться напрямую

Рисунок 2. Открытие изменяемого файла и создание списка
Рисунок 2. Открытие изменяемого файла и создание списка

Также нам необходимо обратиться к файлу, содержащему необходимый порядок листов, для этого используем функцию load_workbook, которую импортировали, и с уже известной функцией .sheetnames создаем список.

*openpyxl позволяет обращаться напрямую к ячейкам в таблице excel и считывать информацию, поэтому возможно создать список из данных в ячейках, и впоследствии обращаться к нему.

Рисунок 3. Загрузка файла и создание списка
Рисунок 3. Загрузка файла и создание списка

Дальше нам необходимо решить основную задачу: Распределить листы в соответствии с созданным списком (sheets_list_regions).

Первый вариант, который пришел в голову: с помощью вложенного цикла сравнить наименования, а потом определить лист в новый файл с помощью копирования, НО(!) функция copy_worksheet(from_worksheet) позволяет копировать только внутри книги, с который вы на текущий момент работаете.

Второй и рабочий вариант: с помощью вложенного цикла сравниваем наименования и передвигаем лист на нужную нам позицию по индексу, для этого определена функция move_sheet(sheet, offset=0), где в аргументе sheet мы определяем имя, а в offset на сколько нам необходимо переместить наш лист(sheet).

Цикл проходит по списку эталонного файла и мы определяем тем самый верный порядок построения листов, вложенный цикл проходит по списку в изменяемом файле и мы сравниваем наименования:

Рисунок 4. Прохождение по циклам и сравнение
Рисунок 4. Прохождение по циклам и сравнение

Необходимо теперь разобраться как работает аргумент offset в функции move_sheet, чтобы понять дальнейший алгоритм действий:

Рисунок 5. Внутренности функции move_sheet
Рисунок 5. Внутренности функции move_sheet

Из кода функции мы понимаем, что позиция(new_pos) задается сложением индекса(idx), который мы нашли по наименованию листа, и числом(offset). В offset мы задаем число, на которое мы будем перемещать лист(sheet) вперед(!) по списку.

В Python нумерация списка идёт от 0 и заканчивается числом равным количеству элементов в списке минус 1, т.е. если у вас элементов в списке 100, индекс крайнего элемента будет 99. В моём случае индекс последнего элемента был равен 84. Таким образом, чтобы задать новую позицию листа нам необходимо из 84 вычесть индекс листа(sheet) из изменяемого файла и прибавить индекс листа из эталонного файла - это и будет значение offset.

Рисунок 6. Вычисление offset
Рисунок 6. Вычисление offset

Вычисление индексов помещаем в переменные, тем самым сокращаем формулу для вычисления offset в функции. После того как прошли все циклы, сохраняем файл.

Итог: