如何在Excel 365中正确编写Python过滤函数?

问题描述 投票:0回答:1

在做一个项目时,我想使用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 中的这一强大功能?还是我需要微笑着承受?

python python-3.x openpyxl excel-365
1个回答
0
投票

简短回答

恐怕到目前为止您还无法在 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')
© www.soinside.com 2019 - 2024. All rights reserved.