富文本#
通常,样式应用于单个单元格中的所有内容。但是,富文本允许格式化字符串中的部分文本。
富文本对象可以包含非格式化文本和 TextBlock
对象的混合,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', # Font name
sz=22, # in 1/144 in. (1/2 point) units, must be integer
charset=None, # character set (0 to 255), less required with UTF-8
family=None, # Font family
b=True, # Bold (True/False)
i=None, # Italics (True/False)
strike=None, # strikethrough
outline=None,
shadow=None,
condense=None,
extend=None,
color=None,
u=None,
vertAlign=None,
scheme=None)
幸运的是,如果你已经有 Font
对象,你可以简单地用现有的 Font
对象初始化 InlineFont
对象:
from openpyxl.cell.text import Font
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'))
例如:
red = InlineFont(color='FF000000')
rich_string1 = CellRichText(['When the color ', TextBlock(red, 'red'), ' is used, you can expect ', TextBlock(red, 'danger')])
CellRichText
对象是从 list
中派生出来的,并且可以这样使用。
空白符#
CellRichText
对象在将元素呈现为字符串或保存文件时,不会在元素之间添加空格。
t = CellRichText()
t.append('xx')
t.append(TextBlock(red, "red"))
还可以将其强制转换为 str
以只获得文本,而不进行格式化。
str(t)
'xxred'
编辑富文本#
由于编辑带有格式的大块文本可能很棘手,as_list()
方法返回字符串列表以简化索引。
l = rich_string1.as_list()
l
['When the color ', 'red', ' is used, you can expect ', 'danger']
l.index("danger")
3
rich_string1[3].text = "fun"
str(rich_string1)
'When the color red is used, you can expect fun'
富文本单元格#
富文本对象可以直接分配给单元格:
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws['A1'] = rich_string1
ws['A2'] = 'Simple string'