Как правильно написать функцию фильтра Python в Excel 365?

Работая над проектом, я хотел использовать функцию фильтра в 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 для X») здесь обычно не по теме. Лучше вместо этого просто спросить, как чего-то добиться на Python, и если решение будет «использовать пакет X», то это нормально.

TylerH 27.06.2024 19:21

@python_noob Попробуйте это: ws['C4'].value = re.sub(r'@', '', ws['C4'].value)

Vikas Sharma 27.06.2024 23:25

Excel автоматически добавляет символ «@» в графический интерфейс точно так же, как он переводит и бесполезную транскрипцию «,» в «;» в разделителях и "." до "," в цифрах.

Charlie Clark 28.06.2024 14:10
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Короткий ответ

Боюсь, вы до сих пор не можете использовать Формулы динамических массивов и поведение разделенных массивов с OpenPyXL. Поведение распределенного массива было представлено в Excel версии 365. Его нельзя использовать в предыдущих версиях. OpenPyXL был представлен и основан на спецификациях версии Excel 2007 года (первая версия, использующая Office Open XML и формат файлов *.xlsx).

Но почему символ @?

Это описано в Оператор неявного пересечения: @:

Символ @... используется... для обозначения неявного пересечения. ... @ указывает, что формула должна использовать неявное пересечение для получить значение

Если OpenPyXL хранит формулу FILTER, то он делает это так же, как версии Excel до 365, которые сохраняли формулы. Он не учитывает поведение распределенного массива, для которого потребуется хранить специальные метаданные ячеек для описания поведения распределенного массива - распределения значений по такому количеству ячеек, сколько необходимо. В OpenPyXL до сих пор даже нет классов для этих метаданных. Таким образом, когда Excel открывает файл, он находит формулу FILTER без поведения массива, которая не может работать правильно и возвращает только одно значение. Это отмечается знаком @.

Можешь убрать @?

Боюсь, не совсем так. Как уже говорилось, до сих пор вы не можете использовать формулы динамических массивов и поведение распределенного массива с помощью OpenPyXL. Можно было использовать FILTER в контексте старой формулы массива. Но для этого необходимо знать размер результирующего массива, поскольку старые формулы массива не являются динамическими и явно не распределяют свои значения по необходимому количеству ячеек.

Пример:

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')

Спасибо за объяснение. Это имеет смысл.

python_noob 28.06.2024 08:32

Поддержка метаданных FWIW будет в версии 3.2, но только согласно спецификации.

Charlie Clark 28.06.2024 14:09

Другие вопросы по теме