Сообщить об ошибке.

Объект Worksheet модуля openpyxl в Python

Основные атрибуты и методы объекта Worksheet

Объект Worksheet представляет собой рабочий лист, который в электронных таблицах Excel служит контейнером 2-го уровня.

Не создавайте рабочие листы самостоятельно, для этого используйте Workbook.create_sheet(). При создании новой рабочей книги средствами модуля openpyxl, по умолчанию уже создается один рабочий лист, доступ к которому можно получить через свойство Workbook.active.

>>> from openpyxl import Workbook
# создаем объект книги
>>> wb = Workbook()
# список имен листов в только 
# что созданной книге
>>> wb.sheetnames
# ['Sheet']

# доступ к созданному по 
# умолчанию листу 'Sheet' 
>>> ws = wb.active
# переименовываем
>>> ws.title = 'MySheet'
# или создаем новый
>>> ws1 = wb.create_sheet('NewSheet')
# список имен листов в книге
>>> wb.sheetnames
# ['MySheet', 'NewSheet']

Содержание:


Worksheet.active_cell:

Свойство Worksheet.active_cell возвращает имя активной ячейки листа Worksheet.

>>> ws.active_cell
# 'A1'

Worksheet.add_chart(chart, anchor=None):

Метод Worksheet.add_chart() добавляет объект диаграммы chart на текущий рабочий лист. При необходимости можно указать ячейку anchor для привязки к ней диаграммы. Диаграмма привязывается к левому верхнему углу ячейки.

Worksheet.add_data_validation(data_validation):

Метод Worksheet.add_data_validation() добавляет на рабочий лист электронной таблицы объект проверки данных data_validation.

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

Worksheet.add_image(img, anchor=None):

Метод Worksheet.add_image() добавляет изображение img на лист электронной таблицы.

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

Worksheet.add_table(table):

Метод Worksheet.add_table() добавляет объект таблицы table на лист электронной таблицы.

Объект таблицы рабочего листа представляет собой ссылку на группу ячеек, что облегчает работу с данными, если на одном листе представлены несколько таблиц.

Перед добавлением объекта таблицы рабочего листа Table, необходимо сначала проверить наличие имени таблицы displayName в определенных именах и других таблицах рабочего листа во избежании получения исключения.

# проверим имя таблицы
if not ws.tables.get('MyTable'):
    # создаем объект таблицы
    table = Table(displayName="MyTable", ref="A1:E5")
    # добавляем таблицу
    ws.add_table(table)

Worksheet.append(iterable):

Метод Worksheet.append() добавляет группу значений в последнюю строку, которая не содержит данных.

  • Если это список: все значения добавляются по порядку, начиная с первого столбца.
  • Если это словарь: значения присваиваются столбцам, обозначенным ключами (цифрами или буквами).

Варианты использования:

  • добавление списка: .append([‘ячейка A1’, ‘ячейка B1’, ‘ячейка C1’])
  • добавление словаря:
    • вариант 1: .append({‘A’ : ‘ячейка A1’, ‘C’ : ‘ячейка C1’}), в качестве ключей используются буквы столбцов.
    • вариант 2: .append({1 : ‘ячейка A1’, 3 : ‘ячейка C1’}), в качестве ключей используются цифры столбцов.

Пример добавление данных из списка:

# существующие листы рабочей книги
>>> wb.sheetnames
# ['MySheet', 'NewSheet']

# добавим данные в лист с именем `Mysheet2`
>>> ws = wb["MySheet"]
# создадим произвольные данные, используя
# вложенный генератор списков
>>> data = [[row*col for col in range(1, 10)] for row in range(1, 31)]
>>> data
# [
#     [1, 2, 3, 4, 5, 6, 7, 8, 9], 
#     [2, 4, 6, 8, 10, 12, 14, 16, 18], 
# ...
# ...
#     [30, 60, 90, 120, 150, 180, 210, 240, 270]
# ]

# добавляем данные в выбранный лист
>>> for row in data:
...     ws.append(row)
...

Вот и все, данные добавлены...

Worksheet.calculate_dimension()
Worksheet.dimensions:

Метод Worksheet.calculate_dimension() и свойство Worksheet.dimensions возвращают минимальный диапазон для всех ячеек текущего рабочего листа, которые содержат данные (например, ‘A1:M24’).

>>> ws.calculate_dimension()
# 'A1:I35'
>>> ws.dimensions
# 'A1:I35'

Worksheet.cell(row, column, value=None):

Метод Worksheet.cell() возвращает объект ячейки Cell на основе заданных координат.

Аргументы:

Пример:

# доступ к объекту ячейки
>>> cell = ws.cell(row=4, column=2)
>>> cell
# <Cell 'Sheet'.B4>

# доступ с присваиваем значения ячейки
>>> cell = ws.cell(row=4, column=2, value=10)

Важно! Ячейки создаются при первом доступе к ним. Из-за такого поведения, простой перебор ячеек в цикле, создаст объекты этих ячеек в памяти, даже если не присваивать им значения.

Этот код создаст в памяти 100x100=10000 пустых объектов ячеек, просто так израсходовав оперативную память.

>>> for x in range(1,101):
...        for y in range(1,101):
...            # доступ к объекту ячейки
...            ws.cell(row=x, column=y)

Worksheet.columns:

Свойство Worksheet.columns создает генератор всех объектов ячеек текущего рабочего листа, в которых есть данные, по столбцам. Дополнительно смотрите метод Worksheet.iter_cols().

>>> ws.columns
# [(<Cell 'Sheet'.A1>, <Cell 'Sheet'.A2>, <Cell 'Sheet'.A3>, ...),
# (<Cell 'Sheet'.B1>, <Cell 'Sheet'.B2>, <Cell 'Sheet'.B3>, ...),
# ...

>>> for col in ws.columns:
...     for cell in col:
...         print(cell)
# <Cell 'Sheet'.A1>
# <Cell 'Sheet'.A2>
# <Cell 'Sheet'.A3>
# ...
# <Cell 'Sheet'.B1>
# <Cell 'Sheet'.B2>
# <Cell 'Sheet'.B3>
...

Worksheet.column_dimensions:

Свойство Worksheet.column_dimensions содержит информацию о свойствах отображения столбцов и представляет собой словарный объект. Ключами объекта служат буквы столбцов рабочего листа. Например, что бы обратиться к группе ячеек определенного столбца, необходимо указать букву этого столбца: Worksheet.column_dimensions['D'].

Этот словарный объект имеет полезные атрибуты .width при помощи которого можно изменять ширину столбца.

Пример изменения высоты строки и ширины ячейки:

>>> from openpyxl import Workbook
>>> wb = Workbook()
>>> ws = wb.active
>>> ws.title = 'RowColDimension'
# изменяем ширину колонки
>>> ws.column_dimensions['B'].width = 30
>>> ws.column_dimensions['D'].width = 50
# изменяем высоту строки
>>> ws.row_dimensions[5].height = 50
# для наглядности запишем в ячейки значения
>>> ws['B5'] = 'ширина = 30, высота = 50'
>>> ws['D5'] = 'ширина = 50, высота = 50'
# ну и выравним 
>>> from openpyxl.styles import Alignment
>>> for cell in ws[5]:
...     if cell.value:
...         cell.alignment = Alignment(horizontal="center", vertical="center")
>>> wb.save('width-height.xlsx')

Примечание: в коде используется свойство рабочего листа электронной таблицы Worksheet.row_dimensions.

Свойство Worksheet.column_dimensions имеет метод .group(start, end=None, outline_level=1, hidden=False), который разрешает группировку ряда последовательных строк или столбцов вместе, что бы свернуть/скрыть или показать их.

Принимаемые аргументы .group():

  • start: первый столбец для группировки (обязательно).
  • end=None: последний столбец для группировки (необязательно).
  • outline_level=1: уровень вложенности сворачивания. Например можно свернуть с 1 по 10 строки с уровнем 1, а потом свернуть строки с 5 по 10 с уровнем 2. В этом случае, при открытии документа появиться возможность показать/развернуть скрытые строки в 2 этапа. Так же это работает и с колонками.
  • hidden=False: должна ли группа быть свернута/скрыта на рабочем листе.

Пример сворачивания группы колонок и строк:

>>> from openpyxl import Workbook
>>> wb = Workbook()
>>> ws = wb.active
>>> ws.title = 'RowColFold'
# свернем колонки с буквами с 'C' до 'F'
>>> ws.column_dimensions.group('C','F', hidden=True)
# свернем строки с номерами с 3 по 10
>>> ws.row_dimensions.group(3, 10, hidden=True)
# теперь свернем строки с номерами с 7 по 10, с уровнем 2
>>> ws.row_dimensions.group(7,10, outline_level=2, hidden=True)
>>> wb.save('fold_row-col.xlsx')

Worksheet.delete_cols(idx, amount=1):

Метод Worksheet.delete_cols() удаляет столбец или столбцы из col==idx, где idx числовой индекс столбца. Аргумент amount - количество удаляемых столбцов. По умолчанию удаляется один столбец.

Например, чтобы удалить столбцы в диапазоне F:H необходимо вызвать ws.delete_cols(6, 3).

# удалим 3 столбцы в диапазоне `F:H`
>>> ws.delete_cols(6, 3)

Worksheet.delete_rows(idx, amount=1):

Метод Worksheet.delete_rows() удаляет строку или строки из row==idx, где idx числовой индекс строки. Аргумент amount - количество удаляемых строк. По умолчанию удаляется одна строка.

Например, чтобы удалить строки в диапазоне 5:8 необходимо вызвать ws.delete_rows(5, 3).

# удалим 3 строки с 5 по 8
>>> ws.delete_rows(5, 3)

Worksheet.freeze_panes:

Свойство Worksheet.freeze_panes фиксирует строки и колонки находящиеся выше и левее указанной ячейки. Другими словами, это свойство фиксирует все что выше и левее указанной ячейки.

Например, если указать ws.freeze_panes = 'A3', то это заставит программу Excel зафиксировать только две верхние строки от прокрутки по вертикали. А если указать ws.freeze_panes = 'B3', то это зафиксирует две верхние строки от прокрутки по вертикали и колонку 'A' от прокрутки по горизонтали.

Worksheet.insert_cols(idx, amount=1):

Метод Worksheet.insert_cols() вставляет столбец или столбцы перед col==idx, где idx числовой индекс столбца. Аргумент amount - количество вставляемых столбцов. По умолчанию вставляется один столбец.

Например, чтобы вставить 3 столбца перед существующим столбцом D необходимо вызвать ws.insert_cols(4, 3).

# вставим 3 новых столбца
>>> ws.insert_cols(4, 3)

Worksheet.insert_rows(idx, amount=1):

Метод Worksheet.insert_rows() вставляет строку или строки перед row==idx, где idx числовой индекс строки. Аргумент amount - количество вставляемых строк. По умолчанию вставляется одна строка.

Например, чтобы вставить 3 строки перед существующей 7-ой строкой необходимо вызвать ws.insert_rows(7, 3).

# вставим 3 новые строки перед 
# существующей 7-ой строкой
>>> ws.insert_rows(7, 3)

Worksheet.iter_cols(min_col=None, max_col=None, min_row=None, max_row=None, values_only=False):

Метод Worksheet.iter_cols() читает объекты ячеек на рабочем листе по столбцам (только те, которые имеют данные). Диапазон итерации задается с помощью индексов строк и столбцов. Возвращает генератор объектов из прочитанных ячеек.

  • Если индексы не указаны, то диапазон начинается с ячейки A1.
  • Если на листе нет ячеек с данными, то будет возвращен пустой кортеж.

Аргументы:

  • min_col - наименьший индекс столбца.
  • min_row - наименьший индекс строки.
  • max_col - наибольший индекс столбца.
  • max_row - наибольший индекс строки.
  • values_only - следует ли возвращать только значения ячеек.
>>> for col in ws.iter_cols(max_col=2, min_row=1, max_row=2):
...     for cell in col:
...         print(cell)
# <Cell Sheet1.A1>
# <Cell Sheet1.A2>
# <Cell Sheet1.B1>
# <Cell Sheet1.B2>

Примечание. Из соображений производительности метод Worksheet.iter_cols() недоступен в режиме только для чтения.

Worksheet.iter_rows(min_row=None, max_row=None, min_col=None, max_col=None, values_only=False):

Метод Worksheet.iter_rows() читает объекты ячеек на рабочем листе по строкам (только те, которые имеют данные). Диапазон итерации задается с помощью индексов строк и столбцов. Возвращает генератор объектов из прочитанных ячеек.

  • Если индексы не указаны, то диапазон начинается с ячейки A1.
  • Если на листе нет ячеек с данными, то будет возвращен пустой кортеж.

Аргументы:

  • min_col - наименьший индекс столбца.
  • min_row - наименьший индекс строки.
  • max_col - наибольший индекс столбца.
  • max_row - наибольший индекс строки.
  • values_only - следует ли возвращать только значения ячеек.
>>> for col in ws.iter_rows(min_col=1, max_col=2, max_row=2):
...     for cell in col:
...         print(cell)
# <Cell 'Sheet'.A1>
# <Cell 'Sheet'.B1>
# <Cell 'Sheet'.A2>
# <Cell 'Sheet'.B2>

Worksheet.max_column:

Свойство Worksheet.max_column возвращает максимальный индекс столбца, содержащий данные. Индексы столбцов начинаются с 1, а не с 0, как в списке.

>>> ws.max_column
# 12

Worksheet.max_row:

Свойство Worksheet.max_row возвращает максимальный индекс строки, содержащий данные. Индексы строк начинаются с 1, а не с 0, как в списке.

>>> ws.max_row
# 35

Worksheet.merge_cells(range_string=None, start_row=None, start_column=None, end_row=None, end_column=None):

Свойство Worksheet.merge_cells устанавливает слияние в диапазоне ячеек range_string. Диапазон range_string - это диапазон ячеек, который задается строкой, например, 'A1:E1'.

Диапазон ячеек, также можно установить при помощи аргументов start_row, start_column, end_row и end_column.

>>> from openpyxl import Workbook
>>> wb = Workbook()
>>> ws = wb.active
# объединить ячейки, находящиеся 
# в диапазоне `B2 : E2`
>>> ws.merge_cells('B2:E2')

Worksheet.min_column:

Свойство Worksheet.min_column возвращает минимальный индекс столбца, содержащий данные. Индексы столбцов начинаются с 1, а не с 0, как в списке.

>>> ws.min_column
# 1

Worksheet.min_row:

Свойство Worksheet.min_row возвращает минимальный индекс строки, содержащий данные. Индексы строк начинаются с 1, а не с 0, как в списке.

>>> ws.min_row
# 1

Worksheet.move_range(cell_range, rows=0, cols=0, translate=False):

Метод Worksheet.move_range() перемещает диапазон ячеек cell_range на количество строк rows и/или столбцов cols:

  • вниз, если rows > 0, и вверх, если rows < 0,
  • вправо, если cols > 0, и влево, если cols < 0.

Существующие ячейки будут перезаписаны. Формулы и ссылки обновляться не будут.

Пример:

>>> ws.move_range("D4:F10", rows=-1, cols=2)

Это приведет к перемещению ячеек в диапазоне ячеек D4:F10 вверх на одну строку и вправо на два столбца. Ячейки будут перезаписаны всеми существующими ячейками.

Если ячейки содержат формулы, то openpyxl может транслировать их, но этот функционал умолчанию отключен. Кроме того, будут транслированы только формулы в самих ячейках. Ссылки на ячейки из других ячеек или определенные имена обновляться не будут. Для этого можно использовать переводчик формул синтаксического анализа:

>>> ws.move_range("G4:H10", rows=1, cols=1, translate=True)

Это приведет к перемещению относительных ссылок в формулах в диапазоне на одну строку и один столбец.

Worksheet.print_area:

Свойство Worksheet.print_area возвращает/устанавливает область печати "по умолчанию" для текущего рабочего листа электронной таблицы. Если область печати не задана, то возвращается None.

Для установки области печати "по умолчанию", необходимо указать диапазон, например 'A1:D4', или список диапазонов.

>>> print(ws.print_area)
# None

# установим диапазон печати
>>> ws.print_area = 'A1:F10'
>>> ws.print_area
# ['$A$1:$F$10']

# несколько диапазонов для печати по умолчанию
>>> ws.print_area = ['A1:B2', 'C3:F5']
>>> ws.print_area
# ['$A$1:$a$2', '$a$3:$f$10']

Worksheet.print_title_cols:

Свойство Worksheet.print_title_cols устанавливает колонки, которые должны быть напечатаны слева на каждой странице, например: 'A:C'.

# заставляем Excel печатать   
# колонку `A` на каждом листе
>>> ws.print_title_cols = 'A:A'

Worksheet.print_title_rows:

Свойство Worksheet.print_title_rows устанавливает строки, которые должны быть напечатаны вверху каждой страницы, например, '1:3'.

# заставляем Excel печатать диапазон 
# строк со 2 по 3 на каждом листе
>>> ws.print_title_rows = '2:3'

Worksheet.rows:

Свойство Worksheet.rows создает генератор всех объектов ячеек текущего рабочего листа, в которых есть данные, по строкам. Дополнительно смотрите метод Worksheet.iter_rows().

>>> list(ws.rows)
# [(<Cell 'Sheet'.A1>, <Cell 'Sheet'.B1>, <Cell 'Sheet'.C1>, 
# (<Cell 'Sheet'.A2>, <Cell 'Sheet'.B2>, <Cell 'Sheet'.C2>, , ...),
# ...

>>> for row in ws.rows:
...     for cell in row:
...         print(cell)
# <Cell 'Sheet'.A1>
# <Cell 'Sheet'.B1>
# <Cell 'Sheet'.C1>
# ...
# <Cell 'Sheet'.A2>
# <Cell 'Sheet'.B2>
# <Cell 'Sheet'.C2>
...

Worksheet.row_dimensions:

Свойство Worksheet.row_dimensions содержит информацию о свойствах отображения строк и представляет собой словарный объект. Ключами объекта служат номера строк.

Этот словарный объект имеет полезные атрибут .height при помощи которого можно менять высоту строки и метод .group, который служит для группировки строк, для дальнейшего их сворачивания.

Так же смотрите свойство Worksheet.column_dimensions и материал "Изменение размеров строки/столбца модулем openpyxl в Python"

Worksheet.set_printer_settings(paper_size, orientation):

Метод Worksheet.set_printer_settings() устанавливает размер бумаги paper_size и ориентацию страницы orientation по умолчанию для текущего листа электронной таблицы.

Аргумент paper_size может принимать значения:

  • Worksheet.PAPERSIZE_A3 = '8'.
  • Worksheet.PAPERSIZE_A4= '9'.
  • Worksheet.PAPERSIZE_A4_SMALL= '10'.
  • Worksheet.PAPERSIZE_A5= '11'.
  • Worksheet.PAPERSIZE_EXECUTIVE= '7'.
  • Worksheet.PAPERSIZE_LEDGER= '4'.
  • Worksheet.PAPERSIZE_LEGAL= '5'.
  • Worksheet.PAPERSIZE_LETTER= '1'.
  • Worksheet.PAPERSIZE_LETTER_SMALL= '2'.
  • Worksheet.PAPERSIZE_STATEMENT= '6'.
  • Worksheet.PAPERSIZE_TABLOID= '3'.

Ориентация страницы, так же настраивается при помощи констант объекта Worksheet

  • Worksheet.ORIENTATION_LANDSCAPE= 'landscape'.
  • Worksheet.ORIENTATION_PORTRAIT= 'portrait'.

Примечание: В коде не обязательно использовать имена констант, можно напрямую использовать их значения.

# формат `А4`, ориентированный как `landscape`
>>> set_printer_settings('9', 'landscape')

Worksheet.tables:

Свойство Worksheet.tables возвращает все объекты таблиц текущего листа документа XLSX, добавленные методом Worksheet.add_table().

Worksheet.unmerge_cells(range_string=None, start_row=None, start_column=None, end_row=None, end_column=None):

Метод Worksheet.unmerge_cells() удаляет слияние ячеек в диапазоне range_string. Аргумент range_string - это диапазон ячеек, который ранее был объединен при помощи метода Worksheet.merge_cells() и задается строкой, например, 'A1:E1'.

Диапазон ячеек, также можно установить при помощи аргументов start_row, start_column, end_row и end_column.

>>> from openpyxl import Workbook
>>> wb = Workbook()
>>> ws = wb.active
# объединим ячейки
>>> ws.merge_cells('B2:E2')
# а теперь разъединим ячейки,  
# в диапазоне `B2 : E2`
>>> ws.unmerge_cells('B2:E2')

Worksheet.values:

Свойство Worksheet.values создает генератор, который содержит все значения ячеек, которые имеются на текущем листе по строкам.

for row in ws.values:
   for value in row:
     print(value)

Этот код напечатает все значения ячеек текущего рабочего листа, которые имеют какие-то данные.