当我将以下公式添加到单元格时,单元格的值在打印到控制台时看起来不错。但是,在我保存文件后,公式在“=”之后插入了“@”(为简单起见,我提供了控制台的输出):
>>> 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.
非常感谢
--------更新--------
我查看了“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://learn.microsoft.com/en-us/office/client-developer/excel/xludf.
上被描述为“用户定义函数”这是否意味着库没有将 CONCAT 识别为标准 Excel 函数,因此使用 _xludf 而不是 _xlfn?
----- 更新结束---
如 openpyxl 文档中所述 只需插入公式名称即可使用已知公式。
可以用
>>> 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.
我在使用西班牙语公式时遇到同样的问题(我来自阿根廷)。 当我尝试将“=SUMA(A1:A20)”之类的内容分配给单元格时,结果显示为“=@SUMA(A1:A20)”。
我尝试了_xlfn。解决方案,但现在它只是结束了 “=@_xlfn.SUMA(A1:A20)”
如果/当我找到答案时,我会把它贴在这里。
已解决 如果您使用的是非英文版本的 Excel,您仍然需要为单元格分配函数的英文名称,例如“=总和(A1:A20)” 之后,当您检查工作表中单元格的内容时,它会更改为正确的语言,在本例中为西班牙语“=SUMA(A1:A20)”
警告:我只检查了西班牙语版本,但我很确定它适用于所有人。
另外:如果您使用另一组字符作为分隔符,例如逗号 (,) 而不是小数点 (.),则在为单元格分配公式时仍需要使用点,例如 "= E8 * 0.5"。检查单元格时,您会看到一个逗号。在该字符串中使用逗号将导致打开 xlsx 文件时出现文件损坏错误。
在我的例子中,我试图输入
=ARRED
公式,字符 @
出现在 Excel 文件中,如 =@ARRED
.
ARRED
是巴西葡萄牙语前缀,无法识别,所以我用 ROUND 代替,效果很好。
测试:
from openpyxl.utils import FORMULAE
"ARRED" in FORMULAE
False
"ROUND" in FORMULAE
True
在 python 代码中明确指定 _xlfn 前缀修复了问题:
>>> ws['A1'] = '=_xlfn.CONCAT("Week ",TEXT(MID(' + get_column_letter(9) + '1,6,2)+ 1, "##"))'
感谢 Dror Av。求指导!