如何使用 OpenXML SDK 创建数据透视表以及带过滤器的图表

问题描述 投票:0回答:1

我们正在开展一个迁移项目,其中使用 Microsoft.Office.Interop.Excel 生成 Excel (.xlsx) 文件。目前,在迁移的应用程序中,我们正在使用 Open XML SDK 使用 C# 生成 Excel 文件。 Excel 文件有数据透视表、条形图和饼图。我们能够使用可用的文档创建一些简单的条形图和饼图。

但我们正在寻求一些帮助来实现以下功能: • 基于数据透视过滤器创建/更新数据透视表(数据透视数据源中存在的列的组合) • 基于透视过滤器或图表过滤器创建/更新条形图。 • 基于透视过滤器或图表过滤器创建/更新饼图。 • 在条形图中添加标签 • 在饼图中添加标签

下面附上一些屏幕截图来说明预期的数据透视表和图表行为,需要使用 C# 中的 Open XML SDK 创建:

一些参考。我们在互联网上发现:使用 OpenXml 在 Excel 上创建饼图

但是参考链接中提供的解决方案是基于直接数据来创建饼图,在我们的具体项目中,首先我们需要从数据库记录创建数据透视表,然后使用创建的数据透视表数据,进一步我需要创建饼图和条形图,通过这种方式,我们正在寻找一些帮助或任何示例代码参考来实现以下功能(已附上参考的屏幕截图):

• 基于数据透视过滤器创建/更新数据透视表(数据透视数据源中存在的列的组合) • 基于透视过滤器或图表过滤器创建/更新条形图。 • 基于透视过滤器或图表过滤器创建/更新饼图。 • 在条形图中添加标签 • 在饼图中添加标签

enter image description here enter image description here

c# .net excel openxml openxml-sdk
1个回答
0
投票

我建议使用 Open XML SDK 2.5 Productivity Tool,它很原始,但很有效。一种逆向工程过程。

创建具有预期格式和数据的 Excel。 在工具中打开,点击“Reflect Code”,会生成一个可以生成excel的.cs类。

有关如何安装,请阅读此处。 https://learn.microsoft.com/en-us/answers/questions/466445/where-can-i-download-open-xml-sdk-2-5-productivity

我把代码片段放在这里,源代码太长了我移至https://github.com/Otaku-Projects/ReportEngine/wiki/Open-XML-SDK-Quick-Guide

对于带有过滤器的代码

// Generates content of pivotTablePart1.
        private void GeneratePivotTablePart1Content(PivotTablePart pivotTablePart1)
...
            Location location1 = new Location(){ Reference = "A5:B9", FirstHeaderRow = (UInt32Value)1U, FirstDataRow = (UInt32Value)1U, FirstDataColumn = (UInt32Value)1U, RowPageCount = (UInt32Value)1U, ColumnsPerPage = (UInt32Value)1U };
...

            PivotField pivotField10 = new PivotField(){ Axis = PivotTableAxisValues.AxisPage, ShowAll = false };
...            
            PageFields pageFields1 = new PageFields(){ Count = (UInt32Value)1U };
            PageField pageField1 = new PageField(){ Field = 9, Hierarchy = -1 };
            pageFields1.Append(pageField1);
...
            pivotTableDefinition1.Append(pageFields1);

对于没有过滤器的代码

// Generates content of pivotTablePart1.
        private void GeneratePivotTablePart1Content(PivotTablePart pivotTablePart1)
...
            Location location1 = new Location(){ Reference = "A5:B9", FirstHeaderRow = (UInt32Value)1U, FirstDataRow = (UInt32Value)1U, FirstDataColumn = (UInt32Value)1U };
...
            PivotField pivotField10 = new PivotField(){ ShowAll = false };
...
// removed PageFields pageFields1
...
// removed pivotTableDefinition1.Append(pageFields1);

我将数据透视表放在“sheet2”上,对于字段= 9,它引用“sheet1”处的列 J(从零开始的索引),它是在GeneratePivotTableCacheDefinitionPart1Content()下定义的

WorksheetSource worksheetSource1 = new WorksheetSource(){ Reference = "A1:K7", Sheet = "Sheet1" };

© www.soinside.com 2019 - 2024. All rights reserved.