如何使用Java在Excel中实现一个数据透视表
摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。
前一段时间淘宝出了一个“淘宝人生”的模块,可以看从注册淘宝账号至今的消费记录,仔细想了想,现在微信、淘宝这些APP好像都喜欢出这种记录使用者的支付、消费情况的功能。不过这个显示消费记录的功能的确让人觉得方便很多。这样大家就可以随时随地的查看以前的消费记录,有时候需要查账,翻一翻手机就能看见钱都去哪里了,而且每一笔钱的流向都可以看得非常清楚。既然这个东西这么好用,那可不可以我也搞一个类似的分析工具,这样就可以用它来记录生活中的点点滴滴。由于本人的工作性质,对Excel比较熟悉,首先想到的就是可不可以用一个表格可视化工具来实现这个功能。
说干就干,先上网找了找了一些Excel中可视化工具的样式,看了看在Excel中比较流行就是图表(柱形图、条形图等)和数据透视图了。因为图表是平时用的比较多的工具,所以在好奇心的驱使下,百度了一下“如何用代码在表格中搞一个数据透视图”!
,浏览着看了看,发现有很多种语言都可以实现(Python、Java、JavaScript、.net等)。鉴于自己对Java语言比较熟悉,所以便继续百度“如何用Java在Excel中搞一个数据透视表”。发现可以使用Apache POI库来实现:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import java.io.FileOutputStream;
import java.io.IOException;
public class PivotTableExample {
public static void main(String[] args) throws IOException {
// 创建工作簿
Workbook workbook = new XSSFWorkbook();
// 创建工作表
Sheet sheet = workbook.createSheet("Data");
// 输入数据
Row headingRow = sheet.createRow(0);
headingRow.createCell(0).setCellValue("Category");
headingRow.createCell(1).setCellValue("Value");
Row dataRow1 = sheet.createRow(1);
dataRow1.createCell(0).setCellValue("A");
dataRow1.createCell(1).setCellValue(10);
Row dataRow2 = sheet.createRow(2);
dataRow2.createCell(0).setCellValue("B");
dataRow2.createCell(1).setCellValue(20);
Row dataRow3 = sheet.createRow(3);
dataRow3.createCell(0).setCellValue("A");
dataRow3.createCell(1).setCellValue(15);
// 创建数据透视表
XSSFPivotTable pivotTable = ((XSSFSheet) sheet).createPivotTable(new AreaReference("A1:B3", SpreadsheetVersion.EXCEL2007), new CellReference("D5"));
// 设置行标签
pivotTable.addRowLabel(0);
// 设置值字段
pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 1, "Sum of Value");
// 保存Excel文件
FileOutputStream fileOut = new FileOutputStream("pivotTable.xlsx");
workbook.write(fileOut);
fileOut.close();
System.*out*.println("数据透视表已创建并保存到文件!");
}
}
除了使用Apache POI库,还发现了一款商业软件GcExcel,由于不太不了解这个东西,所以简单的ChatGpt了一下GcExcel,


查完之后发现,和Apache POI库类似,GcExcel同样也是一个基于Java的表格操作库,于是怀着好奇的心态,又百度了一下“Java实现GcExcel数据透视表”。找到了一个GcExcel的学习指南,里面有一些源码和代码讲解,根据里面的入门教程自己写了一个小的实现数据透视表的Demo(由于完整代码太长,只截取了部分):
public class Main {
public static void main(String[] args){
Workbook workbook = new Workbook();
//创建一个WorkSheet的对象
IWorksheet worksheet = workbook.getWorksheets().get(0);
//-----------------------------设置数据值------------------------------
worksheet.getRange("B3:C7").setValue(new Object[][]{
{"ITEM", "AMOUNT"},
{"Income 1", 2500},
{"Income 2", 1000},
{"Income 3", 250},
{"Other", 250},
});
worksheet.getRange("B10:C23").setValue(new Object[][]{
{"ITEM", "AMOUNT"},
{"Rent/mortgage", 800},
{"Electric", 120},
{"Gas", 50},
{"Cell phone", 45},
{"Groceries", 500},
{"Car payment", 273},
{"Auto expenses", 120},
{"Student loans", 50},
{"Credit cards", 100},
{"Auto Insurance", 78},
{"Personal care", 50},
{"Entertainment", 100},
{"Miscellaneous", 50},
});
//合并单元格
worksheet.getRange("B2:C2").merge();
worksheet.getRange("B2").setValue("MONTHLY INCOME");
worksheet.getRange("B9:C9").merge();
worksheet.getRange("B9").setValue("MONTHLY EXPENSES");
worksheet.getRange("E2:G2").merge();
worksheet.getRange("E2").setValue("PERCENTAGE OF INCOME SPENT");
worksheet.getRange("E5:G5").merge();
worksheet.getRange("E5").setValue("SUMMARY");
worksheet.getRange("E3:F3").merge();
worksheet.getRange("E9").setValue("BALANCE");
worksheet.getRange("E6").setValue("Total Monthly Income");
worksheet.getRange("E7").setValue("Total Monthly Expenses");
//--------------------------------设置形状--------------------------------
IShape shape = worksheet.getShapes().addChart(ChartType.*ColumnClustered*, 339, 247, 316.5, 346);
shape.getChart().getChartArea().getFormat().getLine().setTransparency(1);
shape.getChart().getColumnGroups().get(0).setOverlap(0);
shape.getChart().getColumnGroups().get(0).setGapWidth(37);
IAxis category_axis = shape.getChart().getAxes().item(AxisType.*Category*);
category_axis.getFormat().getLine().getColor().setRGB(Color.*GetBlack*());
category_axis.getTickLabels().getFont().setSize(11);
category_axis.getTickLabels().getFont().getColor().setRGB(Color.*GetBlack*());
IAxis series_axis = shape.getChart().getAxes().item(AxisType.*Value*);
series_axis.getFormat().getLine().setWeight(1);
series_axis.getFormat().getLine().getColor().setRGB(Color.*GetBlack*());
series_axis.getTickLabels().setNumberFormat("\$\#\#\#0");
series_axis.getTickLabels().getFont().setSize(11);
series_axis.getTickLabels().getFont().getColor().setRGB(Color.*GetBlack*());
ISeries chartSeries = shape.getChart().getSeriesCollection().newSeries();
chartSeries.setFormula("=SERIES(\"Simple Budget\",{"Income\","Expenses\"},'Sheet1'!$G$6:$G$7,1)");
chartSeries.getPoints().get(0).getFormat().getFill().getColor().setRGB(Color.*FromArgb*(176, 21, 19));
chartSeries.getPoints().get(1).getFormat().getFill().getColor().setRGB(Color.*FromArgb*(234, 99, 18));
chartSeries.getDataLabels().getFont().setSize(11);
chartSeries.getDataLabels().getFont().getColor().setRGB(Color.*GetBlack*());
chartSeries.getDataLabels().setShowValue(true);
chartSeries.getDataLabels().setPosition(DataLabelPosition.*OutsideEnd*);
workbook.save("tutorial.xlsx");
}
}
最终的Excel样式:

通过以上的实验,使用Apache POI和GcExcel都可以在Excel中实现数据透视表,您可以根据您项目或工程的需要选择合适的方法。
扩展链接:
如何使用Java在Excel中实现一个数据透视表的更多相关文章
- 【技术分享:python 应用之一】如何使用 Python 对 Excel 做一份数据透视表
客户这边,其中有一张如同上图所示的数据汇总表,然而需求是,需要将这张表数据做一个数据透视表,最后通过数据透视表中的数据,填写至系统数据库.拿到需求,首先就想到肯定不能直接用设计器去操作 Excel,通 ...
- Excel宏录制、数据透视表、合并多个页签
前段时间做数据分析的时候,遇到很多报表文件需要处理,在此期间学习了很多Excel操作,特此做笔记回顾. Excel宏录制 打开开发者工具 打开Excel文件,选择”文件”-->“选项”--> ...
- EXCEL 2010学习笔记 —— 数据透视表
今天整理一下EXCEL2010 数据透视表的课程笔记,数据透视表可以对多组数据进行统计和整理,是一种基本的数据可视化工具. 记录6个方面的总结: 1.创建数据透视表 2.更改数据透视表的汇总方式 3. ...
- java程序转换excel中科学记数法的数据为date类型
今天出于某些原因从mongodb数据库中导出了一些数据,为了更直观的发送给其他人查阅,便使用mongoVUE的导出为excel功能. 但是导出后出现了一个问题,里边有一列存储时间的,存储的是lon ...
- 【Excle数据透视】如何创建一个数据透视表
数据透视表可以汇总.分析.浏览和提供工作表数据或外部数据源的汇总数据 创建方法一 通过”插入”创建,具体操作请看下图: 创建方法二 通过快捷键创建 使用[ALT+D+P]创建 首先按下alt键,然后依 ...
- pandas实现excel中的数据透视表和Vlookup函数功能
在孩子王实习中做的一个小工作,方便整理数据. 目前这几行代码是实现了一个数据透视表和匹配的功能,但是将做好的结果写入了不同的excel中, 如何实现将结果连续保存到同一个Excel的同一个工作表中?还 ...
- 【转】关于C#使用Excel的数据透视表的例子
收到消息,下星期又有导出 Excel 报表的代码要写.心想,不就是 OleDb 先 CREATE 表, 然后 INSERT 么?都是体力活啊...... 结果拿到纸张的报表,我就悲剧了.报表的结构,像 ...
- VSTO学习笔记(十四)Excel数据透视表与PowerPivot
原文:VSTO学习笔记(十四)Excel数据透视表与PowerPivot 近期公司内部在做一种通用查询报表,方便人力资源分析.统计数据.由于之前公司系统中有一个类似的查询使用Excel数据透视表完成的 ...
- C# 操作Excel数据透视表
一.概述 数据透视表(Pivot Table)是一种交互式的表,可以进行某些计算,如求和与计数等,可动态地改变透视表版面布置,也可以重新安排行号.列标和页字段.当改变版面布置时,数据透视表也会按照新的 ...
- ASP.NET实现类似Excel的数据透视表
代码: /Files/zhuqil/Pivot.zip 数据透视表提供的数据三维视图效果,在Microsoft Excel能创建数据透视表,但是,它并不会总是很方便使用Excel.您可能希望在Web应 ...
随机推荐
- Looper 源码分析
//可以看到我们的Looper是存放在线程独有的ThreadLocal进行隔离的 //也就是每个线程独有一份Looper static final ThreadLocal<Loope ...
- Kurator v0.3.0版本发布
摘要:2023年4月8日,Kurator正式发布v0.3.0版本. 本文分享自华为云社区<华为云 Kurator v0.3.0 版本发布!集群舰队助力分布式云统一管理>,作者:云容器大未来 ...
- 27-lazy loading(懒加载和预加载)
懒加载 document.getElementById('btn').onclick = function () { // 懒加载:当文件需要使用时才加载 import(/* webpackChunk ...
- 「学习笔记」重修 FHQ-treap
无旋 treap 的操作方式使得它天生支持维护序列.可持久化等特性. 无旋 treap 又称分裂合并 treap.它仅有两种核心操作,即为 分裂 与 合并.通过这两种操作,在很多情况下可以比旋转 tr ...
- Python-webdriver_manager的简单使用
前言: 提前祝大家五一快乐(*^▽^*) 我们在使用Selenium做UI自动化时都需要手动去下载各个浏览器版本的webdriver,有时我们可能还会遇到跨操作系统去进行测试. 以及有时因浏览器自动升 ...
- 【解决方法】Windows快捷键Win+G无法使用,提示需要新应用打开链接
环境: 系统版本:Windows 10 家庭中文版 问题描述: 描述:按下Win+G后弹出提示框,需要使用新应用以打开此 ms-gamingoverlay 链接 问题解释: 误将Xbox game b ...
- map和multimap
map相对于set区别,map具有键值和实值,所有元素根据键值自动排序,pair的第一个值被称为键值key,pair的第二个值被称为实值value.map也是以红黑树为底层实现机制,根据key进行排序 ...
- 2022-12-20:二狗买了一些小兵玩具,和大胖一起玩, 一共有n个小兵,这n个小兵拍成一列, 第i个小兵战斗力为hi,然后他们两个开始对小兵进行排列, 一共进行m次操作,二狗每次操作选择一个数k,
2022-12-20:二狗买了一些小兵玩具,和大胖一起玩, 一共有n个小兵,这n个小兵拍成一列, 第i个小兵战斗力为hi,然后他们两个开始对小兵进行排列, 一共进行m次操作,二狗每次操作选择一个数k, ...
- 2020-10-21:go中channel的send流程是什么?
福哥答案2020-10-21: ***[评论](https://user.qzone.qq.com/3182319461/blog/1603234689)
- 2021-04-10:给定两个可能有环也可能无环的单链表,头节点head1和head2。请实现一个函数,如果两个链表相交,请返回相交的 第一个节点。如果不相交,返回null。【要求】如果两个链表长度之和为N,时间复杂度请达到O(N),额外空间复杂度 请达到O(1)。
2021-04-10:给定两个可能有环也可能无环的单链表,头节点head1和head2.请实现一个函数,如果两个链表相交,请返回相交的 第一个节点.如果不相交,返回null.[要求]如果两个链表长度之 ...