Таблица Excel, созданная EPPlus, не распространяет формулу на новые строки - PullRequest
1 голос
/ 01 мая 2019

Я использую EPPlus 4.5.3.1 для создания книги Excel.Он содержит одну рабочую таблицу с одной таблицей Excel, содержащей данные.

Требуется, чтобы пользователи могли добавлять новые строки в таблицу (что в Excel выполняется путем щелчка правой кнопкой мыши по строке и выбораВставка> Новая строка или нажатие клавиши табуляции в правой нижней ячейке таблицы).

Мне не удается получить книгу, созданную EPPlus, для распространения формулы, которую я получил встолбец, чтобы новые строки, сгенерированные в таблице в Excel.Если я вручную создаю идентичную рабочую книгу, формула распространяется.

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

Вотминимальный пример (консольное приложение).Это создает рабочую книгу.При открытии в Excel формула в крайнем правом столбце не распространяется на новые строки, когда пользователь создает новые строки в таблице.

У меня такой вопрос, это ограничение EPPlus илиЯ пропустил что-то, что будет демонстрировать поведение, когда формулы в столбце таблицы распространяются на новые строки, созданные в этой таблице?

using System.Collections.Generic;
using System.IO;
using System.Linq;
using OfficeOpenXml;
using OfficeOpenXml.Table;

namespace EPPlusTests
{
    class Program
    {
        static void Main(string[] args)
        {
            List<ExampleData> exampleDatas = new List<ExampleData>();
            exampleDatas.Add(new ExampleData() { PersonName = "Tom", PersonAge = 44 });
            exampleDatas.Add(new ExampleData() { PersonName = "Richard", PersonAge = 37 });
            exampleDatas.Add(new ExampleData() { PersonName = "Harry", PersonAge = 41 });

            ExcelPackage package = new ExcelPackage();
            ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Testing");
            worksheet.Cells.LoadFromCollection(exampleDatas, true, TableStyles.Dark1);

            var col = worksheet.Cells.First(x => x.Value.ToString() == "TheFormula").Start.Column;
            //worksheet.Cells[2, col, worksheet.Dimension.End.Row, col].FormulaR1C1 = "2*RC[-1]"; // nope
            worksheet.Cells["C2:C4"].FormulaR1C1 = "2*RC[-1]"; // nope

            package.SaveAs(new FileInfo("C:\\Temp\\EPPlusTestFormula.xlsx"));
        }
    }

    class ExampleData
    {
        public string PersonName { get; set; }
        public int PersonAge { get; set; }
        public string TheFormula { get; set; }
        public ExampleData() { }
    }
}

1 Ответ

0 голосов
/ 01 мая 2019

ОК, это оказалось очень легко.Разрешение вместо адресации диапазона ячеек вместо адреса столбца в таблице и использования .CalculatedColumnFormula для назначения формулы.Я не знаю, можете ли вы использовать R1C1 для этого, возможно, вам придется использовать синтаксис формулы для таблицы.

Вот что работает для приведенного выше примера:

ExcelTable table = worksheet.Tables[0];
table.Columns[2].CalculatedColumnFormula = "2*Table1[[#This Row],[PersonAge]]";

Возможно, некоторыеболее согласованный поиск в Google привел бы меня туда изначально.Я нашел ответ в коде здесь .

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