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

Фиксация строк/столбцов в качестве шапки при помощи openpyxl

Материал рассказывает о свойствах и методах модуля openpyxl, которые позволяют закрепить строки и столбцы в качестве неподвижной шапки электронной таблицы, а также настроить некоторые свойства печати, которые заставят программу Excel печатать эту шапку на каждой странице документа XLSX.

Содержание:


Закрепление строк/колонок в качестве шапки электронной таблицы.

Модуль openpyxl имеет возможность зафиксировать строки и колонки находящиеся выше и левее указанной ячейки, при помощи свойства листа электронной таблицы Worksheet.freeze_panes. Другими словами, это свойство фиксирует все что выше и левее указанной ячейки.

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

Свойство Worksheet.freeze_panes должно быть вызвано после вставки некоторых данных. Смотрим пример фиксации трех первых строк листа, в качестве шапки, а также фиксации левого столбца от прокрутки по горизонтали:

from openpyxl import Workbook
from openpyxl.styles import Font

wb = Workbook()
ws = wb.active

# заголовки для наглядности 
ws['B1'] = 'Текст 1'
ws['B2'] = 'Текст 2'

# Сгенерируем массив случайных данных для 
# заполнения листа электронной таблицы
# для этого используем вложенный генератор списка
excel_data = [[row*col for col in range(1, 31)] for row in range(1, 101)]

# добавляем данные в конец листа
for row in excel_data:
    ws.append(row)

#!!! СОЗДАЕМ ШАПКУ
# фиксируем все, что левее и выше ячейки "B4"
ws.freeze_panes = "B4"

# Для наглядности задаем и применяем стиль для `шапок`
ws.row_dimensions[3].font = Font(bold=True, name='Arial', size=10)
ws.column_dimensions['A'].font = Font(bold=True, name='Arial', size=10)

# сохраняем и смотрим результат
wb.save('freeze_panes.xlsx')

Дополнительно смотрите:

Печать шапки электронной таблицы на каждом листе.

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

Для печати "шапки таблицы" на каждом листе документа, необходимо указать диапазон строк, которые занимает шапка в свойстве листа Worksheet.print_title_rows. Например, выражение ws.print_title_rows = '2:3' заставить Excel печатать вверху каждого листа диапазон строк с 2 по 3 (т.е. 2-ю и 3-ю строки).

Для печати зафиксированных слева столбцов на каждом листе документа (! если электронная таблица выходит за пределы печати справа), необходимо в свойстве листа Worksheet.print_title_cols указать диапазон столбцов. Например, выражение ws.print_title_cols = 'A:B' заставить Excel печатать слева каждого листа диапазон колонок с A по B.

Примечание. Программа "LibreOffice Calc" не поддерживает эти свойства.

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

from openpyxl import Workbook
from openpyxl.styles import Font

wb = Workbook()
ws = wb.active

# заголовки для наглядности 
ws['B1'] = 'Текст 1'
ws['B2'] = 'Текст 2'

# добавляем данные в конец листа
excel_data = [[row*col for col in range(1, 20)] for row in range(1, 101)]
for row in excel_data:
    ws.append(row)

ws.freeze_panes = "B4"
ws.row_dimensions[3].font = Font(bold=True, name='Arial', size=10)
ws.column_dimensions['A'].font = Font(bold=True, name='Arial', size=10)

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

# сохраняем и смотрим результат
wb.save('print.xlsx')

Теперь необходимо открыть сохраненный файл в Excel и включить предварительный просмотр печати или преобразовать электронную таблицу в PDF формат.