在做一个项目时,我想使用Excel中的过滤功能,以便以整洁和专业的方式显示内容。不幸的是,openpyxl(3.1.4)不支持过滤功能,所以必须将其添加到Python代码中,如下所示:
example = "=_xlfn.FILTER(Index!$D$4:$D$100,Index!$F$4:$F$100=\"JA\",\"\")"
ws['C4']= example
程序运行时,会将数据输入工作簿...公式开头有一个
@
,如下所示:
=@FILTER(Index!$D$4:$D$100;Index!$F$4:$F$100="JA";"")
此符号导致过滤功能仅显示项目的第一个实例,而不是显示整个列表。 当然,当删除该符号时,一切都会正常工作。
当然我可以每次都手动删除它,但是一段时间后这会变得很烦人,因为这个程序会经常使用。如何利用 Python 中的这一强大功能?还是我需要微笑着承受?
简短回答
恐怕到目前为止您还无法在 OpenPyXL 中使用 动态数组公式和溢出数组行为。溢出数组行为是在 Excel 版本 365 中引入的。它在以前的版本中不可用。 OpenPyXL 是在 Excel 版本为 2007 年时引入的并基于规范(第一个版本使用 Office Open XML 和
*.xlsx
文件格式)。
但是为什么有
@
符号呢?
@符号...用来...表示隐式交集。 ... @ 表示公式应使用隐式交集 检索值
如果 OpenPyXL 存储
FILTER
公式,那么它会像 365 之前的 Excel 版本存储公式一样。它不考虑溢出数组行为,这需要存储特殊的单元格元数据来描述溢出数组行为 - 根据需要将值溢出到尽可能多的单元格。到目前为止,OpenPyXL 中甚至还没有这些元数据的类。因此,当 Excel 打开文件时,它会发现一个 FILTER
公式 without 溢出数组行为,该公式无法正常工作并且仅返回 one 值。它用 @
来标记。
可以把@去掉吗?
恐怕不是。如前所述,到目前为止,您无法使用 OpenPyXL 使用动态数组公式和溢出数组行为。 人们可以在旧的数组公式上下文中使用
FILTER
。但这需要知道结果数组的大小,因为旧的数组公式不是动态的并且明确地not将它们的值溢出到所需数量的单元格中。
示例:
from openpyxl import Workbook
from openpyxl.worksheet.formula import ArrayFormula
wb = Workbook()
ws = wb.create_sheet("Index", 1)
ws['D3'] = ""
data = [{'D':"D4"}, {'D':"D5", 'F':"JA"}, {'D':"D6"}, {'D':"D7", 'F':"JA"}, {'D':"D8"}]
for row in data:
ws.append(row)
ws = wb.active;
formula = "=_xlfn.FILTER(Index!$D$4:$D$100,Index!$F$4:$F$100=\"JA\",\"\")"
ws['C4'] = ArrayFormula('C4:C5', formula)
wb.save('excelResult.xlsx')