我希望创建一个依赖于数据模型的数据透视表,该数据模型取自我的工作簿中已经定义的三个表。不幸的是,我找不到如何做到这一点。
到目前为止我做了什么:
-
我为创建一个包含三个表的示例Excel文件,然后创建一个简单的单表透视图而编写的代码位于本文的底部。从代码中的硬编码数据中可以看出,这三个表定义了两个人、两只宠物以及这些宠物的所有权。一只宠物归两个人所有,另一只宠物只归一个人所有。然后在单个表CCD_ 2上创建枢轴CCD_。
-
接下来,我在Excel2016中打开了
test.xlsx
,并创建了明显的多表数据透视表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:temptest.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();
}
}
}
我在EPPlus github上发布了这个问题,得到的回复是:
不,目前不支持数据模型。我将添加此功能作为将来版本的增强功能。