我在excel工作簿上工作,该工作簿需要使用openpyxl查找所有列值的中位数,其中另一个列值是特定字符串。为此,我结合使用了MEDIAN
和IF
,其中需要 Ctrl + Shift + Enter 按下即可将其视为数组公式。
但是openpyxl在保存文件时不会保留此数组公式的性质。
示例数据:
Values | IDS
3.5 | 1234
2.5 | 1234
6.5 | 5687
7.5 | 1234
9.5 | 1234
1.0 | 7894
对于上述数据,我应该只能找到其相邻id = 1234的值的中位数。
我必须使用openpyxl,因此需要一个非数组公式来循环遍历具有ID的数组列表,并找到每个匹配ID的中值。
答案 0 :(得分:1)
openpyxl支持有限解析嵌入在单元格中的公式。 openpyxl.formula软件包包含Tokenizer类,用于将公式分解为其组成的令牌。 Excel公式中的令牌。
令牌具有三个属性:
- value:导致此令牌的已解析字符串值(实际的公式,就像您在excel中编写的那样,在我们的Median-IF公式中。)
- type:标识令牌类型的字符串
- subtype:标识令牌子类型的字符串(可选,默认为“”)
您的中位数-如果公式可能不同,则下面的代码仅供参考。它建议如何使用openpyxl解析(或说验证)数组公式。用法如下:
>>> from openpyxl.formula import Tokenizer
>>> tok = Tokenizer("""{=MEDIAN(IF($B$1:$B$6="1234",$A$1:$A$6,""))}""")
>>> tok.type = Token.ARRAY
>>> tok.parse()
请注意,openpyxl支持打开工作簿时可以使用 data_only 标志选择的公式或公式的值。但是,openpyxl不会也不会计算公式的结果。使用以下任一方法可以更好地控制Python中的Excel:
署名:openpyxl文档(Tokenizer)