Java在Excel中进行数据分析

java,excel,进行,数据分析 · 浏览次数 : 158

小编点评

## 葡萄城数据分析工具简介 本文章介绍了葡萄城开发工具中“数据透视表”的功能实现方式。通过对 Apache POI 和 GcExcel 等工具的比较,用户可以根据自身需求选择最适合的工具来实现数据透视功能。 **主要工具:** * **Apache POI:**是一款基于 Java 的表格操作库,可以用于构建各种图表和数据透视表。 * **GcExcel:**是一款基于 Java 的表格操作库,与 Apache POI 相似,但功能更丰富。 **工具比较:** | 特性 | Apache POI | GcExcel | |---|---|---| | 开发语言 | Java | Java | | 功能 | 简单易用 | 功能丰富 | | 代码复杂性 | 低 | 高 | | 生成的图表类型 | 多种 | 多种 | **实现步骤:** 1. 创建工作簿和工作表。 2. 在工作表中添加数据。 3. 选择工作表并设置形状。 4. 选择数据格式,例如字体、颜色等。 5. 创建图表,例如图表类型、坐标轴等。 6. 设置数据标签格式。 **示例代码:** 以下是使用 Apache POI 生成数据透视表的示例代码: ```python import openpyxl # 创建工作簿 workbook = openpyxl.Workbook() # 创建工作表 worksheet = workbook.active # 添加数据 worksheet["A1"] = "收入" worksheet["A2"] = "支出" # 设置形状 worksheet.shape = "A1:B2" # 设置图表类型 worksheet.charts_add_chart(chart_type="scatter", x_label="月份", y_label="金额") # 设置数据标签格式 worksheet["A3"] = "每月收入" worksheet["A4"] = "每月支出" # 导出工作簿 workbook.save("data_table.xlsx") ``` **总结:** 数据透视表是数据分析中非常重要的技术, Apache POI 和 GcExcel 都是常用的工具之一。根据用户的需求和工程需求,可以选择合适的方法来实现数据透视功能。

正文

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

前一段时间淘宝出了一个“淘宝人生”的模块,可以看从注册淘宝账号至今的消费记录,仔细想了想,现在微信、淘宝这些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数据透视表实现损益表应用

与Java在Excel中进行数据分析相似的内容:

Java在Excel中进行数据分析

摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:[葡萄城官网](https://www.grapecity.com.cn/),葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前一段时间淘宝出了一个“淘宝人生”的模块,可以看从注册淘宝账号至今的消费记录,仔细想了想,现在微

数据重整:用Java实现精准Excel数据排序的实用策略

摘要:本文由葡萄城技术团队原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 在数据处理或者数据分析的场景中,需要对已有的数据进行排序,在Excel中可以通过排序功能进行整理数据。而在Java中,则可以借助Excel表格插件对数据进行批量排序

在表格开发中,如何选择适合自己的处理工具?

引言 GcExcel和EasyExcel都是卓越的高性能Excel处理库。GcExcel是由葡萄城公司开发,可用于Java和.Net平台;而EasyExcel是阿里巴巴开发的基于Java的开源Excel处理库。 在本文中,我们将对GcExcel和EasyExcel进行比较,帮助读者在实际场景中做出明

高效数据管理:Java助力实现Excel数据验证

摘要:本文由葡萄城技术团队原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 在Java中,开发者可以使用一些开源的库(如Apache POI)来添加、修改和处理Excel中的数据:包括数字、文本、日期、列表等。每种数据验证类型都具有不同的参

Java批量操作Excel文件实践

摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:[葡萄城官网](https://www.grapecity.com.cn/),葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 # 前言 \| 问题背景 在操作Excel的场景中,通常会有一些针对Excel的批量操作,批量的

如何使用Java + React计算个人所得税?

**前言** 在报表数据处理中,Excel公式拥有强大而多样的功能,广泛应用于各个业务领域。无论是投资收益计算、财务报表编制还是保险收益估算,Excel公式都扮演着不可或缺的角色。传统的做法是直接依赖Excel来实现复杂的业务逻辑,并生成相应的Excel文件。因此只需在预设位置输入相应参数,Exce

炫酷转换:Java实现Excel转换为图片的方法

摘要:本文由葡萄城技术团队原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 在实际开发过程中,经常会有这样的需求:将Excel表格或特定区域转换为图片,以便在其他软件中使用。而在Java开发中,借助于报表插件可以轻松地将工作表、任意指定区域

Java与React轻松导出Excel/PDF数据

前言 在B/S架构中,服务端导出是一种高效的方式。它将导出的逻辑放在服务端,前端仅需发起请求即可。通过在服务端完成导出后,前端再下载文件完成整个导出过程。服务端导出具有许多优点,如数据安全、适用于大规模数据场景以及不受前端性能影响等。 本文将使用前端框架React和服务端框架Spring Boot搭

想让你的工作轻松高效吗?揭秘Java + React导出Excel/PDF的绝妙技巧!

**前言** 在B/S架构中,服务端导出是一种高效的方式。它将导出的逻辑放在服务端,前端仅需发起请求即可。通过在服务端完成导出后,前端再下载文件完成整个导出过程。服务端导出具有许多优点,如数据安全、适用于大规模数据场景以及不受前端性能影响等。 本文将使用前端框架React和服务端框架Spring B

爪哇,我初窥门径

2017年3月,我大二下学期了。 虽说一直在学习,持续在解决学习中遇到的问题,但迷茫依旧。 对着黑框编程,还是不知道Java在现实工作中是用来干什么的。 说实话,真的挺枯燥无趣的。 逐渐,我开始意识到,持续搞这些基础,是没有意义的。 我在网上看他们讨论的Java问题,很多我都看不懂是什么东西。 我要