Обычно стили применяются ко всему в отдельной ячейке. Однако форматированный текст позволяет форматировать части текста в строке.
Объекты 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'