公式以一个等号开始,可以配置单元格,让它包含通过其他单元格计算得到的 值。在本节中,你将利用 openpyxl 模块,用编程的方式在单元格中添加公式,就像 添加普通的值一样。例如:
>>> sheet['B9'] = '=SUM(B1:B8)'
这将=SUM(B1:B8)作为单元格 B9 的值。这将 B9 单元格设置为一个公式,计算 单元格 B1 到 B8 的和。图 12-5 展示了它的效果。
为单元格设置公式就像设置其他文本值一样。在交互式环境中输入以下代码:
>>> import openpyxl
>>> wb = openpyxl.Workbook()
>>> sheet = wb.active
>>> sheet['A1'] = 200
>>> sheet['A2'] = 300
>>> sheet['A3'] = '=SUM(A1:A2)'
>>> wb.save('writeFormula.xlsx')
单元格 A1 和 A2 分别设置为 200 和 300。单元格 A3 设置为一个公式,求出 A1 和A2 的和。如果在 Excel 中打开这个电子表格,A3 的值将显示为 500。 也可以读取单元格中的公式,就像其他值一样。但是,如果你希望看到该公式 的计算结果,而不是原来的公式,就必须将 load_workbook()的 data_only 关键字参 数设置为 True。这意味着 Workbook 对象要么显示公式,要么显示公式的结果,不 能兼得(但是针对一个电子表格文件,可以加载多个 Workbook 对象)。在交互式环 境中输入以下代码,看看有无 data_only关键字参数时,加载工作簿的区别:
>>> import openpyxl
>>> wbFormulas = openpyxl.load_workbook('writeFormula.xlsx')
>>> sheet = wbFormulas.active
>>> sheet['A3'].value
'=SUM(A1:A2)'
>>> wbDataOnly = openpyxl.load_workbook('writeFormula.xlsx', data_only=True)
>>> sheet = wbDataOnly.active
>>> sheet['A3'].value
500
这里,如果调用 load_workbook()时带有 data_only=True,A3 单元格就显示为 500,即公式的结果,而不是公式的文本。 Excel 公式为电子表格提供了一定程度的编程能力,但对于复杂的任务,很快 就会失去控制。例如,即使你非常熟悉 Excel 的公式,要想弄清楚=IFERROR (TRIM(IF(LEN(VLOOKUP(F7,Sheet2!$A$1:$B$10000,2,FALSE))>0,SUBSTITUTE (VLOOKUP (F7, Sheet2!$A$1:$B$10000, 2, FALSE), " ", ""),"")), "")实际上做了什么, 也是一件非常头痛的事。Python 代码的可读性要好得多。