Java創(chuàng)建Excel數(shù)據(jù)透視表(Pivot?Table)的完整實(shí)戰(zhàn)教程
在日常的數(shù)據(jù)分析開發(fā)中,我們經(jīng)常需要對大量原始數(shù)據(jù)進(jìn)行匯總、分類和統(tǒng)計(jì)。相比手動操作 Excel,使用代碼自動生成數(shù)據(jù)透視表(Pivot Table)不僅效率更高,還能很好地融入后端系統(tǒng)或數(shù)據(jù)處理流程。本文將介紹如何在 Java 中創(chuàng)建 Excel 數(shù)據(jù)透視表,并給出一個(gè)實(shí)用示例。
為什么使用代碼創(chuàng)建數(shù)據(jù)透視表
在實(shí)際項(xiàng)目中,數(shù)據(jù)通常來源于數(shù)據(jù)庫或接口。如果每次都手動打開 Excel 再創(chuàng)建透視表,不僅耗時(shí),還容易出錯(cuò)。通過 Java 自動生成數(shù)據(jù)透視表,可以實(shí)現(xiàn):
- 自動化報(bào)表生成
- 提高數(shù)據(jù)處理效率
- 保證結(jié)果一致性
- 便于集成到現(xiàn)有系統(tǒng)
準(zhǔn)備工作
本文示例基于 Spire.XLS for Java 實(shí)現(xiàn)。它提供了對 Excel 文件的完整操作能力,包括創(chuàng)建工作簿、編輯數(shù)據(jù)、生成圖表以及數(shù)據(jù)透視表等功能。
你可以通過 Maven 引入依賴:
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.xls</artifactId>
<version>13.8.0</version>
</dependency>示例:創(chuàng)建數(shù)據(jù)透視表
下面通過一個(gè)簡單示例,演示如何從已有數(shù)據(jù)創(chuàng)建數(shù)據(jù)透視表。
1. 準(zhǔn)備數(shù)據(jù)
假設(shè)我們有如下結(jié)構(gòu)的數(shù)據(jù):
| Region | Product | Sales |
|---|---|---|
| East | A | 100 |
| West | B | 200 |
| East | B | 150 |
| West | A | 120 |
2. Java 實(shí)現(xiàn)代碼
import com.spire.xls.*;
public class CreatePivotTable {
public static void main(String[] args) {
Workbook workbook = new Workbook();
Worksheet sheet = workbook.getWorksheets().get(0);
// 寫入數(shù)據(jù)
sheet.getCellRange("A1").setText("Region");
sheet.getCellRange("B1").setText("Product");
sheet.getCellRange("C1").setText("Sales");
Object[][] data = {
{"East", "A", 100}, {"West", "B", 200},
{"East", "B", 150}, {"West", "A", 120}
};
for (int i = 0; i < data.length; i++) {
sheet.getCellRange(i + 2, 1).setText((String)data[i][0]);
sheet.getCellRange(i + 2, 2).setText((String)data[i][1]);
sheet.getCellRange(i + 2, 3).setNumberValue((Integer)data[i][2]);
}
// 創(chuàng)建透視表
Worksheet pivotSheet = workbook.getWorksheets().add("PivotTable");
CellRange dataRange = sheet.getCellRange("A1:C" + (data.length + 1));
PivotCache cache = workbook.getPivotCaches().add(dataRange);
PivotTable pivotTable = pivotSheet.getPivotTables().add(
"PivotTable", pivotSheet.getCellRange("A3"), cache
);
// 設(shè)置字段
pivotTable.getPivotFields().get("Region").setAxis(AxisTypes.Row);
pivotTable.getPivotFields().get("Product").setAxis(AxisTypes.Column);
pivotTable.getDataFields().add(
pivotTable.getPivotFields().get("Sales"),
"Total Sales",
SubtotalTypes.Sum
);
workbook.saveToFile("SalesPivotTable.xlsx", ExcelVersion.Version2016);
System.out.println("完成!");
}
}
代碼說明
上述代碼主要分為幾個(gè)關(guān)鍵步驟:
- 創(chuàng)建并填充原始數(shù)據(jù)
- 定義數(shù)據(jù)區(qū)域作為透視表的數(shù)據(jù)源
- 創(chuàng)建 PivotCache(用于緩存數(shù)據(jù))
- 在新工作表中創(chuàng)建 PivotTable
- 配置行、列和數(shù)據(jù)字段
- 設(shè)置匯總方式(如 Sum)
理解這幾個(gè)步驟之后,你就可以根據(jù)實(shí)際業(yè)務(wù)自由調(diào)整透視表結(jié)構(gòu),比如增加篩選字段、修改統(tǒng)計(jì)方式(平均值、計(jì)數(shù)等)等。
運(yùn)行效果
程序運(yùn)行后,會生成一個(gè) Excel 文件,并在新工作表中創(chuàng)建數(shù)據(jù)透視表,實(shí)現(xiàn)按 Region 分組行、按 Product 分組列,并對 Sales 進(jìn)行匯總統(tǒng)計(jì)。
方法補(bǔ)充
1.Java 創(chuàng)建 Excel 數(shù)據(jù)透視表
Jar包準(zhǔn)備:需要Excel類庫工具?Free Spire.XLS for Java,作者使用的是免費(fèi)版??扇ス倬W(wǎng)下載Jar包后解壓,將解壓后lib文件夾下的Spire.Xls.jar手動導(dǎo)入到Java程序;或者通過Maven倉庫下載導(dǎo)入。
JAVA程序代碼如下
import com.spire.xls.*;
public class CreatePivotTable {
public static void main(String[] args) {
//加載Excel測試文檔
Workbook wb = new Workbook();
wb.loadFromFile("test.xlsx");
//獲取第一個(gè)的工作表
Worksheet sheet = wb.getWorksheets().get(0);
//為需要匯總和分析的數(shù)據(jù)創(chuàng)建緩存
CellRange dataRange = sheet.getCellRange("A1:D10");
PivotCache cache = wb.getPivotCaches().add(dataRange);
//使用緩存創(chuàng)建數(shù)據(jù)透視表,并指定透視表的名稱以及在工作表中的位置
PivotTable pt = sheet.getPivotTables().add("PivotTable",sheet.getCellRange("A12"),cache);
//添加行字段1
PivotField pf1 = null;
if (pt.getPivotFields().get("月份") instanceof PivotField){
pf1 = (PivotField) pt.getPivotFields().get("月份");
}
pf1.setAxis(AxisTypes.Row);
//添加行字段2
PivotField pf2 = null;
if (pt.getPivotFields().get("廠商") instanceof PivotField){
pf2 = (PivotField) pt.getPivotFields().get("廠商");
}
pf2.setAxis(AxisTypes.Row);
//設(shè)置行字段的標(biāo)題
pt.getOptions().setRowHeaderCaption("月份");
//添加列字段
PivotField pf3 = null;
if (pt.getPivotFields().get("產(chǎn)品") instanceof PivotField){
pf3 = (PivotField) pt.getPivotFields().get("產(chǎn)品");
}
pf3.setAxis(AxisTypes.Column);
//設(shè)置列字段標(biāo)題
pt.getOptions().setColumnHeaderCaption("產(chǎn)品");
//添加值字段
pt.getDataFields().add(pt.getPivotFields().get("總產(chǎn)量"),"求和項(xiàng):總產(chǎn)量",SubtotalTypes.Sum);
//設(shè)置透視表樣式
pt.setBuiltInStyle(PivotBuiltInStyles.PivotStyleDark12);
//保存文檔
wb.saveToFile("數(shù)據(jù)透視表.xlsx", ExcelVersion.Version2013);
wb.dispose();
}
}2. Java創(chuàng)建/刷新Excel透視表
創(chuàng)建透視表
import com.spire.xls.*;
public class CreatePivotTable {
public static void main(String[] args) {
//加載Excel測試文檔
Workbook wb = new Workbook();
wb.loadFromFile("test.xlsx");
//獲取第一個(gè)的工作表
Worksheet sheet = wb.getWorksheets().get(0);
//為需要匯總和分析的數(shù)據(jù)創(chuàng)建緩存
CellRange dataRange = sheet.getCellRange("A1:D10");
PivotCache cache = wb.getPivotCaches().add(dataRange);
//使用緩存創(chuàng)建數(shù)據(jù)透視表,并指定透視表的名稱以及在工作表中的位置
PivotTable pt = sheet.getPivotTables().add("PivotTable",sheet.getCellRange("A12"),cache);
//添加行字段1
PivotField pf1 = null;
if (pt.getPivotFields().get("月份") instanceof PivotField){
pf1 = (PivotField) pt.getPivotFields().get("月份");
}
pf1.setAxis(AxisTypes.Row);
//添加行字段2
PivotField pf2 = null;
if (pt.getPivotFields().get("廠商") instanceof PivotField){
pf2 = (PivotField) pt.getPivotFields().get("廠商");
}
pf2.setAxis(AxisTypes.Row);
//設(shè)置行字段的標(biāo)題
pt.getOptions().setRowHeaderCaption("月份");
//添加列字段
PivotField pf3 = null;
if (pt.getPivotFields().get("產(chǎn)品") instanceof PivotField){
pf3 = (PivotField) pt.getPivotFields().get("產(chǎn)品");
}
pf3.setAxis(AxisTypes.Column);
//設(shè)置列字段標(biāo)題
pt.getOptions().setColumnHeaderCaption("產(chǎn)品");
//添加值字段
pt.getDataFields().add(pt.getPivotFields().get("總產(chǎn)量"),"求和項(xiàng):總產(chǎn)量",SubtotalTypes.Sum);
//設(shè)置透視表樣式
pt.setBuiltInStyle(PivotBuiltInStyles.PivotStyleDark12);
//保存文檔
wb.saveToFile("數(shù)據(jù)透視表.xlsx", ExcelVersion.Version2013);
wb.dispose();
}
}刷新透視表
import com.spire.xls.*;
public class RefreshPivotTable {
public static void main(String[] args) {
//創(chuàng)建實(shí)例,加載Excel
Workbook wb = new Workbook();
wb.loadFromFile("數(shù)據(jù)透視表.xlsx");
//獲取第一個(gè)工作表
Worksheet sheet = wb.getWorksheets().get(0);
//更改透視表的數(shù)據(jù)源數(shù)據(jù)
sheet.getCellRange("C2:C4").setText("產(chǎn)品A");
sheet.getCellRange("C5:C7").setText("產(chǎn)品B");
sheet.getCellRange("C8:C10").setText("產(chǎn)品C");
//獲取透視表,刷新數(shù)據(jù)
PivotTable pivotTable = (PivotTable) sheet.getPivotTables().get(0);
pivotTable.getCache().isRefreshOnLoad();
//保存文檔
wb.saveToFile("刷新透視表.xlsx",FileFormat.Version2013);
}
}折疊、展開透視表中的行
import com.spire.xls.*;
import com.spire.xls.core.spreadsheet.pivottables.XlsPivotTable;
public class ExpandRows {
public static void main(String[] args) {
//加載包含透視表的Excel
Workbook wb = new Workbook();
wb.loadFromFile("數(shù)據(jù)透視表.xlsx");
//獲取數(shù)據(jù)透視表
XlsPivotTable pivotTable = (XlsPivotTable) wb.getWorksheets().get(0).getPivotTables().get(0);
//計(jì)算數(shù)據(jù)
pivotTable.calculateData();
//展開”月份”字段下“2”的詳細(xì)信息
PivotField field = (PivotField) pivotTable.getPivotFields().get("月份");
field.hideItemDetail("2",false);
//折疊”月份”字段下“3”的詳細(xì)信息
PivotField field1 = (PivotField) pivotTable.getPivotFields().get("月份");
field1.hideItemDetail("3",true);
//保存并打開文檔
wb.saveToFile("展開、折疊行.xlsx", ExcelVersion.Version2013);
wb.dispose();
}
}小結(jié)
通過 Java 自動創(chuàng)建數(shù)據(jù)透視表,可以顯著提升數(shù)據(jù)處理效率,尤其適用于報(bào)表系統(tǒng)或批量數(shù)據(jù)分析場景。整個(gè)過程的核心在于數(shù)據(jù)源的定義以及透視表字段的配置。
在實(shí)際項(xiàng)目中,你可以將這一流程與數(shù)據(jù)庫查詢、定時(shí)任務(wù)等結(jié)合,實(shí)現(xiàn)完全自動化的數(shù)據(jù)分析輸出。
到此這篇關(guān)于Java創(chuàng)建Excel數(shù)據(jù)透視表(Pivot Table)的完整實(shí)戰(zhàn)教程的文章就介紹到這了,更多相關(guān)Java創(chuàng)建Excel數(shù)據(jù)透視表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Echarts+SpringMvc顯示后臺實(shí)時(shí)數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了Echarts+SpringMvc顯示后臺實(shí)時(shí)數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
SpringBoot+MySQL實(shí)現(xiàn)讀寫分離的多種具體方案
在高并發(fā)和大數(shù)據(jù)量的場景下,數(shù)據(jù)庫成為了系統(tǒng)的瓶頸。為了提高數(shù)據(jù)庫的處理能力和性能,讀寫分離成為了一種常用的解決方案,本文將介紹在Spring?Boot項(xiàng)目中實(shí)現(xiàn)MySQL數(shù)據(jù)庫讀寫分離的多種具體方案,需要的朋友可以參考下2023-06-06
Java深入學(xué)習(xí)圖形用戶界面GUI之創(chuàng)建窗體
圖形編程中,窗口是一個(gè)重要的概念,窗口其實(shí)是一個(gè)矩形框,應(yīng)用程序可以使用其從而達(dá)到輸出結(jié)果和接受用戶輸入的效果,學(xué)習(xí)了GUI就讓我們用它來創(chuàng)建一個(gè)窗體2022-05-05
Spring Boot集成Druid出現(xiàn)異常報(bào)錯(cuò)的原因及解決
Druid 可以很好的監(jiān)控 DB 池連接和 SQL 的執(zhí)行情況,天生就是針對監(jiān)控而生的 DB 連接池。本文講述了Spring Boot集成Druid項(xiàng)目中discard long time none received connection異常的解決方法,出現(xiàn)此問題的同學(xué)可以參考下2021-05-05
Springboot中Controller和RestController的使用及區(qū)別
文章總結(jié)了Spring框架中@Controller和@RestController的區(qū)別,包括它們的用途、工作機(jī)制、使用場景以及底層原理,文章指出,@Controller用于傳統(tǒng)的SpringMVC應(yīng)用,返回視圖或數(shù)據(jù)(需@ResponseBody)2025-11-11
Java?ArrayList集合之解鎖數(shù)據(jù)存儲新姿勢
這篇文章主要介紹了Java?ArrayList集合之解鎖數(shù)據(jù)存儲新姿勢,ArrayList是一個(gè)動態(tài)數(shù)組,可以自動調(diào)整大小,并提供了豐富的操作方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03

