Используйте имена именованных диапазонов в формуле в Epplus

Я использую Epplus в приложении.NET Core, и я хотел бы использовать имена именованных диапазонов в формулах. Проблема в том, что когда я ссылаюсь на именованный диапазон, он принимает значение первой ячейки в диапазоне и не перебирает строки:

    var data = new List<object[]>()
{
    new object[] {"Hours", "Price", "Total"},
    new object[] {0.5, 10, 0},
    new object[] {2, 100, 0},
    new object[] {3, 20, 0}
};

using (var package = new ExcelPackage())
{
    var sheet = package.Workbook.Worksheets.Add("Variables");
    sheet.Cells["A1"].LoadFromArrays(data);

    sheet.Names.Add("Hours", sheet.Cells["A2:A4"]);
    sheet.Names.Add("Price", sheet.Cells["B2:B4"]);
    sheet.Names.Add("Total", sheet.Cells["C2:C4"]);

    sheet.Names["Total"].Formula = "Hours * Price";

    package.Workbook.Calculate();

    for (int i = 1; i <= sheet.Dimension.End.Row; i++)
    {
        Console.WriteLine($"{sheet.Cells[i, 1].Value}\t{sheet.Cells[i, 2].Value}\t{sheet.Cells[i, 3].Value}");
    }
}

Этот код записывает в консоль следующее:

Hours   Price   Total
0,5     10      5
2       100     5
3       20      5

Но на самом деле я хотел бы получить это:

Hours   Price   Total
0,5     10      5
2       100     200
3       20      60

Можно ли как-то сделать это, используя имена в качестве аргументов вместо адресов ячеек, например, "Часы * Цена"?

1 ответ

EPPlus Calculate() кажется, не поддерживает именованные диапазоны в формулах. Но если ваша консоль выводится только для теста, формулы рассчитываются правильно, если вы сохраните файл и откроете его. Т.е. если вы добавите using (var package = new ExcelPackage(new FileInfo(someFileName))) а также package.Save(); внутри заявления об использовании.

Вывод на консоль будет правильным, если ваша формула использует адреса ячеек (но, думаю, этого недостаточно):

for (int col = 2; col < 5; col++)
    sheet.Cells[$"C{col}"].Formula = $"A{col} * B{col}";
Другие вопросы по тегам