【发布时间】:2023-01-27 22:42:20
【问题描述】:
当我将以下公式添加到单元格时,单元格的值在打印到控制台时看起来不错。但是,在我保存文件后,公式在“=”之后插入了“@”(为简单起见,我提供控制台的输出):
>>> 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?
-----更新结束---
【问题讨论】:
-
嗨,鲍勃,我试图重新创建您的代码和问题,但它对我来说似乎工作正常。那是整个相关代码吗?
-
是的,一点没错。上面的代码是我在控制台测试的截图。您使用的是 Windows/Linux 还是 Mac(在我的例子中是 Mac)?也许这会有所作为?让我看看我是否可以在 Windows 中尝试这个...
-
我正在使用 win 机器,openpyxl 版本 3.0.3 和 Python 3.8(使用 PyCharm)
-
试试
ws['A1'] = '=_xlfn.CONCAT("Week ",TEXT(MID(' + get_column_letter(9) + '1,6,2)+ 1, "##"))' -
我还添加了一个更详细的答案,其中包含指向文档的链接,以供将来参考,并在其他人偶然发现该问题时提供帮助。