当我将以下公式添加到单元格时,打印到控制台时该单元格的值看起来不错。但是,保存文件后,公式在'='之后插入了'@'(为简单起见,我从控制台提供输出):
>>> from openpyxl import Workbook
>>> wb = Workbook()
>>> ws = wb.active
>>> ws['A1'] = '=CONCAT("Week ",TEXT(MID(' + get_column_letter(9) + '1,6,2)+ 1, "##"))'
>>> ws['A1'].value
'=CONCAT("Week ",TEXT(MID(I1,6,2)+ 1, "##"))'
>>> wb.save('formula.xlsx')
>>>
在“ formula.xlsx”文件中,公式如下所示:
=@CONCAT("Week ",TEXT(MID(I1,6,2)+ 1, "##"))
但是,如果不是指定'= CONCAT()',而是指定'= SUM()',则会按预期方式保存它,即未插入'@'。
我正在使用openpyxl 3.0.3和Python 3.8。
非常感谢
-------- Udate --------
我研究了'formula.xlsx'的XML代码;但是在执行此操作之前,我在Excel中将其打开,将单元格A1复制到单元格D1,然后从单元格D1中的公式中删除了“ @”,此后D1开始显示正确的值,而A1仍然显示“ #NAME?”。错误。
因此,在单元格D1中进行了更改之后,工作表的XML代码显示以下内容:
<row r="1" spans="1:9" x14ac:dyDescent="0.45">
<c r="A1" t="e"><f ca="1">_xludf.CONCAT("Week ",TEXT(MID(I1,6,2)+ 1, "##"))</f><v>#NAME?</v></c>
<c r="D1" t="str"><f>_xlfn.CONCAT("Week ",TEXT(MID(I1,6,2)+ 1, "##"))</f><v>Week 68</v></c>
<c r="I1"><v>12345678</v></c>
</row>
[openpyxl在上面的单元格A1中为CONCAT使用的_xludf前缀被描述为https://docs.microsoft.com/en-us/office/client-developer/excel/xludf上的“用户定义函数”。
这是否意味着该库无法将CONCAT识别为标准Excel函数,因此使用_xludf而不是_xlfn?
-----更新结束---
在python代码中显式指定_xlfn前缀可解决此问题:
>>> ws['A1'] = '=_xlfn.CONCAT("Week ",TEXT(MID(' + get_column_letter(9) + '1,6,2)+ 1, "##"))'
感谢Dror Av。供指导!
如openpyxl documentation中所指定,仅插入公式名称即可使用已知公式。
一个可以使用
>>> from openpyxl.utils import FORMULAE
>>> "CONCAT" in FORMULAE
False
检查公式是否在openpyxl中是已知的。如果不是公式,则需要在公式名称之前添加_xlfn.
,如下所示:
>>> ws['A1'] = '=_xlfn.CONCAT("Week ",TEXT(MID(' + get_column_letter(9) + '1,6,2)+ 1, "##"))
在文档中也有提及:
如果您尝试使用未知的公式,则可能是因为您使用的是最初未包含的公式规格。这样的公式必须以
_xlfn.
开头才能起作用。