使用 C# 在 Excel 中创建数据透视表

在数据分析和业务报告场景中,数据透视表(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 之外,还可以使用 CountAverageMaxMin 等多种汇总类型。

设置样式和自动调整

为了提高可读性,可以为数据透视表应用内置样式,并自动调整列宽:

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 数据分析的核心功能之一,将其集成到自动化流程中可以大大提高报表生成效率。

相关推荐
架构师沉默2 小时前
别又牛逼了!AI 写 Java 代码真的行吗?
java·后端·架构
zone77392 小时前
006:RAG 入门-面试官问你,RAG 为什么要切块?
后端·算法·面试
狗头大军之江苏分军3 小时前
消耗 760万 Token 后,一文看懂了“小龙虾” OpenClaw 和 OpenCode 的区别
前端·后端
前端小张同学3 小时前
一次支付回调引发的「血案」:我是如何用 Redis + AOP 实现接口幂等的
后端
孟沐4 小时前
Java IO 流 - FileOutputStream & ObjectOutputStream 大白话解析
后端
lichenyang4534 小时前
Node.js文件上传原理
后端
码路飞4 小时前
FastMCP 实战:一个 .py 文件,给 Claude Code 装上 3 个超实用工具
python·ai编程·mcp
Java水解4 小时前
微服务架构下Spring Session与Redis分布式会话实战全解析
后端·spring
Moe4884 小时前
如何使用 Spring Cache 结合 Redis 和 Caffeine 构建二级缓存机制
后端