openpyxl:保存到文件时在公式中插入“ @”

时间:2020-05-09 23:24:00

标签: excel-formula openpyxl

当我在单元格中添加以下公式时,该单元格的值在打印到控制台时看起来不错。但是,保存文件后,公式在'='之后插入了'@'(为简单起见,我从控制台提供了输出):

>>> 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, "##"))

但是,例如,如果我指定的是“ = SUM()”而不是“ = CONCAT()”,那么它将按预期方式保存,即未插入“ @”。

我正在使用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>

https://docs.microsoft.com/en-us/office/client-developer/excel/xludf上,openpyxl在CONCAT中使用的_xludf前缀被描述为“用户定义函数”。

这是否意味着该库未将CONCAT识别为标准Excel函数,因此使用_xludf而不是_xlfn?

-----更新结束---

3 个答案:

答案 0 :(得分:0)

在python代码中明确指定_xlfn前缀可解决此问题:

>>> ws['A1'] = '=_xlfn.CONCAT("Week ",TEXT(MID(' + get_column_letter(9) + '1,6,2)+ 1, "##"))'

感谢Dror Av。寻求指导!

答案 1 :(得分:0)

如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.为前缀才能使用。

答案 2 :(得分:0)

我在使用西班牙语公式时遇到了同样的问题(我来自阿根廷)。 当我尝试将诸如“=SUMA(A1:A20)”之类的内容分配给一个单元格时,它显示为“=@SUMA(A1:A20)”。

我尝试了 _xlfn。解决方案,但现在它只是结束 "=@_xlfn.SUMA(A1:A20)"

如果/当我找到答案时,我会在这里发布。

已解决 如果您使用的是非英文版本的 Excel,您仍然需要为单元格分配函数的英文名称,例如“=总和(A1:A20)” 之后,当您检查工作表中单元格的内容时,它将更改为正确的语言,在本例中为西班牙语“=SUMA(A1:A20)”

警告:我只检查了西班牙语版本,但我很确定它适用于所有人。

另外:如果您使用另一组字符作为分隔符,例如逗号 (,) 而不是小数点 (.),您在为单元格分配公式时仍然需要使用点,例如“ = E8 * 0.5"。检查单元格时,您会看到一个逗号。在该字符串中使用逗号将导致打开 xlsx 文件时出现文件损坏错误。