Отношения между несколькими таблицами в EPPplus?

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

Что я уже сделал:

  1. Код, который я написал для создания примера файла Excel с тремя таблицами, а затем создания простой сводной таблицы с одной таблицей, находится внизу этого поста. Как видно из жестко закодированных данных в этом коде, эти три таблицы определяют двух человек, двух домашних животных и владельцев этих домашних животных. Одно домашнее животное принадлежит обоим людям, другое домашнее животное принадлежит только одному человеку. Затем в единственной таблице PeoplePets создается сводная таблица SimplePivotTbl.

  2. Затем я открыл test.xlsx в Excel 2016 и создал сводную таблицу с несколькими таблицами ComplexPivotTbl, которая подсчитывает количество владельцев для каждого питомца. Полученный файл Excel можно загрузить здесь.

Что мне нужно: код для выполнения шага 2. Другими словами, код для выполнения того, что я сделал вручную в Excel для создания этой сводной таблицы.

Код для создания новой книги с тремя таблицами:

using System.IO;
using OfficeOpenXml;
using OfficeOpenXml.Table.PivotTable;

namespace EPPlusTestApp
{
    class Program
    {
        static void Main(string[] args)
        {
            const string outputFile = @"C:\temp\test.xlsx";
            if (System.IO.File.Exists(outputFile))
            {
                System.IO.File.Delete(outputFile);
            }
            var xls = new ExcelPackage(new FileInfo(outputFile));
            ExcelWorksheet ws = xls.Workbook.Worksheets.Add("Tables");

            // first table
            ws.Cells[1, 1].Value = "PersonId";
            ws.Cells[1, 2].Value = "PersonName";
            ws.Cells[1, 3].Value = "Age";

            ws.Cells[2, 1].Value = 1;
            ws.Cells[2, 2].Value = "John Doe";
            ws.Cells[2, 3].Value = 35;

            ws.Cells[3, 1].Value = 2;
            ws.Cells[3, 2].Value = "Jane Smith";
            ws.Cells[3, 3].Value = 40;
            ws.Tables.Add(ws.Cells[1, 1, 3, 3], "People");

            // second table
            ws.Cells[1, 5].Value = "PetId";
            ws.Cells[1, 6].Value = "PetName";
            ws.Cells[1, 7].Value = "Species";

            ws.Cells[2, 5].Value = 10;
            ws.Cells[2, 6].Value = "Spot";
            ws.Cells[2, 7].Value = "Dog";

            ws.Cells[3, 5].Value = 11;
            ws.Cells[3, 6].Value = "Fluffy";
            ws.Cells[3, 7].Value = "Cat";
            ws.Tables.Add(ws.Cells[1, 5, 3, 7], "Pets");

            // third table
            ws.Cells[1, 10].Value = "PersonId";
            ws.Cells[1, 11].Value = "PetId";

            ws.Cells[2, 10].Value = 1;
            ws.Cells[2, 11].Value = 10;

            ws.Cells[3, 10].Value = 2;
            ws.Cells[3, 11].Value = 10;
            
            ws.Cells[4, 10].Value = 1;
            ws.Cells[4, 11].Value = 11;
            ws.Tables.Add(ws.Cells[1, 10, 4, 11], "PeoplePets");

            ws.Cells.AutoFitColumns();

            // simple pivottable

            var ptws = xls.Workbook.Worksheets.Add("SimplePivotTable");
            var pt = ptws.PivotTables.Add(ptws.Cells[1, 1], (ExcelRangeBase)ws.Tables["PeoplePets"].Address, "SimplePivotTbl");
            var fld = pt.RowFields.Add(pt.Fields["PersonId"]);
            fld.Sort = eSortType.Ascending;
            fld = pt.ColumnFields.Add(pt.Fields["PetId"]);
            fld.Sort = eSortType.Ascending;
            var dfield = pt.DataFields.Add(pt.Fields["PetId"]);
            dfield.Function = DataFieldFunctions.Count;
            ptws.Cells.AutoFitColumns();

            xls.Save();
        }
    }
}

person Ross Presser    schedule 09.12.2020    source источник


Ответы (1)


Я опубликовал это как проблему на github EPPlus, и ответ был:

Нет, на данный момент поддержка моделей данных не предусмотрена. Я добавлю это как улучшение для будущих версий.

person Ross Presser    schedule 14.12.2020