ITBEAR科技资讯
网站首页 科技资讯 财经资讯 分享好友

如何使用几行代码在报表中实现一个数据透视表(Java版)

时间:2023-07-11 09:40:30来源:互联网编辑:茹茹

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

想要完整代码的童鞋可以从Gitee或Github中“葡萄城技术团队”主页内下载:

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

更多热门内容
网易云音乐“神光模式”车机端上线比亚迪DiLink 免费畅听38天
8月13日,广受用户好评的网易云音乐播放器皮肤“神光模式”正式上线车机端,大屏畅享Livehouse听歌体验。比亚迪作为首批支持该功能的合作车企,目前已在部分DiLink车型首发“神光模式”,更多车型将陆续支持该功能。“神光模式”将舞台级光影效果搬进座舱,通过智能光影

2025-08-14

阿里云助力集思科技升级电商直播数字人——AI革新电商零售,剑指万亿销售市场| 看见新力量NO.144
以技术迭代为推动力,AI正在加速行业渗透。在电商零售竞争最为激烈的直播领域,快消品、日用品等标准化商品采用AI数字人直播带货已不鲜见。然而,当向来注重品质与品牌调性的奢侈品行业试水AI数字人直播,技术创新究竟会转化为运营效率的突破,还是品牌价值的隐性损耗?

2025-08-14

多维度剖析2025年五大折叠手机品牌:一文搞懂折叠手机哪款好!
在2025年,折叠屏手机技术迎来了全面性的革新,市场竞争呈现出百花齐放的多元化态势。本文聚焦于三星、vivo、OPPO、荣耀、华为这五家品牌推出的折叠手机,从设计、性能、影像、系统等多个关键维度展开深入剖析,旨在为消费者在2025年选购折叠手机提供一份具有权威性和实

2025-08-14

2025AI消费电子大会10月深圳启幕!AI重新定义消费体验!
手机能看懂你的表情,眼镜能打通虚拟与现实,连家里的机器人都能猜透你的心思 —— 这不是科幻电影,而是 AI 正在消费电子领域创造的新可能。在 AI 技术深度渗透消费电子领域的当下,终端设备正从功能工具向智能伙伴加速演进。由AI消费电子观察与米塔之家联合主办的 202

2025-08-14

小马智行发布二季度财报,文远知行Robotaxi营收激增彰显行业潜力
8月12日,小马智行发布的二季度财报展现出强劲增长势头。其Robotaxi业务收入达1090万元,同比增幅高达157.8%,在公司总营收中占比提升至7.09%,毛利率稳定在 16.1%。这一数据印证了Robotaxi业务在商业化探索中取得的实质性进展,技术投入正逐步转化为市场回报。更早之前

2025-08-14

全球首个世界人形机器人运动会来啦!
你可能见过机器人跳舞、跑马拉松、踢足球……但你一定没有一次性见过26个不同项目的机器人比赛!全球首个世界人形机器人运动会来啦~作为世界人形机器人运动会【官方优质内容合作伙伴】,本次大赛直播、直播回放、官方视频都将在抖音抖音精选APP发布,为大家呈现科技感拉

2025-08-14

多领域专家齐聚ISC.AI 2025!解码安全智能体技术与应用创新
近日,ISC.AI 2025“安全智能体技术赋能与应用创新论坛”在北京顺利召开。论坛汇聚了网络安全领域的众多专家、企业代表及行业同仁,围绕网络安全智能体的实战应用、技术架构、行业落地及未来发展等关键议题展开深度分享,从攻防对抗、框架构建、合规风控到技术基建等多

2025-08-14

如何让直播冲出同质化?鲸红传媒借力索尼电影感直播解决方案,打造综艺感团播直播间
在短视频和直播平台高速发展的背景下,直播内容形态也不断升级迭代。从个人直播、带货直播,到如今更趋精细化与场景化的“团播”模式,整个行业正走向综艺化、多元化与专业化。在直播如今平台上,以舞台表演、多人互动、强氛围营造为特点的团播直播成为了当前具有潜力和

2025-08-14

蚂蚁国际携手ADIO,促进阿布扎比金融科技行业创新
近日,蚂蚁国际与阿布扎比投资办公室(ADIO)签署了一份合作备忘录(MoU),蚂蚁国际将为阿布扎比当地企业提供数字工具,以其技术专长推动阿布扎比金融科技行业的发展。同时,蚂蚁国际已获得阿联酋中央银行原则上批准其储值支付工具和零售支付服务及卡计划牌照(IPA)。阿布扎

2025-08-14

出生率低迷,婴童行业却逆势狂飙,BeBeBus如何做到反向增长?
根据2025年上半年婴童行业洞察报告显示,在出生率持续走低的背景下,中国婴童行业正走出一条“反向增长”的独特路径。尽管2025年上半年新生儿数量仍处低位,但婴童市场凭借精准的需求捕捉与产品创新,实现了全品类逆势增长,而社媒电商的蓬勃发展正是这一增长的核心引擎

2025-08-14