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

Работа с форматированным текстом, модуль openpyxl в Python

Позволяет форматировать части текста в строке XLSX

Содержание:


Объекты Rich Text

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

Объекты Rich Text могут содержать смесь неформатированного текста и объектов TextBlock, содержащих стиль InlineFont и текст, который должен быть отформатирован соответствующим образом. Результатом является объект CellRichText.

>>> from openpyxl.cell.text import InlineFont
>>> from openpyxl.cell.rich_text import TextBlock, CellRichText
>>> rich_string1 = CellRichText(
...    'This is a test ',
...    TextBlock(InlineFont(b=True), 'xxx'),
...   'yyy'
... )

Объекты InlineFont практически идентичны объектам Font, но используют другое имя атрибута rFont для имени шрифта. К сожалению, этого требует OOXML, и этого нельзя избежать.

>>> inline_font = InlineFont(rFont='Calibri', # Название шрифта
                             # в единицах измерения 1/144 дюйма (1/2 пункта), должно быть целым числом
...                          sz=22,
                             # набор символов (от 0 до 255), меньше требуется для UTF-8
...                          charset=None,
                             # Семейство шрифтов
...                          family=None,
                             # Жирный шрифт (True/False)
...                          b=True,
                             # Курсив (True/False)
...                          i=None,
                             # зачеркивание
...                          strike=None,
...                          outline=None,
...                          shadow=None,
...                          condense=None,
...                          extend=None,
...                          color=None,
...                          u=None,
...                          vertAlign=None,
...                          scheme=None,
...                          )

К счастью, если в коде уже используется объект Font, то можно просто инициализировать объект InlineFont существующим объектом Font:

>>> from openpyxl.cell.text import Font, InlineFont
>>> font = Font(name='Calibri',
...             size=11,
...             bold=False,
...             italic=False,
...             vertAlign=None,
...             underline='none',
...             strike=False,
...             color='00FF0000')
>>> inline_font = InlineFont(font)

Можно создавать объекты InlineFont самостоятельно и использовать их позже. Это делает работу с форматированным текстом чище и проще:

>>> big = InlineFont(sz="30.0")
>>> medium = InlineFont(sz="20.0")
>>> small = InlineFont(sz="10.0")
>>> bold = InlineFont(b=True)
>>> b = TextBlock
>>> rich_string2 = CellRichText(
...       b(big, 'M'),
...       b(medium, 'i'),
...       b(small, 'x'),
...       b(medium, 'e'),
...       b(big, 'd')
... )

Пример:

>>> from openpyxl.cell.text import InlineFont
>>> from openpyxl.cell.rich_text import TextBlock, CellRichText
>>> red = InlineFont(color='FF000000')
>>> rich_string1 = CellRichText(['Когда используется ', TextBlock(red, 'красный'), ' цвет, то жди ', TextBlock(red, 'опасность')])

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

Пробелы и форматированный текст

Объекты CellRichText не добавляют пробелы между элементами при их отображении в виде строк или сохранении файлов.

>>> t = CellRichText()
>>> t.append('xx')
>>> t.append(TextBlock(red, "red"))

Можно преобразовать объект CellRichText в строку, для получения только текста, без форматирования.

>>> str(t)
# 'xxred'

Редактирование форматированного текста

Так как редактирование больших блоков текста с форматированием может оказаться затруднительным, метод CellRichText.as_list() возвращает список строк, для упрощения индексации.

>>> l = rich_string1.as_list()
>>> l
# ['Когда используется ', 'красный', ' цвет, то жди ', 'опасность']
>>> l.index("danger")
# 3
>>> rich_string1[3].text = "веселья"
>>> str(rich_string1)
'Когда используется красный цвет, то жди веселья''

Присвоение ячейке форматированного текста

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

>>> from openpyxl import Workbook
>>> wb = Workbook()
>>> ws = wb.active
>>> ws['A1'] = rich_string1
>>> ws['A2'] = 'Simple string'