写入结果电子表格时,聚合公式不会自动计算
AGGREGATE formula not automatically calculating when written to results spreadsheet
我有一个 python 3.7 脚本,它是使用 OPENPYXL (v2.5.10) 库开发的,用于从多个 excel 工作簿中获取数据,处理该数据,然后写入到单独的 excel 工作簿。结果工作簿包含大约 100 个命名范围和大量公式,它们都按预期工作,包括在 excel.
中打开工作簿时自动计算
我在使用一个包含 AGGREGATE 函数的特定公式组时遇到问题。在这种情况下,公式以正确的形式写入结果工作簿、正确的单元格。虽然其他公式会在打开工作簿时显示结果值,但如果您 select 单元格,将光标放在公式栏中(就像您正在编辑公式一样),然后按enter/return 键。没有对公式进行更改或编辑。完成此操作后,公式将按预期工作。
我已经在最新的 macOS 和 windows 版本的 excel 上对此进行了测试,我得到了相同的行为。我应该补充一点,尝试 'calculate now'、CtrlShiftAltF9 和 'calculate sheet' 选项没有任何影响。公式计算的唯一时间是使用 enter/return 键。
写公式的代码是:
activeSheet.cell(row, col).value = f"=IFERROR(INDEX({rngData}, AGGREGATE(15,3,({rng}={cellRef})/({rng}= {cellRef})*ROW({rng}),{nth}),{colIndex}),\"\")"
例如,在 excel 工作簿单元格中给出的正确结果为:
=IFERROR(INDEX(_monthAgedDebt_Data, AGGREGATE(15,3,(_monthAgedDebt_ProjectNumbers=$L)/(_monthAgedDebt_ProjectNumbers=$L)*ROW(_monthAgedDebt_ProjectNumbers),1),6),"")
总而言之:
- 代码可以正常工作,因为它将正确的公式写入正确的单元格并以正确的形式出现
- 在 excel 中,公式不会自动计算,只有当您在单元格中编辑公式,不做任何更改,然后按 enter/return 退出编辑时才有效
生成数组结果的 AGGREGATE 有问题吗?我选择这种形式的公式主要是因为您不需要 CTL-SHIFT-ENTER 来使其工作。如果直接将其输入到 excel 中的单元格中,则可以将其作为普通公式输入。
除此 外,我没能找到有关堆栈溢出的帮助。但是,此处提出的解决方案也不起作用。
这个question提出了一个类似的问题,但没有相关回复。
这个 可能有线索,但我似乎也无法做到这一点。
对解决此问题的任何想法表示赞赏。我不确定这是 openpyxl 问题还是 excel 问题,我不确定还有什么要测试的。
全部 - 完整性的最终答案。
事实证明,解决这个问题的关键在于 OPENPYXL,查理克拉克对此
的回答中提供的指导
是正确的。我最初错误地应用了解决方案。
我把公式改为:
activeSheet.cell(row, col).value = \
f"=IFERROR(INDEX({rngData}, _xlfn.AGGREGATE(15,3,({rng}={cellRef})/({rng}={cellRef})*ROW({rng}),{nth}),{colIndex}),\"\")"
通过添加“_xlfn”。到 AGGREGATE 函数语句的前面。
excel 电子表格现在可以按预期工作,无需编辑包含公式的单元格。
我有一个 python 3.7 脚本,它是使用 OPENPYXL (v2.5.10) 库开发的,用于从多个 excel 工作簿中获取数据,处理该数据,然后写入到单独的 excel 工作簿。结果工作簿包含大约 100 个命名范围和大量公式,它们都按预期工作,包括在 excel.
中打开工作簿时自动计算我在使用一个包含 AGGREGATE 函数的特定公式组时遇到问题。在这种情况下,公式以正确的形式写入结果工作簿、正确的单元格。虽然其他公式会在打开工作簿时显示结果值,但如果您 select 单元格,将光标放在公式栏中(就像您正在编辑公式一样),然后按enter/return 键。没有对公式进行更改或编辑。完成此操作后,公式将按预期工作。
我已经在最新的 macOS 和 windows 版本的 excel 上对此进行了测试,我得到了相同的行为。我应该补充一点,尝试 'calculate now'、CtrlShiftAltF9 和 'calculate sheet' 选项没有任何影响。公式计算的唯一时间是使用 enter/return 键。
写公式的代码是:
activeSheet.cell(row, col).value = f"=IFERROR(INDEX({rngData}, AGGREGATE(15,3,({rng}={cellRef})/({rng}= {cellRef})*ROW({rng}),{nth}),{colIndex}),\"\")"
例如,在 excel 工作簿单元格中给出的正确结果为:
=IFERROR(INDEX(_monthAgedDebt_Data, AGGREGATE(15,3,(_monthAgedDebt_ProjectNumbers=$L)/(_monthAgedDebt_ProjectNumbers=$L)*ROW(_monthAgedDebt_ProjectNumbers),1),6),"")
总而言之:
- 代码可以正常工作,因为它将正确的公式写入正确的单元格并以正确的形式出现
- 在 excel 中,公式不会自动计算,只有当您在单元格中编辑公式,不做任何更改,然后按 enter/return 退出编辑时才有效
生成数组结果的 AGGREGATE 有问题吗?我选择这种形式的公式主要是因为您不需要 CTL-SHIFT-ENTER 来使其工作。如果直接将其输入到 excel 中的单元格中,则可以将其作为普通公式输入。
除此
这个question提出了一个类似的问题,但没有相关回复。
这个
对解决此问题的任何想法表示赞赏。我不确定这是 openpyxl 问题还是 excel 问题,我不确定还有什么要测试的。
全部 - 完整性的最终答案。
事实证明,解决这个问题的关键在于 OPENPYXL,查理克拉克对此
的回答中提供的指导是正确的。我最初错误地应用了解决方案。
我把公式改为:
activeSheet.cell(row, col).value = \ f"=IFERROR(INDEX({rngData}, _xlfn.AGGREGATE(15,3,({rng}={cellRef})/({rng}={cellRef})*ROW({rng}),{nth}),{colIndex}),\"\")"
通过添加“_xlfn”。到 AGGREGATE 函数语句的前面。
excel 电子表格现在可以按预期工作,无需编辑包含公式的单元格。