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

Работа с объектом Table() модуля openpyxl в Python

Работа c таблицами рабочих листов модуля openpyxl

Модуль openpyxl поддерживает создание, так называемых, таблиц рабочего листа (объекты openpyxl.worksheet.table.Table()) которые являются ссылками на группы ячеек. На рабочем листе таких таблиц может быть несколько. Работа с объектами таблиц облегчает некоторые операции, такие как оформление/стилизация ячеек в определенной таблице на листе, задание формата и т.д.

Содержание:


Создание объекта таблицы Table().

Создание объекта таблицы рабочего листа происходит посредствам создания экземпляра класса Table(). Имена таблиц должны быть уникальными в пределах всей рабочей книги.

Созданный объект таблицы должен быть добавлен ​​с использованием метода Worksheet.add_table(). Использование этого метода гарантирует, что имя таблицы будет уникальным для определенных имен и всех других имен таблиц, так как поднимает исключение ValueError: Table with name ... already exists в случае совпадения имени.

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

Смотрим пример:

from openpyxl import Workbook
from openpyxl.worksheet.table import Table, TableStyleInfo

wb = Workbook()
ws = wb.active

data = [
    ['Apples', 10000, 5000, 8000, 6000],
    ['Pears',   2000, 3000, 4000, 5000],
    ['Bananas', 6000, 6000, 6500, 6000],
    ['Oranges',  500,  300,  200,  700],
]

# добавим заголовки столбцов. Это должны быть строки
ws.append(["Fruit", "2011", "2012", "2013", "2014"])
for row in data:
    ws.append(row)

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

    # добавим стиль по умолчанию.
    style = TableStyleInfo(name="TableStyleMedium9", showFirstColumn=False,
                           showLastColumn=False, showRowStripes=True, showColumnStripes=True)
    table.tableStyleInfo = style
    # добавляем таблицу
    ws.add_table(table)

wb.save("table.xlsx")

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

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

Примечание. Управление стилями осуществляется с помощью объекта TableStyleInfo(). Этот объект позволяет чередовать строки или столбцы (аргументы: showFirstColumn, showLastColumn, showRowStripes, showColumnStripes) и применять различные цветовые схемы (аргумент name).

Приемы использования таблиц рабочего листа.

Свойство рабочего листа ws.tables - это объект похожий на словарь, который содержит все объекты таблиц Table() на конкретном рабочем листе:

>>> ws.tables
# {"Table1",  <openpyxl.worksheet.table.Table object>}

Получение объекта таблицы по имени или диапазону.

# получение объекта таблицы по имени
>>> ws.tables["Table1"]
# или диапазону
>>> ws.tables["A1:D10"]

Перебор всех объектов таблиц на листе.

>>> for table in ws.tables.values():
...     print(table)

Список кортежей с (имя, диапазон) всех таблиц на листе.

Метод объекта Table.items() возвращает список кортежей (name, range), где name - это имя, а range - диапазон таблицы текущего рабочего листа.

>>> ws.tables.items()
# [("Table1", "A1:D10")]

Удаление таблиц.

>>> del ws.tables["Table1"]

Количество таблиц на листе.

>>> len(ws.tables)
# 1

Добавление заголовков столбцов таблиц вручную.

В режиме только для записи можно добавлять таблицы только без заголовков:

>>> table.headerRowCount = False

В обычном режиме работы с XLSX можно инициализировать заголовки столбцов вручную:

# все значения заголовков таблицы должны быть строками
>>> headings = ["Fruit", "2011", "2012", "2013", "2014"]
>>> table._initialise_columns()
>>> for column, value in zip(table.tableColumns, headings):
...     column.name = value