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

问题描述 投票:0回答:2

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

>>> 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?

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

excel-formula openpyxl
2个回答
0
投票

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

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

感谢Dror Av。供指导!


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.开头才能起作用。

© www.soinside.com 2019 - 2024. All rights reserved.