目录



>>> from helper import info; info()
页面更新时间: 2020-03-21 22:37:49
操作系统/OS: Linux-4.19.0-8-amd64-x86_64-with-debian-10.3 ;Python: 3.7.3

其他的一些问题

设置单元格的字体风格

设置某些单元格行或列的字体风格,可以帮助你强调 电子表格中重点的区域。例如,在这个产品电子表格中, 程序可以对 potatogarlicparsnip 等行使用粗体。或者也许你希望对每磅价格超过5美元的 行使用斜体。手工为大型电子表格的某些部分设置字体 风格非常令人厌烦,但程序可以马上完成。

为了定义单元格的字体风格,需要从 openpyxl.styles 模块导入 Font() 函数。

>>> from openpyxl.styles import Font

这让你能输入 Font() ,代替 openpyxl.styles.Font() (参见2.8节“导入模块”,复习这种方式的 import 语句)。

这里有一个例子,它创建了一个新的工作簿,将A1单元格设置为 24点、斜体。在交互式环境中输入以下代码:

>>> import os, openpyxl
>>> wb = openpyxl.Workbook()
>>> sheet = wb['Sheet']
>>> italic24Font = Font(size = 24, italic = True)
>>> sheet['A1'].font = italic24Font
>>> sheet['A1'] = 'Hello world!'
>>> wb.save('/tmp/styled-1.xlsx')

OpenPyXL 模块用 Style 对象来表示单元格字体 风格设置的集合,字体风格保存在 Cell 对象的 style 属性中。将 Style 对象赋给 style 属性,可以设置单元格的字体风格。

在这个例子中, Font(size=24,italic=True)返回一个 Font 对象,保存在 italic24Font 中。 Font() 的关键字参数 sizeitalic, 配置了 Font 对象的 style 属性。这个 Font 对象被传递给 Style(font=italic24Font) 调用, 该函数的返回值保存在 styleObj 中。如果 styleObj 被赋给单元格的 style 属性, 所有字体风格的信息将应用于单元格A1。

Font 对象

Font 对象的 style 属性影响文本在单元格中的 显示方式。要设置字体风格属性,就向 Font() 函数 传入关键字参数。表12-2展示了 Font()函数可能的 关键字参数。

Font style属性的关键字参数

关键字参数

数据类型

描述

name

字符串

字体名称,诸如’Calibrf 或’Times New Roman’

size

整型

大小点数

bold

布尔型

True表示粗体

italic

布尔型

True表示斜体

可以调用 Font() 来创建一个 Font 对象, 并将这个 Font 对象保存在一个变量中。然后将它传递 给 Style() ,得到的 Style 对象保存在一个变量中, 并将该变量赋给 Cell 对象的 style 属性。例如, 下面的代码创建了各种字体风格:

>>> wb = openpyxl.Workbook()
>>> sheet = wb.get_sheet_by_name('Sheet')
>>>
>>> fontObj1 = Font(name='Times New Roman', bold=True)
>>> sheet['A1'].font = fontObj1
>>> sheet['A1'] = 'Bold Times New Roman'
>>>
>>> fontObj2 = Font(size=24, italic=True)
>>> sheet['B3'].font = fontObj2
>>> sheet['B3'] = '24 pt Italic'
>>>
>>> wb.save('/tmp/styles-2.xlsx')

这里,我们将一个 Font 对象保存在 fontObj1 中, 并用它创建一个 Style 对象,该对象保存在 styleObj1 中,然后将A1的 Cell对象的 style 属性设置为 styleObj 。我们针对另一个 Font 对象和 Style 对象重复这个过程, 设置第二个单元格的字体风格。运行这段代码后,电子表格中 A1B3 单元格的字体风格将设置为自定义的字体风格。

对于单兀格 A1,我们将字体名称设置为 'Times New Roman' , 并将 bold 设置为 true ,这样我们的文本将以粗体Times New Roman 的方式显示。 我们没有指定大小,所以使用 openpyx 的默认值11。 在单元格 B3中,我们的文本是斜体,大小是24。

我们没有指定字体的名称,所以使用 openpyxl 的默认值 Calibri

公式

公式以一个等号开始,可以配置单元格, 让它包含通过其他单元格计算得到的 值。在本节中,你将利用 openpyxl 模块, 用编程的方式在单元格中添加公式,就像 添加普通的值一样。例如:

sheet['B9']= '=SUM(B1:B8)'

这将 =SUM(B1:B8) 作为单元格B9的值。这将B9单元格设置 为一个公式,计算单元格B1到B8的和。图12-5展示了它的效果。

图12-5单元格B9包含了一个公式,计算单元格B1到B8的和

为单元格设置公式就像设置其他文本值一样。 在交互式环境中输入以下代码:

>>> import openpyxl
>>> wb = openpyxl.Workbook()
>>> sheet = wb.get_active_sheet()
>>> sheet['A1'] = 200
>>> sheet['A2'] = 300
>>> sheet['A3'] = '=SUM(A1:A2)'
>>> wb.save('/tmp/writeFormula.xlsx')

单元格 A1A2 分别设置为 200300 。 单元格 A3 设置为一个公式,求出 A1A2 的和。 如果在Excel中打开这个电子表格, A3 的值将显示为500

也可以读取单元格中的公式,就像其他值一样。但是, 如果你希望看到该公式的计算结果,而不是原来的公式, 就必须将 load_workbook()data_only 关键字参 数设置为 True 。这意味着 Workbook 对象要么 显示公式,要么显示公式的结果,不能兼得(但是针对 一个电子表格文件,可以加载多个 Workbook 对象)。 在交互式环境中输入以下代码,看看有无 data_only 关键字参数时,加载工作簿的区别:

>>> import openpyxl
>>> wbFormulas = openpyxl.load_workbook('/tmp/writeFormula.xlsx')
>>> sheet = wbFormulas.get_active_sheet()
>>> sheet['A3'].value
'=SUM(A1:A2)'
>>> wbDataOnly = openpyxl.load_workbook('/tmp/writeFormula.xlsx',data_only=True)
>>> sheet = wbDataOnly.active
>>> sheet['A3'].value

这里,如果调用 load_workbook() 时带有 data_only=TrueA3 单元格就显示为 500 ,即公式的结果,而不是公式的文本。

Excel公式为电子表格提供了一定程度的编程能力, 但对于复杂的任务,很快就会失去控制。 例如,即使你非常熟悉Excel的公式,要想弄清楚

=IFERROR(TRIM(IF(LEN(VLOOKUP(F7,Sheet2!$A$1:$B$10000,2,FALSE))>0,SUBSTITUTE(VLOOKUP(F7,Sheet2!$A$l:$B$10000,2,FALSE)," ",""),"")),"")

实际上做了什么也是一件非常头痛的事。 Python代码的可读性要好得多。