在数据分析和业务报告场景中,数据透视表(Pivot Table)是一种强大的数据汇总工具。它能够快速对大量数据进行分类、汇总和分析,帮助用户从不同维度洞察数据规律。
对于 .NET 开发者而言,在某些场景下需要通过代码自动生成包含数据透视表的 Excel 报表。例如:
- 自动化生成销售分析报表
- 批量处理业务数据汇总
- 动态创建财务分析报告
本文将介绍如何使用 C# 在 Excel 工作表中创建和配置数据透视表,包括数据源设置、字段布局和样式美化等关键步骤。
环境准备
首先需要在项目中添加 Spire.XLS for .NET 库。可以通过 NuGet 包管理器安装:
bash
Install-Package Spire.XLS
核心实现
创建工作簿和基础数据
创建数据透视表之前,需要先准备源数据。以下代码演示如何创建一个包含产品销售数据的工作表:
csharp
using Spire.Xls;
// 创建工作簿实例
Workbook workbook = new Workbook();
// 获取第一个工作表
Worksheet sheet = workbook.Worksheets[0];
// 设置列标题
sheet.Range["A1"].Value = "Product";
sheet.Range["B1"].Value = "Month";
sheet.Range["C1"].Value = "Count";
// 填充产品数据
sheet.Range["A2"].Value = "SpireDoc";
sheet.Range["A3"].Value = "SpireDoc";
sheet.Range["A4"].Value = "SpireXls";
sheet.Range["A5"].Value = "SpireDoc";
sheet.Range["A6"].Value = "SpireXls";
sheet.Range["A7"].Value = "SpireXls";
// 填充月份数据
sheet.Range["B2"].Value = "January";
sheet.Range["B3"].Value = "February";
sheet.Range["B4"].Value = "January";
sheet.Range["B5"].Value = "January";
sheet.Range["B6"].Value = "February";
sheet.Range["B7"].Value = "February";
// 填充数量数据
sheet.Range["C2"].Value = "10";
sheet.Range["C3"].Value = "15";
sheet.Range["C4"].Value = "9";
sheet.Range["C5"].Value = "7";
sheet.Range["C6"].Value = "8";
sheet.Range["C7"].Value = "10";
这段代码创建了一个简单的销售数据表,包含产品名称、月份和销售数量三个字段。在实际应用中,这些数据通常来自数据库或其他数据源。
创建数据透视表缓存
数据透视表需要基于一个数据缓存(PivotCache)来工作。缓存存储了源数据的副本,用于提高性能:
csharp
// 定义数据源范围
CellRange dataRange = sheet.Range["A1:C7"];
// 创建数据透视表缓存
PivotCache cache = workbook.PivotCaches.Add(dataRange);
PivotCache 对象负责管理数据透视表的源数据。通过将数据范围传递给缓存,可以在后续的数据透视表操作中引用这份数据。
添加数据透视表到工作表
创建缓存后,就可以在工作表上添加数据透视表了:
csharp
// 在工作表的 E10 单元格位置添加数据透视表
PivotTable pt = sheet.PivotTables.Add("Pivot Table", sheet.Range["E10"], cache);
这里指定了三个参数:
"Pivot Table":数据透视表的名称sheet.Range["E10"]:数据透视表左上角的起始位置cache:之前创建的数据缓存
配置行字段
行字段决定了数据在垂直方向上的分组方式。可以将多个字段添加到行区域来实现多级分组:
csharp
// 将 Product 字段添加到行区域
PivotField pf = pt.PivotFields["Product"] as PivotField;
pf.Axis = AxisTypes.Row;
// 将 Month 字段添加到行区域
PivotField pf2 = pt.PivotFields["Month"] as PivotField;
pf2.Axis = AxisTypes.Row;
通过设置 Axis 属性为 AxisTypes.Row,可以将字段放置在行区域。这样数据会先按产品分组,然后在每个产品下再按月份分组。
配置数据字段
数据字段用于对数值进行汇总计算。常见的汇总方式包括求和、计数、平均值等:
csharp
// 将 Count 字段添加到数据区域,使用求和方式
pt.DataFields.Add(pt.PivotFields["Count"], "SUM of Count", SubtotalTypes.Sum);
这行代码的含义是:
pt.PivotFields["Count"]:选择要汇总的字段"SUM of Count":数据字段的显示名称SubtotalTypes.Sum:汇总类型为求和
除了 Sum 之外,还可以使用 Count、Average、Max、Min 等多种汇总类型。
设置样式和自动调整
为了提高可读性,可以为数据透视表应用内置样式,并自动调整列宽:
csharp
// 应用内置样式
pt.BuiltInStyle = PivotBuiltInStyles.PivotStyleMedium12;
// 计算数据透视表数据
pt.CalculateData();
// 自动调整列宽以适应内容
sheet.AutoFitColumn(5);
sheet.AutoFitColumn(6);
CalculateData() 方法确保数据透视表在保存前完成计算。AutoFitColumn() 方法根据内容自动调整列宽,使输出更加美观。
保存文件
最后,将生成的工作簿保存到文件:
csharp
String result = "CreatePivotTable_output.xlsx";
// 以 Excel 2010 格式保存
workbook.SaveToFile(result, ExcelVersion.Version2010);
// 释放资源
workbook.Dispose();
完整示例
以下是完整的代码示例:
csharp
using System;
using Spire.Xls;
class Program
{
static void Main()
{
// 创建工作簿
Workbook workbook = new Workbook();
// 获取第一个工作表
Worksheet sheet = workbook.Worksheets[0];
// 设置列标题
sheet.Range["A1"].Value = "Product";
sheet.Range["B1"].Value = "Month";
sheet.Range["C1"].Value = "Count";
// 填充示例数据
sheet.Range["A2"].Value = "SpireDoc";
sheet.Range["A3"].Value = "SpireDoc";
sheet.Range["A4"].Value = "SpireXls";
sheet.Range["A5"].Value = "SpireDoc";
sheet.Range["A6"].Value = "SpireXls";
sheet.Range["A7"].Value = "SpireXls";
sheet.Range["B2"].Value = "January";
sheet.Range["B3"].Value = "February";
sheet.Range["B4"].Value = "January";
sheet.Range["B5"].Value = "January";
sheet.Range["B6"].Value = "February";
sheet.Range["B7"].Value = "February";
sheet.Range["C2"].Value = "10";
sheet.Range["C3"].Value = "15";
sheet.Range["C4"].Value = "9";
sheet.Range["C5"].Value = "7";
sheet.Range["C6"].Value = "8";
sheet.Range["C7"].Value = "10";
// 创建数据透视表缓存
CellRange dataRange = sheet.Range["A1:C7"];
PivotCache cache = workbook.PivotCaches.Add(dataRange);
// 添加数据透视表
PivotTable pt = sheet.PivotTables.Add("Pivot Table", sheet.Range["E10"], cache);
// 配置行字段
PivotField pf = pt.PivotFields["Product"] as PivotField;
pf.Axis = AxisTypes.Row;
PivotField pf2 = pt.PivotFields["Month"] as PivotField;
pf2.Axis = AxisTypes.Row;
// 配置数据字段
pt.DataFields.Add(pt.PivotFields["Count"], "SUM of Count", SubtotalTypes.Sum);
// 设置样式
pt.BuiltInStyle = PivotBuiltInStyles.PivotStyleMedium12;
// 计算数据并调整列宽
pt.CalculateData();
sheet.AutoFitColumn(5);
sheet.AutoFitColumn(6);
// 保存文件
workbook.SaveToFile("CreatePivotTable_output.xlsx", ExcelVersion.Version2010);
workbook.Dispose();
Console.WriteLine("数据透视表创建成功!");
}
}
生成结果预览

实用技巧
更改字段布局
除了行字段和数据字段,还可以将字段添加到列区域或筛选区域:
csharp
// 将字段添加到列区域
PivotField columnField = pt.PivotFields["Month"] as PivotField;
columnField.Axis = AxisTypes.Column;
// 将字段添加到筛选区域
PivotField filterField = pt.PivotFields["Product"] as PivotField;
filterField.Axis = AxisTypes.Page;
使用不同的汇总方式
根据分析需求,可以选择不同的汇总类型:
csharp
// 计数
pt.DataFields.Add(pt.PivotFields["Count"], "Count", SubtotalTypes.Count);
// 平均值
pt.DataFields.Add(pt.PivotFields["Count"], "Average", SubtotalTypes.Average);
// 最大值
pt.DataFields.Add(pt.PivotFields["Count"], "Max", SubtotalTypes.Max);
自定义数据透视表选项
可以进一步配置数据透视表的显示选项:
csharp
// 显示经典数据透视表布局
pt.ShowClassicPivotTableLayout = true;
// 禁用字段列表
pt.FieldPrintOptions.ShowFieldList = false;
结论
本文介绍了如何使用 C# 在 Excel 中创建数据透视表。通过合理配置数据源、字段布局和样式选项,可以快速生成专业的数据分析报表。
掌握这些技术后,你可以:
- 扩展为从数据库读取真实业务数据
- 添加更多字段和更复杂的分组逻辑
- 应用条件格式增强可视化效果
- 批量生成多张数据透视表进行分析
数据透视表是 Excel 数据分析的核心功能之一,将其集成到自动化流程中可以大大提高报表生成效率。