C#使用Spire.XLS在Excel中創(chuàng)建數(shù)據(jù)透視表
引言
在 C# 環(huán)境下進(jìn)行 Excel 自動化,有多種方案可供選擇,例如 Microsoft Office Interop、EPPlus 等。但對于需要處理復(fù)雜 Excel 功能,尤其是數(shù)據(jù)透視表、圖表等高級特性,并且注重性能和部署便利性的場景,Spire.XLS 憑借其獨特的優(yōu)勢脫穎而出。
為什么選擇 Spire.XLS 進(jìn)行 Excel 自動化?
Spire.XLS 的核心特點與優(yōu)勢:
- 無需安裝 Office: Spire.XLS 是一個獨立的 .NET 組件,不依賴于 Microsoft Office 的安裝,這極大地簡化了部署流程,避免了兼容性問題。
- 高性能: 針對大數(shù)據(jù)量和復(fù)雜操作進(jìn)行了優(yōu)化,處理大型 Excel 文件時表現(xiàn)出色。
- API 豐富且直觀: 提供了全面且易于理解的 API 接口,能夠覆蓋 Excel 的幾乎所有功能,包括單元格操作、樣式設(shè)置、圖表、數(shù)據(jù)驗證、以及本文重點探討的數(shù)據(jù)透視表等。
- 跨平臺支持: 支持 .NET Framework、.NET Core、.NET 5/6/7 等,可在 Windows、Linux、macOS 等多種環(huán)境中使用。
- 出色的數(shù)據(jù)透視表支持: Spire.XLS 提供了強大的 API 來創(chuàng)建、配置和操作數(shù)據(jù)透視表,包括設(shè)置行/列字段、值字段、篩選器、計算字段、樣式等,功能非常完善。
Spire.XLS 創(chuàng)建數(shù)據(jù)透視表核心步驟詳解
1. 安裝 Spire.XLS 庫
首先,您需要在您的 C# 項目中安裝 Spire.XLS。最簡單的方式是通過 NuGet 包管理器:
- 打開 Visual Studio。
- 在“解決方案資源管理器”中,右鍵點擊您的項目,選擇“管理 NuGet 程序包”。
- 在“瀏覽”選項卡中搜索
Spire.XLS。 - 點擊“安裝”。
2. 準(zhǔn)備數(shù)據(jù)源
數(shù)據(jù)透視表需要一個結(jié)構(gòu)化的數(shù)據(jù)源。通常,這意味著您的數(shù)據(jù)應(yīng)該在一個連續(xù)的單元格區(qū)域中,并且第一行作為表頭(字段名稱)。
例如,我們準(zhǔn)備如下銷售數(shù)據(jù):
| 銷售員 | 產(chǎn)品 | 區(qū)域 | 銷售額 | 訂單日期 |
|---|---|---|---|---|
| 張三 | 筆記本 | 華東 | 5000 | 2023/1/1 |
| 李四 | 手機 | 華南 | 3000 | 2023/1/2 |
| 王五 | 筆記本 | 華北 | 6000 | 2023/1/3 |
| 張三 | 手機 | 華東 | 4500 | 2023/1/4 |
| 李四 | 平板 | 華南 | 2000 | 2023/1/5 |
| 王五 | 筆記本 | 華中 | 7000 | 2023/1/6 |
3. 代碼示例 1: 初始化工作簿與添加數(shù)據(jù)
以下代碼演示如何創(chuàng)建一個新的 Excel 工作簿,并填充上述銷售數(shù)據(jù)作為數(shù)據(jù)透視表的源數(shù)據(jù)。
using Spire.Xls;
using Spire.Xls.PivotTable;
using System;
namespace SpireXlsPivotTableDemo
{
class Program
{
static void Main(string[] args)
{
// 創(chuàng)建一個新的工作簿
Workbook workbook = new Workbook();
// 獲取第一個工作表
Worksheet sheet = workbook.Worksheets[0];
sheet.Name = "原始數(shù)據(jù)";
// 寫入表頭
sheet.Range["A1"].Value = "銷售員";
sheet.Range["B1"].Value = "產(chǎn)品";
sheet.Range["C1"].Value = "區(qū)域";
sheet.Range["D1"].Value = "銷售額";
sheet.Range["E1"].Value = "訂單日期";
// 寫入數(shù)據(jù)
string[,] data = new string[,]
{
{"張三", "筆記本", "華東", "5000", "2023/1/1"},
{"李四", "手機", "華南", "3000", "2023/1/2"},
{"王五", "筆記本", "華北", "6000", "2023/1/3"},
{"張三", "手機", "華東", "4500", "2023/1/4"},
{"李四", "平板", "華南", "2000", "2023/1/5"},
{"王五", "筆記本", "華中", "7000", "2023/1/6"},
{"張三", "平板", "華北", "3500", "2023/1/7"},
{"李四", "筆記本", "華東", "5500", "2023/1/8"},
{"王五", "手機", "華南", "4000", "2023/1/9"},
};
for (int i = 0; i < data.GetLength(0); i++)
{
for (int j = 0; j < data.GetLength(1); j++)
{
sheet.Range[i + 2, j + 1].Value = data[i, j];
}
}
// 調(diào)整列寬以適應(yīng)內(nèi)容
sheet.AutoFitColumn(1);
sheet.AutoFitColumn(2);
sheet.AutoFitColumn(3);
sheet.AutoFitColumn(4);
sheet.AutoFitColumn(5);
Console.WriteLine("原始數(shù)據(jù)已準(zhǔn)備完成。");
// 后續(xù)將在這里添加創(chuàng)建數(shù)據(jù)透視表的代碼
// ...
}
}
}
4. 代碼示例 2: 創(chuàng)建和配置數(shù)據(jù)透視表
接下來,我們將在同一個工作簿中創(chuàng)建一個新的工作表,并在其中創(chuàng)建并配置數(shù)據(jù)透視表。我們將以“銷售員”作為行字段,“產(chǎn)品”作為列字段,并匯總“銷售額”。
// ... (接上一個代碼示例)
// 定義數(shù)據(jù)源范圍
CellRange dataRange = sheet.Range["A1:E10"]; // 包含表頭和所有數(shù)據(jù)
// 添加一個新的工作表用于放置數(shù)據(jù)透視表
Worksheet pivotSheet = workbook.Worksheets.Add("銷售數(shù)據(jù)透視表");
// 創(chuàng)建一個數(shù)據(jù)透視緩存
// PivotCache cache = workbook.PivotCaches.Add(dataRange); // 也可以直接使用數(shù)據(jù)范圍創(chuàng)建
// 添加數(shù)據(jù)透視表到新的工作表,指定其顯示位置為 A1
// 第一個參數(shù)是透視表的名稱,第二個參數(shù)是透視表在目標(biāo)工作表中的起始位置
// 第三個參數(shù)是數(shù)據(jù)源范圍
PivotTable pt = pivotSheet.PivotTables.Add("銷售分析透視表", pivotSheet.Range["A1"], dataRange);
// 設(shè)置行字段
// 將“銷售員”字段添加到行區(qū)域
PivotField rowField = pt.PivotFields["銷售員"];
rowField.Axis = AxisTypes.Row;
// 啟用重復(fù)項目標(biāo)簽,使得每個銷售員的名稱都顯示
rowField.RepeatItemLabels = true;
// 啟用自動顯示,如果數(shù)據(jù)量大,可以自動顯示前N個或后N個
rowField.IsAutoShow = true;
// 設(shè)置列字段
// 將“產(chǎn)品”字段添加到列區(qū)域
PivotField columnField = pt.PivotFields["產(chǎn)品"];
columnField.Axis = AxisTypes.Column;
// 設(shè)置值字段 (數(shù)據(jù)區(qū)域)
// 將“銷售額”字段添加到數(shù)據(jù)區(qū)域,默認(rèn)聚合方式為求和
PivotField dataField = pt.PivotFields["銷售額"];
// 設(shè)置數(shù)據(jù)字段的聚合函數(shù)為求和
dataField.Subtotals = SubtotalTypes.Sum;
dataField.NumberFormat = "#,##0.00"; // 設(shè)置銷售額的數(shù)字格式
// 設(shè)置篩選器 (可選)
// 如果需要按區(qū)域篩選,可以添加篩選器字段
// PivotField filterField = pt.PivotFields["區(qū)域"];
// filterField.Axis = AxisTypes.Page; // Page表示篩選器區(qū)域
// 刷新數(shù)據(jù)透視表
pt.CalculateData();
// 自動調(diào)整透視表所在列的寬度,使其內(nèi)容完全顯示
pivotSheet.AutoFitColumns();
Console.WriteLine("數(shù)據(jù)透視表已創(chuàng)建并配置完成。");
// ... (保存文件代碼)
對字段設(shè)置的詳細(xì)解釋:
AxisTypes.Row: 將字段放置在數(shù)據(jù)透視表的行區(qū)域,用于展開行方向的數(shù)據(jù)。AxisTypes.Column: 將字段放置在數(shù)據(jù)透視表的列區(qū)域,用于展開列方向的數(shù)據(jù)。AxisTypes.Page: 將字段放置在數(shù)據(jù)透視表的篩選器區(qū)域(舊稱“頁字段”),允許用戶通過下拉列表篩選數(shù)據(jù)。SubtotalTypes.Sum: 設(shè)置值字段的聚合方式為求和。Spire.XLS 支持多種聚合函數(shù),如Count(計數(shù)),Average(平均值),Max(最大值),Min(最小值),Product(乘積),CountNums(數(shù)字計數(shù)) 等。NumberFormat: 用于設(shè)置值字段的數(shù)字顯示格式,例如貨幣、百分比、日期等。RepeatItemLabels = true: 使得行/列字段的每個項目標(biāo)簽都重復(fù)顯示,而不是只顯示一次。這在某些報告場景下有助于清晰度。IsAutoShow = true: 啟用自動顯示功能,對于行/列字段,可以自動顯示前 N 個或后 N 個項目,這在數(shù)據(jù)量大時很有用。
5. 代碼示例 3: 保存 Excel 文件
最后一步是將包含原始數(shù)據(jù)和數(shù)據(jù)透視表的 Excel 文件保存到指定路徑。
// ... (接上一個代碼示例)
// 保存工作簿到文件
string outputPath = "DataPivotTableDemo.xlsx";
workbook.SaveToFile(outputPath, ExcelVersion.Version2016); // 可以指定保存為不同版本的Excel文件
Console.WriteLine($"Excel 文件已保存到: {System.IO.Path.GetFullPath(outputPath)}");
Console.WriteLine("按任意鍵退出...");
Console.ReadKey();
}
}
}
進(jìn)階應(yīng)用與常見問題
進(jìn)階技巧
- 刷新數(shù)據(jù)透視表: 當(dāng)源數(shù)據(jù)發(fā)生變化時,需要刷新數(shù)據(jù)透視表以反映最新數(shù)據(jù)??梢酝ㄟ^
pt.CalculateData()方法實現(xiàn)。 - 設(shè)置透視表樣式: Spire.XLS 提供了豐富的 API 來設(shè)置數(shù)據(jù)透視表的樣式,例如
pt.BuiltInStyle可以應(yīng)用內(nèi)置樣式,或者自定義邊框、字體、背景色等。 - 處理多個數(shù)據(jù)源: 雖然 Spire.XLS 主要支持單個連續(xù)區(qū)域作為數(shù)據(jù)源,但對于更復(fù)雜的多數(shù)據(jù)源場景,您可能需要先將數(shù)據(jù)合并到一個工作表,或者考慮使用更高級的數(shù)據(jù)模型功能(如果 Spire.XLS 支持)。
- 創(chuàng)建數(shù)據(jù)透視圖: 可以基于數(shù)據(jù)透視表創(chuàng)建動態(tài)的數(shù)據(jù)透視圖,從而更直觀地展示分析結(jié)果。Spire.XLS 也提供了相應(yīng)的 API:
// get the first pivot table in the worksheet IPivotTable pivotTable = pivotSheet.PivotTables[0]; //create a clustered column chart based on the pivot table Chart chart = pivotSheet.Charts.Add(ExcelChartType.ColumnClustered, pivotTable); chart.TopRow = 12; chart.LeftColumn = 1; chart.RightColumn = 8; chart.BottomRow = 30; chart.ChartTitle = "產(chǎn)品銷售分析"; chart.PrimaryCategoryAxis.MultiLevelLable = true;
- 禁用數(shù)據(jù)透視表功能區(qū): 在某些特定場景下,您可能希望限制用戶對數(shù)據(jù)透視表的修改,可以通過禁用其功能區(qū):
// Get the first pivot table from the sheet XlsPivotTable pt = pivotSheet.PivotTables[0] as XlsPivotTable; //Disable ribbon for this pivot table pt.EnableWizard = false;
注意事項
- 數(shù)據(jù)源格式: 確保數(shù)據(jù)源的第一行是有效的字段名稱,且數(shù)據(jù)區(qū)域是連續(xù)的,沒有空行或空列。
- 字段名稱匹配: 在設(shè)置
PivotFields時,請確保使用的字段名稱與數(shù)據(jù)源中的表頭完全匹配(區(qū)分大小寫)。 - 性能優(yōu)化: 對于超大數(shù)據(jù)集,考慮分批處理或優(yōu)化數(shù)據(jù)加載方式。Spire.XLS 在性能方面表現(xiàn)優(yōu)秀,但合理的代碼結(jié)構(gòu)仍然重要。
- 許可證: Spire.XLS 是商業(yè)組件,在試用版中可能會有水印或功能限制。在生產(chǎn)環(huán)境中使用需要購買相應(yīng)的許可證。
以上就是C#使用Spire.XLS在Excel中創(chuàng)建數(shù)據(jù)透視表的詳細(xì)內(nèi)容,更多關(guān)于C# Excel創(chuàng)建數(shù)據(jù)透視表的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#使用動態(tài)規(guī)劃解決0-1背包問題實例分析
這篇文章主要介紹了C#使用動態(tài)規(guī)劃解決0-1背包問題,實例分析了C#動態(tài)規(guī)劃算法的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-04-04
C#實現(xiàn)將javascript文件編譯成dll文件的方法
這篇文章主要介紹了C#實現(xiàn)將javascript文件編譯成dll文件的方法,涉及C#編譯生成dll動態(tài)鏈接庫文件的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11
C# WinForm狀態(tài)欄實時顯示當(dāng)前時間(窗體狀態(tài)欄StatusStrip示例)
這篇文章主要介紹了C# WinForm狀態(tài)欄實時顯示當(dāng)前時間(窗體狀態(tài)欄StatusStrip示例),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
C# VTK 移動旋轉(zhuǎn)交互功能實現(xiàn)
對vtk場景中一個或多個選中物體進(jìn)行移動旋轉(zhuǎn),今天通過本文給大家分享C# VTK 移動旋轉(zhuǎn)交互功能實現(xiàn),感興趣的朋友跟隨小編一起看看吧2024-06-06

