使用openpyxl时保持数组公式的性质

时间:2018-09-25 00:28:17

标签: python excel pandas excel-formula openpyxl

我在excel工作簿上工作,该工作簿需要使用openpyxl查找所有列值的中位数,其中另一个列值是特定字符串。为此,我结合使用了MEDIANIF,其中需要 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的中值。

1 个答案:

答案 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:

  1. pycel
  2. xlwings

署名:openpyxl文档(Tokenizer