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

Параметры печати и просмотра документа в Excel

Модуль openpyxl обеспечивает достаточно полную поддержку настроек печати и просмотра документа XLSX.

Содержание:


В основном все параметры листа электронной таблицы устанавливаются с помощью атрибутов объекта Worksheet.page_setup, который представляет собой прокси для нескольких классов, расположенных в подмодуле openpyxl.worksheet.page.

Настройка размера и ориентации страницы.

Модуль openpyxl поддерживает несколько стандартных форматов листов. Они представлены в качестве констант объекта Worksheet:

  • 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'.

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

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

>>> from openpyxl.workbook import Workbook
>>> wb = Workbook()
>>> ws = wb.active
# создадим произвольные данные, используя
# вложенный генератор списков
>>> data = [[row*col for col in range(1, 16)] for row in range(1, 31)]
# добавляем данные на активный лист
>>> for row in data:
...     ws.append(row)
...
# задаем ориентацию страницы
>>> ws.page_setup.orientation = ws.ORIENTATION_LANDSCAPE
# эквивалентно
>>> ws.page_setup.orientation = 'landscape'
# теперь зададим размер листа
>>> ws.page_setup.paperSize = ws.PAPERSIZE_A5
# что эквивалентно
>>> ws.page_setup.paperSize = '11'
# сохраняем и смотрим
>>> wb.save('test.xlsx')

Открываем сохраненный файл электронной таблицы и смотрим "Предварительный просмотр печати" (Ctrl+Shift+O)

Также модуль openpyxl поддерживает установку произвольных размеров листа электронной таблицы. Произвольные размеры можно установить, используя атрибуты .paperHeight и .paperWidth прокси объекта ws.page_setup.

В открытом интерпретаторе Python допишем код ниже и снова сохраним:

# формат `А4`, ориентированный как `landscape`
>>> ws.page_setup.paperHeight = '297mm'
>>> ws.page_setup.paperWidth = '210mm'
# сохраняем и смотрим
>>> wb.save('test.xlsx')

Настройка размера границ/полей при печати.

Размеры границ/полей при печати устанавливаются при помощи свойства Worksheet.page_margins. Это должно принимать класс PageMargins() c пользовательскими значениями границ/полей. Конструктор класса, по умолчанию, принимает все значения в дюймах.

  • openpyxl.worksheet.page.PageMargins(left=0.75, right=0.75, top=1, bottom=1, header=0.5, footer=0.5)

Примечание: 1 дюйм = 2.54 см. Следовательно, что бы установить поля по 1 см, необходимо 1/2.54

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

>>> from openpyxl.workbook import Workbook
>>> wb = Workbook()
>>> ws = wb.active
# создадим произвольные данные, используя
# вложенный генератор списков
>>> data = [[row*col for col in range(1, 16)] for row in range(1, 31)]
# добавляем данные на активный лист
>>> for row in data:
...     ws.append(row)
...
# импортируем класс `PageMargins`
>>> from openpyxl.worksheet.page import PageMargins
# задаем собственные значения отступов
>>> cm = 1/2.54
>>> ws.page_margins = PageMargins(left=cm, right=cm, top=cm, bottom=cm)
# сохраняем и смотрим
>>> wb.save('test.xlsx')

Открываем сохраненный файл электронной таблицы и смотрим "Предварительный просмотр печати" (Ctrl+Shift+O)

Печатать данных по центру страницы.

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

Пример центрирования данных при печати:

>>> from openpyxl.workbook import Workbook
>>> wb = Workbook()
>>> ws = wb.active
# создадим произвольные данные, используя
# вложенный генератор списков
>>> data = [[row*col for col in range(1, 6)] for row in range(1, 16)]
# добавляем данные на активный лист
>>> for row in data:
...     ws.append(row)
...
# центрирование данных по горизонтали 
>>> ws.print_options.horizontalCentered = True
# сохраняем и смотрим
>>> wb.save('test.xlsx')
# закрываем Excel
# теперь центрируем данные по вертикали
>>> ws.print_options.verticalCentered = True
# и снова сохраняем и смотрим
>>> wb.save('test.xlsx')

Открываем сохраненный файл электронной таблицы и смотрим "Предварительный просмотр печати" (Ctrl+Shift+O)

Изменение области печати.

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

Пример:

>>> from openpyxl import Workbook
>>> wb = Workbook()
>>> ws = wb.active
# создадим произвольные данные
>>> data = [[row*col for col in range(1, 16)] for row in range(1, 31)]
# добавляем данные на активный лист
>>> for row in data:
...     ws.append(row)
...
# зададим области печати
>>> ws.print_area = 'A1:F10'
# сохраняем и смотрим
>>> wb.save('test.xlsx')

Открываем сохраненный файл электронной таблицы и смотрим "Предварительный просмотр печати" (Ctrl+Shift+O)

Настройка верхнего и нижнего колонтитула.

Верхние и нижние колонтитулы используют свой собственный язык форматирования. Эта разметка, модулем openpyxl поддерживается полностью при написании, но, из-за сложности и возможности вложения одного значения в другое, при чтении фала XLSX разметка может быть искажена. Так же, при чтении, может появится предупреждение, что есть заголовок или нижний колонтитул в файле Excel, который не может быть проанализирован openPyxl.

Если не хотите получать предупреждения, то можно просто удалить верхний и нижний колонтитулы из файла Excel (File -> Info -> Check for Issues -> Inspect Document -> Remove - удалит верхний и нижний колонтитулы).

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

Пример:

>>> from openpyxl import Workbook
>>> wb = Workbook()
>>> ws = wb.active
# создадим произвольные данные
>>> data = [[row*col for col in range(1, 11)] for row in range(1, 21)]
# добавляем данные на активный лист
>>> for row in data:
...     ws.append(row)
...
# форматирование колонтитула
>>> ws.oddHeader.left.text = "Страница &[Page] из &N"
>>> ws.oddHeader.left.size = 14
>>> ws.oddHeader.left.font = "Arial,Bold"
>>> ws.oddHeader.left.color = "CC3366"
>>> ws.differentFirst = False
>>> ws.differentOddEven = True
# Добавим место для подписи в правом нижнем углу страницы
from openpyxl.styles import Font, Alignment
ws.cell(row=ws.max_row+4, column=ws.max_column-1).value = 'Создатель документа: '
ws.cell(row=ws.max_row, column=ws.max_column-1).alignment = Alignment(horizontal='right')
ws.cell(row=ws.max_row, column=ws.max_column-1).font = Font(size=14)
# сохраняем и смотрим
>>> wb.save('test.xlsx')

Открываем сохраненный файл электронной таблицы и смотрим "Предварительный просмотр печати" (Ctrl+Shift+O)

Лист электронной таблицы поддерживает следующие колонтитулы:

  • Worksheet.evenFooter,
  • Worksheet.evenHeader,
  • Worksheet.firstFooter,
  • Worksheet.firstHeader,
  • Worksheet.oddFooter,
  • Worksheet.oddHeader.

Каждый из которых поддерживает выравнивание:

  • .center,
  • .left,
  • .right.

Так же можно установить поведение колонтитулов:

  • Worksheet.alignWithMargins - принимаемой значение bool,
  • Worksheet.differentFirst - принимаемой значение bool,
  • Worksheet.differentOddEven - принимаемой значение bool.

Настройка масштаба листа при открытии документа в Excel.

Настройка масштабирования листа электронной таблицы настраиваются через свойство прокси объекта Worksheet.page_setup следующими атрибутами:

  • Worksheet.page_setup.fitToPage: bool, уместить содержимое в окно просмотра целиком. Так же служит переключателем для двух следующих настроек.
  • Worksheet.page_setup.fitToHeight: bool, вписать содержимое в окно просмотра по высоте. Может принимать целое число, которое указывает, сколько экранов должна занимать высота содержимого листа.
  • Worksheet.page_setup.fitToWidth: bool, вписать содержимое в окно просмотра по ширине. Может принимать целое число, которое указывает, сколько экранов должна занимать ширина содержимого листа (горизонтальная прокрутка).
  • Worksheet.page_setup.scale: int, жестко задать масштаб в процентах, может принимать значение в пределах от 20 до 400. Установка этого атрибута приведет к отмене описанных выше настроек.

Примечание: ключевой момент, заключается в том, что необходимо сначала установить значение .fitToPage = True перед тем как устанавливать атрибуты .fitToWidth и .fitToHeight.

Примечание: вышеуказанные настройки не работают в программе "LibreOffice Calc".

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

>>> from openpyxl import Workbook
>>> wb = Workbook()
>>> ws = wb.active
# создадим произвольные данные
>>> data = [[row*col for col in range(1, 11)] for row in range(1, 21)]
# добавляем данные на активный лист
>>> for row in data:
...     ws.append(row)
...
# содержимое по ширине страницы
>>> ws.page_setup.fitToPage = True
>>> ws.page_setup.fitToWidth = True
# сохраняем и смотрим
>>> wb.save('test.xlsx')
# теперь жестко зададим масштаб 
# листа при открытии документа
>>> ws.page_setup.scale = 120
# сохраняем и смотрим
>>> wb.save('test.xlsx')

Настройка фильтров и сортировок в документе XLSX.

Модуль openpyxl поддерживает добавление фильтров и сортировок на рабочий лист документа XLSX.

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

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

Чтобы добавить фильтр, необходимо определить диапазон, а затем добавить столбцы и условия сортировки:

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

data = [
    ["Fruit", "Quantity"],
    ["Kiwi", 3],
    ["Grape", 15],
    ["Apple", 3],
    ["Peach", 3],
    ["Pomegranate", 3],
    ["Pear", 3],
    ["Tangerine", 3],
    ["Blueberry", 3],
    ["Mango", 3],
    ["Watermelon", 3],
    ["Blackberry", 3],
    ["Orange", 3],
    ["Raspberry", 3],
    ["Banana", 3]
]

for r in data:
    ws.append(r)

ws.auto_filter.ref = "A1:B15"
ws.auto_filter.add_filter_column(0, ["Kiwi", "Apple", "Mango"])
ws.auto_filter.add_sort_condition("B2:B15")

wb.save("filtered.xlsx")

Код выше добавит соответствующие инструкции в документ XLSX (при просмотре в Excel появятся соответствующие управляющие элементы), но фактически не будет ни фильтровать, ни сортировать.