乐趣区

关于后端:如何使用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(因为残缺代码太长,只截取了局部):

想要残缺代码的童鞋能够从 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 数据透视表实现损益表利用

退出移动版