python
July 18, 2021

Коммуникация с Excel на Python без VBA

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

Установка модуля осуществляется просто - pip install openpyxl. Создадим демонстрационный файл с двумя листами вида:

Чтение и запись

Чтение

Происходит посредством вызова функции load_workbook с именем файла в качестве параметра:

import openpyxl
wb = openpyxl.load_workbook('file.xlsx')

Запись

Осуществляется методом save объекта рабочей книги:

wb.save('file_new.xlsx')

Создание

Также можно создать и сохранить рабочую книгу самому. Для этого возвращается объект класса Workbook и впоследствии сохраняется методом save:

wb = openpyxl.Workbook()
wb.save('file_new.xlsx')

Листы и их свойства

Продолжим работу с демонстрационным файлом file.xlsx.

Cписок листов

Для получения достаточно вызвать свойство sheetnames рабочей книги:

wb.sheetnames

Получение

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

wb[wb.sheetnames[1]], wb.active

Создание

Осуществляется методом create_sheet. Создадим новую рабочую книгу, новый лист и сохраним в файле:

wb = openpyxl.Workbook()
wb.create_sheet(title='новый_лист')
wb.save('file_new.xlsx')

Количество строк и столбцов листа

Эти значения доступны через атрибуты max_row и max_column листа (далее wb - объект рабочей книги файла file.xlsx):

sheet = wb.active
sheet.max_row, sheet.max_column

Обратите внимание, что в список попадают строки и столбцы, в которых когда-то присутствовали значения или форматирование, но были удалены. Чтобы такие строки или столбцы не рассматривались требуется их удаление.

Ячейки и их свойства

Получение ячеек

Осуществляется путем адресации по имени либо по номеру строки и столбца (начиная с 1):

sheet['B2'], sheet.cell(2,2)

Значение и координаты

У каждой ячейки есть значение (value), а также местоположение/координаты (coordinate), определяемые строкой (row), столбцом (column) на пересечении которых она находится:

sheet['B2'].value, sheet['B2'].coordinate, sheet['B2'].row, sheet['B2'].column 

Диапазоны, строки и столбцы

Диапазон ячеек

Для получения обращаемся к объекту листа с указанием левой верхней и правой нижней ячеек:

 sheet['A1':'D4']

Так можно вывести на экран значения ячеек:

for row in sheet['A1':'D4']:
    for cell in row:
        print(cell.coordinate, cell.value)
        

Строки и столбцы

Используя свойства rows, columns объекта листа, можно получить генераторы всех ячеек (отличие - первое измерение по строкам или столбцам):

sheet.rows, sheet.columns

Так перебираются элементы по столбцам:

for col in sheet.columns:
    for cell in col:
        print(cell.coordinate, cell.value)

Также можно обратиться к отдельным строкам и столбцам:

tuple(sheet.columns)[1]
[it.value for it in tuple(sheet.columns)[1]]

Преобразование буквенных обозначений столбцов в числа и обратно

Для этого используются функции column_index_from_string и get_column_letter модуля openpyxl.utils:

from openpyxl.utils import get_column_letter, column_index_from_string
column_index_from_string('ABC'), get_column_letter(731)