Работая над проектом, я хотел использовать функцию фильтра в 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_noob Попробуйте это: ws['C4'].value = re.sub(r'@', '', ws['C4'].value)
Excel автоматически добавляет символ «@» в графический интерфейс точно так же, как он переводит и бесполезную транскрипцию «,» в «;» в разделителях и "." до "," в цифрах.






Короткий ответ
Боюсь, вы до сих пор не можете использовать Формулы динамических массивов и поведение разделенных массивов с 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')
Спасибо за объяснение. Это имеет смысл.
Поддержка метаданных FWIW будет в версии 3.2, но только согласно спецификации.
К вашему сведению, запросы на рекомендации ресурсов (в том числе «есть ли пакет Python для X») здесь обычно не по теме. Лучше вместо этого просто спросить, как чего-то добиться на Python, и если решение будет «использовать пакет X», то это нормально.