我怎样才能得到python生成Excel文档来正确计算数组公式

我使用python 3.6和openpyxl生成一些Excel文件。

在某一点上,我必须计算一个数据段的标准偏差。 在Excel中,这是用数组公式完成的。 写出正确的公式很容易,但是当我问excel来计算 – 它显示“#NAME?”,除非我手动input每个单元格并按下CTRL + SHIFT + ENTER。
但是,在这之前,公式显示了正确的大括号,所以我不确定我在改变什么。 既然我们正在谈论不less手工进入其中的每一个都不可行。 有没有办法让Excel或Python在Excel中正确执行公式? 我愿意使用其他库或者在必要时编写一个VB脚本。

以下是python工作的最小可行示例:

from openpyxl import Workbook from openpyxl.utils.cell import get_column_letter from random import random from random import randrange wb = Workbook() ws = wb.create_sheet() ws.title = 'Data' #generate random data for i in range(100): ws.cell(column=1, row=1+i, value=random()*100) ws.cell(column=2, row=1+i, value=randrange(1,5)) #calculate standard deviations for specific integer values for i in range(4): ws.cell(column=4+i, row=1, value='STDEV {0}'.format(i+1)) ws.cell(column=4+i, row=2, value='=STDEV.P(IF(B1:B100={0},A1:A100," "))'.format(i+1)) targetVal = '{0}2'.format(get_column_letter(4+i)) ws.formula_attributes[targetVal] = {'t': 'array', 'ref': targetVal} #cleaning up ws = wb.get_sheet_by_name("Sheet") wb.remove_sheet(ws) wb.save("fTest.xlsx") 

对示例的快速说明:我在A列中生成0到100之间的100个随机数字,在B列中生成1到4(含)之间的整数值。在包含STDEV 1的单元格下面,计算列中所有值的标准偏差A在列B中有1,对于其他STDEV列也是如此。
生成的excel文件应该有“#NAME?” 在STDEV.P单元格中,如果你的excel被设置为自动计算。 如果input公式并使用CTRL + SHIFT + ENTER执行,公式将正确执行。

open-pyxl有一个STDEV.P函数的错误。 添加全名如下:

 ws.cell(column=4+i, row=2, value='=_xlfn.STDEV.P(IF(B1:B100={},A1:A100,0))'.format(i+1)) 

它会正常工作。

你也可以在这里看到它。

你可以在文档中看到并不是所有的公式都包含在内:

如果您尝试使用未知的公式,则可能是因为您使用的是未包含在初始规范中的公式。 这样的公式必须以xlfn为前缀。 去工作

要检查是否包含公式,您可以使用:

 from openpyxl.utils import FORMULAE print "STDEV.P" in FORMULAE 

如果为false, _xlfn. 应放在公式名称之前。