【发布时间】:2021-02-02 10:56:08
【问题描述】:
我的目标是使用 Openpyxl 将此公式输入 Excel。
=CORREL(IF(A2:A7;A2:A7);B2:B7)
IF公式的原因是忽略了内部为0的单元格,CORREL函数默认不会忽略。
当将此公式插入到 excel 中时,输出实际上是:
=CORREL(IF(@A2:A7;A2:A7);B2:B7)
如果在与给定范围(此处为第 2-7 行)位于同一行的单元格中输入公式,该公式仍然有效。但是给#VALUE!当放在另一排时。手动删除“@”可以解决问题,但不可行,因为我想用它来自动分析。
我发现在某些情况下,Excel 为数组添加了“@”,并从pre-2010 versions of Excel 替换为“[#This Row]”,这解释了为什么在同一行上输入公式时有效。 当公式is not recognized. 时,openpyxl 也会将“@”符号添加到公式中 但是,这两个链接都没有解释为什么在我的示例中添加了“@”。
这是在 IF 函数中使用范围的副作用吗?这是将范围解析为 IF 函数的错误(/功能)吗?
这是我用来复制错误的代码。我的 Openpyxl 版本是 3.0.5,我使用 Microsoft 365 的 Excel。
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
rows = [
['Size', 'Batch 1', 'Batch 2'],
[2, 40, 30],
[0, 40, 25],
[0, 50, 30],
[5, 30, 25],
[6, 25, 35],
[7, 20, 40],
]
for row in rows:
ws.append(row)
formula = '=CORREL(IF(A2:A7,A2:A7),B2:B7)'
ws.cell(row=5, column=5, value=formula) # Formula in row 5 works
ws.cell(row=9, column=5, value=formula) # Formula in row 9 returns #VALUE!
formula = '=CORREL(A2:A7,B2:B7)'
ws.cell(row=6, column=5, value=formula) # CORREL function with ranges works fine
formula = '=IF(A2:A3,A2:A3)'
ws.cell(row=7, column=5, value=formula) # enters "=@IF(@A2:A3;A2:A3)"
formula = '=IF(A2,B2)'
ws.cell(row=8, column=5, value=formula) # enters "=IF(A2;B2)"
wb.save("test.xlsx")
在“test.xlsx”中,这是我的输出(单元格 E5-E9)
-0.9528
-0.9528
#VALUE!
40
#VALUE!
还有公式:
=CORREL(IF(@A2:A7;A2:A7);B2:B7)
=CORREL(A2:A7;B2:B7)
=@IF(@A2:A3;A2:A3)
=IF(A2;B2)
=CORREL(IF(@A2:A7;A2:A7);B2:B7)
【问题讨论】:
-
这不是一个错误,它实际上是一个特性,实际上是使用动态数组的副作用。我认为可以肯定地说您获得
"@"的原因与您使用Microsoft365 有关,如here 所述。虽然由于 Python 不是我的强项,但我不知道如何通过 OpenPyxl 库解决这个问题。您需要输入数组公式。
标签: python excel-formula openpyxl