Excel formula openpyxl:'@';保存到文件时插入到公式中
当我向单元格中添加以下公式时,单元格的值在打印到控制台时看起来很好。但是,在保存文件后,公式在“=”后面插入了“@”(为简单起见,我提供了控制台的输出): 在“formula.xlsx”文件中,公式如下所示: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 非常感谢 --------乌达特---
=@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