输出中的 openpyxl 公式空白 excel

openpyxl formula blank in output excel

我想使用 Excel AVERAGE 公式来获取文件中各列的平均值。我这样做是这样的:

font = Font(name="Calibri", bold=True)

ws.cell(100, 1).value = "Mean"  # row 100 is the average row
ws.cell(100, 1).font = font

col_range = [2, 3, 4]  # the columns to average
for col_index in col_range:
    cell = ws.cell(100, col_index)  
*   cell.value = f"=AVERAGE({cell.column_letter}2:{cell.column_letter}98)"
    cell.font = font
wb.save(out_file)

但是,当我打开 Excel 文件时,平均单元格为空:

如您所见,第 100 行中的单元格除了“均值”单元格外都是空的。其他单元格中没有任何公式,但单元格的标记 did 有效(粗体文本)。

在打印上面代码中用*表示的公式时,我看到了这个:

=AVERAGE(B2:B98)
=AVERAGE(C2:C98)
=AVERAGE(D2:D98)

这就是我想要的样子。

当我用 cell.value = "test" 代替公式时, 起作用:

我认为这可能是语言问题,因为我的 Excel 是荷兰语,而 AVERAGE=GEMIDDELDE 是我的语言,但即使我使用 GEMIDDELDE,这仍然会导致单元格为空。

关于为什么这不起作用的任何想法?我应该提一下,我正在执行此操作的 Excel 文件是在使用脚本之前创建的,但我确实正确保存了它,然后再次打开它以输入公式。

编辑: 我刚刚在 docs:

中找到了这个
>>> from openpyxl import Workbook
>>> wb = Workbook()
>>> ws = wb.active
>>> # add a simple formula
>>> ws["A1"] = "=SUM(1, 1)"
>>> wb.save("formula.xlsx")

NB you must use the English name for a function and function arguments must be separated by commas and not other punctuation such as semi-colons.

如果我按照这个步骤一步一步来,那么这个就可以了。但是这段代码用的是Workbook(),但是我用的是load_workbook(),然后还是不行

我尝试使用 , 而不是 ;,但这也没有用。我认为您不应该使用 ; 很奇怪,因为单元格的值不只是一个字符串吗?我觉得 openpyxl 对它没有任何作用,但你不应该使用 ;.

我还下载了英文版的Excel排除语言。我还使用 ,. 作为必须求平均值的单元格中的小数点分隔符进行了测试,但是 none 也可以。我觉得现在这更像是一个 openpyxl 问题;我正在使用 3.0.5 版本。如果您使用 Workbook(),公式有效,但 load_workbook() 无效。不过,任何提示仍将不胜感激。

好的...所以,我现在有一些东西可以用了。使用 load_workbook() 时,可以使用 data_only 标志(来自 here):

There are several flags that can be used in load_workbook.

  • data_only controls whether cells with formulae have either the formula (default) or the value stored the last time Excel read the sheet.

我对同一个 Excel 文件执行了更多操作,而不仅仅是在问题中创建平均行,并且在执行这些操作时,我像这样打开工作簿:

    wb = load_workbook(filename, data_only=True)

事实证明,这会使公式不再有效!当我在打开工作簿的所有地方删除此标志时,AVERAGE 公式有效。确保如果您 select 一系列列,则仍使用 :,但如果您使用具有多个参数的公式,则使用 , 分隔它们不是 ;.

哦,顺便说一句,您可以用不同的语言加载 Excel 中的文件;只要您在代码中输入英文公式,它就会进行适当的翻译。