首页 > 编程语言 >如何使用Java在Excel中实现一个数据透视表

如何使用Java在Excel中实现一个数据透视表

时间:2023-07-11 09:02:36浏览次数:39  
标签:getRange Java worksheet Excel setValue 透视 axis

摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。

前一段时间淘宝出了一个“淘宝人生”的模块,可以看从注册淘宝账号至今的消费记录,仔细想了想,现在微信、淘宝这些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(由于完整代码太长,只截取了部分):

想要完整代码的童鞋可以从GiteeGithub中下载:

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中实现数据透视表,您可以根据您项目或工程的需要选择合适的方法。

扩展链接:

怎样让您的系统也有“数据透视表”功能

数据透视表上线!如何在纯前端实现这个强大的数据分析功能

纯前端Excel数据透视表实现损益表应用

标签:getRange,Java,worksheet,Excel,setValue,透视,axis
From: https://www.cnblogs.com/powertoolsteam/p/17540206.html

相关文章

  • Java 亿级项目架构设计与落地应用(24周)
    目录:阶段一:程序员的成长目标与方向阶段二:架构师必备基本功-需求分析阶段三:高层架构设计-从无到有描绘系统蓝图阶段四:系统架构设计-概要设计阶段五:系统架构设计-详细架构设计,走向真正落地阶段六:DDD领域驱动架构设计-复杂业务应对之道阶段七:亿级电商订单系统-架构设......
  • 编程语言比拼之Java VS C++
    学Java还是C++?Java和C++都是非常受欢迎的编程语言,各有各的优势和适用场景。以下是对它们的简要比较:性能:C++通常被认为是一种更高效的编程语言,适用于对性能要求较高的应用程序,如游戏开发、嵌入式系统和高频交易等。C++具有更接近底层的控制能力,允许开发人员直接管理内存和硬件资源,以......
  • 细节决定成败:探究Mybatis中javaType和ofType的区别
    一.背景描述今天给学生讲解了Mybatis框架,学习了基础的ORM框架操作及多对一的查询。在练习的时候,小张同学突然举手求助,说在做预习作业使用一对多查询时,遇到了ReflectionException 异常 。二.情景再现1.实体类为了给大家讲清楚这个异常的产生原因,壹哥先列出今天案例中涉及到的两......
  • Java 包、访问修饰符
    Java包、访问修饰符1.包包可以理解为创建不同的目录来分别存放类,类似计算机当中文件夹通过包可以让相同的类在不同的目录下使用,防止重名的问题通过包可以很好的管理我们编写的类通过包可以控制访问范围使用idea工具创建包通过”.“可以创建子目录的包在同一目录下......
  • Java语言基础知识全总结
    一.Java的优点1.      跨平台性。一次编译,到处运行。Java编译器会将Java代码编译成能在JVM上直接运行的字节码文件,C++会将源代码编译成可执行的二进制代码文件,所以C++执行速度快2.      纯面向对象。Java所有的代码都必须在类中书写。C++兼具面向对象和面向过程的特......
  • java学习
    spring:1前端参数如果放在请求体,且是post请求,后端需加上@ResquestBody才能接受。后端@RequestBody注解对应的类在将HTTP的输入流(含请求体)装配到目标类(即:@RequestBody后面的类)时,会根据json字符串中的key来匹配对应实体类的属性,如果匹配一致且json中的该key对应的值符合(或可......
  • 阿里p7闭关三月:整理出了这份java秋招面试必备指南
    从去年互联网寒冬的裁员潮,到今年受疫情影响的春招消失,金三银四变成铜三铁四,不过有一些朋友还是拿到了自己心怡的offer,有一些朋友还在为面试发愁,今天给大家分享一个阿里大佬闭关三个月的整理出的java秋招面试必备指南。大厂的面试从来不会是固定的,特别是像阿里这种一线互联网公司,想......
  • Java-Day-30( 多用户即时通信系统 —— 登录 + 获取在线用户列表 )
    Java-Day-30多用户即时通信系统需求分析用户登录拉取在线用户列表无异常退出私聊群聊发文件服务器推送新闻用户登录功能说明我们暂时人为规定用户名/id=100,密码123456就可以登录,其他用户不能登录后面使用HashMap模拟数据库,可以多个用户登录思路......
  • Java-Day-31( 多用户即时通信系统 —— 无异常退出 + 私聊 + 群发 )
    Java-Day-31多用户即时通信系统无异常退出问题指出:客户端输入9退出的是输出在控制台的主线程,退出的是主菜单,并没有真正的退出因为客户端启动后,相当于是开启了一个进程,在这个进程中启动了一个主线程(main线程),在main主线程中又启动了一个客户端的线程(ClientConn......
  • Java-第一天(初始java)
    在正式学习Java之前,我们可以简单了解下Java进程......也可忽略喔一、Java发展历史Java是世界上使用最广泛的编程语言之一。Java最初由SunMicrosystems在1990年代开发,用于开发从Web应用程序到移动应用程序到批处理应用程序的所有内容。Java最初是一种纯粹的面向对象的语言,但现在......