Я хочу создать сводную таблицу, основанную на модели данных, которая берет из трех таблиц, уже определенных в моей книге. К сожалению, я не могу найти, как это сделать.
Что я сделал до сих пор:
Код, который я написал для создания примера файла Excel с тремя таблицами, а затем создания простой сводной таблицы с одной таблицей, находится внизу этого поста. Как видно из жестко закодированных данных в этом коде, эти три таблицы определяют двух человек, двух домашних животных и владельцев этих домашних животных. Одно домашнее животное принадлежит обоим людям, другое домашнее животное принадлежит только одному человеку. Затем на единственной таблице SimplePivotTbl
создается сводка PeoplePets
.
Затем я открыл 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();
}
}
}
Я разместил это как проблему на github EPPlus, и ответ был таким:
Нет, на данный момент поддержка моделей данных не предусмотрена. Я добавлю это как улучшение для будущих версий.