Java在Excel中进行数据分析

news2024/9/22 13:34:21

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

前一段时间淘宝出了一个“淘宝人生”的模块,可以看从注册淘宝账号至今的消费记录,仔细想了想,现在微信、淘宝这些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中实现数据透视表,您可以根据您项目或工程的需要选择合适的方法。

扩展链接:

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/739953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

k8s实战3-使用Helm在AKS上发布应用

AKS(Azure Kubenetes Service)是微软云azure上的K8s服务。 主要分为三步 1 连接到AKS 2 用kubectl发布应用 3 用Helm发布应用 1 登录 az login 2 连接dp-npr-dsm-aks(Dsm项目的AKS) az account set --subscription {{subID}} az aks get-credent…

指针的进阶(一)

目录 1. 字符指针 方法一 方法二 字符指针面试题 2. 指针数组 3. 数组指针 3.1 数组指针的定义 3.2 &数组名VS数组名 3.3 数组指针的使用 4. 数组传参和指针传参 4.1 一维数组传参 4.2 二维数组传参 4.3 一级指针传参 4.4 二级指针传参 5. 函数指针 代码一 代…

Windows用户怎么取消访问共享文件夹的密码

许多Windows系统用户在访问共享文件夹的时候却提示需要输入密码才可访问。这一步给很多人造成了困扰,其实我们可以取消访问共享文件夹密码。请看下面的两个方法。 方法一: 搜索 网络和共享中心。点击 更改高级共享设置。在最底下密码保护的共享那项&…

用C#写汉诺塔问题

假设要将n个圆盘从A->C,中间可以借助B,那么递归思路是这样的,我们先将除最大的一个圆盘外的其它n-1个圆盘从A->B,借助C,然后将最大的一个圆盘搬到C,最后将刚才的n-1个盘子,从B->C借助A&#xff0c…

Qt完成闹钟提示

未启动: 启动: .cpp #include "widget.h" #include "ui_widget.h"void Widget::btn1_slots() {//点击启动开始定时event_timer this->startTimer(1000);btn1->setEnabled(false);btn2->setEnabled(true);edit2->setEnabled(false…

一个月学通Python(十三):高级Python必须掌握的进阶知识点

专栏介绍 结合自身经验和内部资料总结的Python教程,每天3章,1个月就能全方位的完成Python的学习并进行实战开发。加油吧!卷起来! 全部文章请访问专栏:《Python全栈教程(0基础》 文章目录 专栏介绍Python语言进阶1. 数据结构和算法2. 函数的使用方式3. 面向对象相关知识…

Todo-List案例版本五

安装库npm i pubsub-js 消息的订阅与发布 src/App.vue <template><div class"app"><h1>{{ msg }}</h1><School/><Student/></div> </template><script> import Student from ./components/Student import …

微信小程序常用组件的简单使用 view,scroll-view,swiper,swiper-item,text,rich-text,button,image

微信小程序常用组件的简单使用 1. view组件2. scroll-view 组件3. swiper 和 swiper-item 组件3.1. swiper组件中的常用属性 4. text 和 rich-text组件4.1. text组件4.2. rich-text 组件 5. button 组件6. image组件6.1. image的mode属性 1. view组件 view组件就类似于html中的…

问题总结(持续更新,欢迎补充)

文章目录 前言webshell流量特征内存马蜜罐应急响应Windows 事件ID如何是误报还是攻击&#xff08;如何判断是否攻击成功&#xff09;研判的思路渗透测试思路内网渗透相关溯源反制反序列化&#xff08;Shiro、Weblogic、Log4j&#xff09;CDNMySQL5.5版本以上和以下读写权限的区…

linux 系统errno 对应参考及代码

结论 linux下系统errno都有对应的说明描述&#xff0c;发生错误时获取errno即可知道具体问题描述 如下图 代码如下 golang版 package main import ("syscall""strings""fmt" ) func main() {for i : 0; i < 200; i {if !strings.HasPrefi…

【开源项目】自动化运维平台spug

Spug 基本介绍 Spug是面向中小型企业设计的轻量级无Agent的自动化运维平台&#xff0c;整合了主机管理、主机批量执行、主机在线终端、应用发布部署、在线任务计划、配置中心、监控、报警等一系列功能。 批量执行: 主机命令在线批量执行在线终端: 主机支持浏览器在线终端登录…

为什么技术牛逼的人,不能直接提为项目经理?

早上好&#xff0c;我是老原。 很多来私信我职业规划的小友&#xff0c;有很大一部分都是从事了大几年&#xff0c;10年的技术开发大佬…… 到这个层级的大佬&#xff0c;他们最大的困惑是&#xff1a;到我这个年纪/级别还有必要转管理吗&#xff1f; 是否有必要&#xff0c…

X6 基于VUE流程编辑器开发

先看效果图 主要插件X6 x6-vue-shape antv/x6-plugin-dnd 代码太多没有整理出来

个人云服务器搭建MQTT服务器

个人云服务器搭建MQTT服务器 文章目录 个人云服务器搭建MQTT服务器1️⃣ 前言2️⃣ EMQX部署 1️⃣ 前言 MQTT &#x1f449;MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;即消息队列遥测传输协议 • 是一个轻量的发布订阅模式消息传输协议&#xff0c;专门…

leetcode140. 单词拆分 II 记忆化DFS

https://leetcode.cn/problems/word-break-ii 给定一个字符串 s 和一个字符串字典 wordDict &#xff0c;在字符串 s 中增加空格来构建一个句子&#xff0c;使得句子中所有的单词都在词典中。以任意顺序 返回所有这些可能的句子。 注意&#xff1a;词典中的同一个单词可能在分…

趣谈拜占庭将军问题

拜占庭将军问题&#xff08;The Byzantine Generals Problem&#xff09;&#xff0c;它其实是借拜占庭将军的故事展现了分布式共识问题&#xff0c;还探讨和论证了解决的办法。而大多数人觉得它难理解&#xff0c;除了因为分布式共识问题比较复杂之外&#xff0c;还与莱斯利兰…

【C++ OJ练习】6.验证回文串

1.题目链接 力扣 2.解题思路 字母全部要变成小写 并且不能管空格和标点 这样从前和后分别遍历并进行比较 如果遇到不是相同 字符的话 说明不是回文串 就这样一直往下走 直到最后两下标相遇 那么就是回文串 注意双循环条件 3.代码 class Solution { public://除去标点和空…

【如何在深度学习的道路上越走越远?——《深度学习模式与实践》】

作为近几年人工智能领域的主要研究方向之一&#xff0c;深度学习主要通过构建深度卷积神经网络和采用大量样本数据作为输入&#xff0c;最终得到一个具有强大分析能力和识别能力的模型。深度学习可以是有监督的、半监督的或无监督的。深度学习架构(例如深度神经网络、深度信念网…

Docker查看相关存储信息以及扩容

Docker查看相关存储信息以及扩容 &#xff08;mac环境&#xff09; 查看docker基本信息&#xff1a; docker info可以看到docker的存储位置在这里 2. 查看mac的所有盘以及分区大小情况 diskutil listdocker查看网络信息&#xff1a; docker ps # 查看所有在运行的container信…

Zabbix——监控模板

方法二&#xff1a;自定义监控模板 案例&#xff1a;自定义监控客户端服务器登录的人数 需求&#xff1a;监控客户端的登录人数&#xff0c;超过 3 个就发出报警信息 1&#xff09;在客户端创建自定义 key #在客户端创建自定义 key1.明确需要执行的 linux 命令who | wc -l​…