Excel formula openpyxl:'@';保存到文件时插入到公式中

Excel formula openpyxl:'@';保存到文件时插入到公式中,excel-formula,openpyxl,Excel Formula,Openpyxl,当我向单元格中添加以下公式时,单元格的值在打印到控制台时看起来很好。但是,在保存文件后,公式在“=”后面插入了“@”(为简单起见,我提供了控制台的输出): 在“formula.xlsx”文件中,公式如下所示: =@CONCAT("Week ",TEXT(MID(I1,6,2)+ 1, "##")) 但是,如果我指定“=SUM()”而不是“=CONCAT()”,例如,它会按预期保存,即不插入“@” 我正在使用OpenPYXL3.0.3和Python 3.8 非常感谢 --------乌达特---

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

在“formula.xlsx”文件中,公式如下所示:

=@CONCAT("Week ",TEXT(MID(I1,6,2)+ 1, "##"))
但是,如果我指定“=SUM()”而不是“=CONCAT()”,例如,它会按预期保存,即不插入“@”

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

_xludf.CONCAT(“周”,文本(中间(I1,6,2)+1,“##”)#名称?
_xlfn.CONCAT(“周”,文本(中间(I1,6,2)+1,“周”)第68周
12345678
openpyxl为上述单元格A1中的CONCAT使用的xludf前缀在上被描述为“用户定义函数”

这是否意味着库没有将CONCAT识别为标准的Excel函数,因此使用了xludf而不是xlfn


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

在python代码中显式指定_xlfn前缀修复了以下问题:

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

感谢Dror Av。为了指导

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

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

感谢Dror Av。为了指导

正如openpyxl中指定的,只需插入公式名即可使用已知公式

可以使用

>>> from openpyxl.utils import FORMULAE
>>> "CONCAT" in FORMULAE
False
检查公式是否为openpyxl中的已知公式。如果公式不正确,则需要在公式名称前添加
\u xlfn.
,如下所示:

>>> ws['A1'] = '=_xlfn.CONCAT("Week ",TEXT(MID(' + get_column_letter(9) + '1,6,2)+ 1, "##"))
文件中也提到了这一点:

如果你试图使用一个未知的公式,这可能是 因为您使用的公式没有包含在初始值中 规范。这些公式必须以
\u xlfn.
为前缀才能起作用


正如openpyxl中指定的那样,只需插入公式名即可使用已知公式

可以使用

>>> from openpyxl.utils import FORMULAE
>>> "CONCAT" in FORMULAE
False
检查公式是否为openpyxl中的已知公式。如果公式不正确,则需要在公式名称前添加
\u xlfn.
,如下所示:

>>> ws['A1'] = '=_xlfn.CONCAT("Week ",TEXT(MID(' + get_column_letter(9) + '1,6,2)+ 1, "##"))
文件中也提到了这一点:

如果你试图使用一个未知的公式,这可能是 因为您使用的公式没有包含在初始值中 规范。这些公式必须以
\u xlfn.
为前缀才能起作用


我在使用西班牙语公式时也有同样的问题(我来自阿根廷)。 当我尝试将类似“=SUMA(A1:A20)”的内容分配给单元格时,结果是“=@SUMA(A1:A20)”

我试过了。解决方案,但现在它只是作为 “=@xlfn.SUMA(A1:A20)”

如果我找到答案,我会把它贴在这里

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

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


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

我在使用西班牙语公式时遇到同样的问题(我来自阿根廷)。 当我尝试将类似“=SUMA(A1:A20)”的内容分配给单元格时,结果是“=@SUMA(A1:A20)”

我试过了。解决方案,但现在它只是作为 “=@xlfn.SUMA(A1:A20)”

如果我找到答案,我会把它贴在这里

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

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


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

Hi Bob,我试图重新创建您的代码并解决此问题,但对我来说似乎效果不错。这是全部相关代码吗?是的,绝对是。上面的代码是我在控制台中测试的屏幕截图。你使用的是Windows/Linux还是Mac(在我的例子中是Mac)?也许这就不同了?让我看看是否可以在Windows中尝试一下……我使用的是win机器,openpyxl和Python3.8的版本为3.0.3(带有PyCharm),我在MS Windows中打开了完全相同的“formula.xlsx”文件,但“@”符号没有显示(在Excel for Mac中显示)。但是,在单元格中,它仍然显示“#NAME?”错误。只要我删除“=”并再次键入,或者如果我在“=”和“CONCAT”之间键入一个空格并将其删除,错误就会消失,并在单元格中计算出一个正确的值(当然,您需要在“I1”中显示一个正确的值,否则您将立即出现“#value!”错误)。因此,在wb.save()完成过程中,在“=”和“CONCAT”之间插入了一些代码。try
ws['A1']=”=xlfn.CONCAT(“周”,文本(中间(“+get_列字母(9)+'1,6,2)+1,“##”)
Hi