Формула EPPlus не работает без вызова Calculate

Я пытался использовать две функции в Excel: ИНДЕКС и MATCH и в соответствии с кодексом EPPlus они должны быть поддерживается. Каждый раз, когда я открываю файл, появляется предупреждающее сообщение о том, что что-то сломано, и спрашивает, хочу ли я восстановить документ, а когда он открывается, все формулы исчезают. При восстановлении документа отображается диалоговое окно о том, что формула была удалена из /xl/worksheets/sheet1.xml-del.

Я могу поместить формулы вручную в электронную таблицу, и они работают, но единственный способ получить какие-либо данные для отображения в сгенерированном файле xlsx — это вызвать Calculate() на листе. Это выведет данные правильно, но мне нужно, чтобы формулы были внутри документа.

Вот небольшой пример формул, которые я пробовал

private byte[] TestingFormula()
{
    using (ExcelPackage pck = new ExcelPackage(_helper.GetTemplateStream("TEST.xlsx")))
    {
        var ws = pck.Workbook.Worksheets[1];

        ws.Cells["A4"].Formula = "INDEX($C$1:$D$24;4;2)";
        ws.Cells["A6"].Formula = "INDEX(C1:D24;6;2)";

        ws.Cells["B26"].Formula = "MATCH($B$12;$C$1:$D$1;0)";

        // sum works as expected
        //ws.Cells["D25"].Formula = "SUM(D2:D24)";

        //pck.Workbook.Calculate();
        //pck.Workbook.CalcMode = ExcelCalcMode.Automatic;
        return pck.GetAsByteArray();
    }
}

TEST.xlsx — это просто шаблон, который выглядит так

введите здесь описание изображения

Итак, что я делаю неправильно здесь?


person Binke    schedule 23.03.2017    source источник
comment
Почему в формулах вместо запятых используются точки с запятой? Я не проверял, но думаю, что "INDEX($C$1:$D$24,4,2)" будет работать нормально.   -  person UndeadBob    schedule 23.03.2017
comment
Использованы существующие формулы, которые я только что скопировал. Использование запятых вместо точки с запятой фактически решило проблему, поэтому я предполагаю, что epplus не обрабатывает точки с запятой, а только Excel.   -  person Binke    schedule 23.03.2017


Ответы (2)


Используйте запятые вместо точек с запятой в формулах:

ws.Cells["A4"].Formula = "INDEX($C$1:$D$24,4,2)";
ws.Cells["A6"].Formula = "INDEX(C1:D24,6,2)";

ws.Cells["B26"].Formula = "MATCH($B$12,$C$1:$D$1,0)";

Я предполагаю, что когда вы вводите точку с запятой непосредственно в Excel, MS исправляет формулу на лету. Фактический XML, вероятно, требует запятых, но я не уверен.

person UndeadBob    schedule 23.03.2017

Правильный ответ reasra (пока не могу комментировать). Это задокументировано в разделе «Некоторые распространенные ошибки» на этой странице:

https://epplus.codeplex.com/wikipage?title=About%20Formula%20calculation&referringTitle=Documentation

  • Не используйте локализованные имена функций. Поддерживаются только английские имена (такие как SUM, IF, VLOOKUP и т. д.).
  • Не используйте точку с запятой в качестве разделителя между аргументами функции. Поддерживается только запятая.
  • Не добавляйте начальный знак = в формулу. "=СУММ(A1:A2)" неверно, "СУММ(A1:A2)" правильно
person swmal    schedule 09.04.2017