Excel удаляет формулу, добавленную с EPPlus - PullRequest
1 голос
/ 21 октября 2019

У меня есть электронная таблица, созданная с использованием библиотеки EPPlus, со столбцами Unit (C), Qty (D), Rate (E) и Total (F). Формула для определения суммы для строки немного сложна, так как я пытаюсь избежать ошибок #Value для пустых ячеек и т. Д. Следовательно, все вызовы функции ISNUMBER в формуле.

Формула:

=SWITCH(C3; ISBLANK(D3); ""; "Percentage"; IF(ISNUMBER(D3); D3; 0) * IF(ISNUMBER(E3); E3; 0) / 100; IF(ISNUMBER(D3); D3; 0) * IF(ISNUMBER(E3); E3; 0))

Когда я вставляю это в электронную таблицу, в ячейку F3 (Total), и перетаскиваю ее во все остальные строки в электронной таблице, она работает нормально, давая правильноеИтоги по всем рядам. Тем не менее, когда я пытаюсь добавить формулу при создании электронной таблицы, следующим образом:

for (var r = startAt + 2; r < endAt; r++)
{
    var amountFormula =
        $"=SWITCH(C{r}; ISBLANK(D{r}); \"\"; \"Percentage\"; IF(ISNUMBER(D{r}), D{r}, 0) * IF(ISNUMBER(E{r}), E{r}, 0) / 100; IF(ISNUMBER(D{r}), D{r}, 0) * IF(ISNUMBER(E{r}), E{r}, 0))";
    ws.Cells[$"F{r}"].Formula = amountFormula;
}

Я выполняю цикл для каждого набора строк, где используется формула, так как он не используется в каждой строке, напримерзаголовки, итоги групп и т. д.

Когда я пытаюсь открыть электронную таблицу в Excel, она говорит, что есть проблемное содержимое, которое будет удалено, и если я скажу «да», то удалит любой след формулы, и если яскажи нет, это не открывает электронную таблицу. Я чувствую, что есть какая-то проблема кодировки символов или что-то подобное, когда я пытаюсь добавить формулу через код. Как еще будет работать формула при вставке, но не при добавлении через код?

1 Ответ

0 голосов
/ 23 октября 2019

Мне пришлось заменить точку с запятой на запятую. Я предполагаю, что для вас это проблема региона, но EPPlus не поддерживает их:

https://github.com/JanKallman/EPPlus/wiki/Formula-Calculation

Также нужно было указать, что функция SWITCH была встроенной в Excel. В противном случае Excel предположит, что он определен пользователем, и выдаст ошибку $NAME в ячейке:

[TestMethod]
public void IsNumber_Formula_Test()
{
    ///13191764/excel-udalyaet-formulu-dobavlennuy-s-epplus

    //Throw in some data
    var dataTable = new DataTable("tblData");
    dataTable.Columns.AddRange(new[]
    {
        new DataColumn("Col1", typeof(int)),
        new DataColumn("Col2", typeof(int)),
        new DataColumn("Col3", typeof(int))
    });

    for (var i = 0; i < 10; i++)
    {
        var row = dataTable.NewRow();
        row[0] = i;
        row[1] = i * 10;
        row[2] = i * 100;
        dataTable.Rows.Add(row);
    }

    var fi = new FileInfo(@"c:\temp\IsNumber_Formula_Test.xlsx");
    if (fi.Exists)
        fi.Delete();

    using (var package = new ExcelPackage(fi))
    {
        var workbook = package.Workbook;
        var ws = workbook.Worksheets.Add("Sheet1");
        var cells = ws.Cells;
        cells["C1"].LoadFromDataTable(dataTable, true);

        var startAt = 0;
        var endAt = dataTable.Rows.Count + 2;

        for (var r = startAt + 2; r < endAt; r++)
        {
            //Had to use commas and specify the function domain
            //var amountFormula = $"=SWITCH(C{r}; ISBLANK(D{r}); \"\"; \"Percentage\"; IF(ISNUMBER(D{r}), D{r}, 0) * IF(ISNUMBER(E{r}), E{r}, 0) / 100; IF(ISNUMBER(D{r}), D{r}, 0) * IF(ISNUMBER(E{r}), E{r}, 0))";
            var amountFormula = $"=_xlfn.SWITCH(C{r}, ISBLANK(D{r}), \"\", \"Percentage\", IF(ISNUMBER(D{r}), D{r}, 0) * IF(ISNUMBER(E{r}), E{r}, 0) / 100, IF(ISNUMBER(D{r}), D{r}, 0) * IF(ISNUMBER(E{r}), E{r}, 0))";
            ws.Cells[$"F{r}"].Formula = amountFormula;
        }

        package.Save();

    }
}

Дает это:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...