POI导出excel,按照父子节点进行分级显示

这个功能有两部分:

  • 第一部分:生成excel并导出
  • 第二部分:给生成的excel按照父子节点分级显示。

第一部分很简单,直接略过。
参考文献:
https://www.cnblogs.com/mingyue1818/p/4828895.html
第二部分需要按照某一列(单位级数)进行分级,并折叠起来
思路:观察数据可以发现已经排好序并且有7级。
1、遍历找到最大级数。maxLevel = 7
2、先处理最大一级,也就是第7级.。
先折叠叶子节点,折叠后将dataset中的值替换为null
3、去掉当前的叶子节点,则上级成为了叶子节点,折叠上级;以此类推全部折叠。

如上图,先折叠第7级

在折叠第6级

代码如下

public class ExcelExportUtil {public static void exportManySheetExcel(String file, List<ExcelExp> mysheets) {HSSFWorkbook wb = new HSSFWorkbook();// 创建工作薄List<ExcelExp> sheets = mysheets;// 表头样式HSSFCellStyle style = wb.createCellStyle();style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式// 字体样式HSSFFont fontStyle = wb.createFont();fontStyle.setFontName("微软雅黑");fontStyle.setFontHeightInPoints((short) 12);fontStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);style.setFont(fontStyle);for (ExcelExp excel : sheets) {// 新建一个sheetHSSFSheet sheet = wb.createSheet(excel.getFileName());// 获取该sheet名称String[] handers = excel.getHanders();// 获取sheet的标题名HSSFRow rowFirst = sheet.createRow(0);// 第一个sheet的第一行为标题// 写标题for (short i = 0; i < handers.length; i++) {// 获取第一行的每个单元格HSSFCell cell = rowFirst.createCell(i);// 往单元格里写数据cell.setCellValue(handers[i]);cell.setCellStyle(style); // 加样式sheet.setColumnWidth(i, (short) 6000); // 设置每列的列宽}// 写数据集List<String[]> dataset = excel.getDataset();maxJs = 0;for (int i = 0; i < dataset.size(); i++) {String[] data = dataset.get(i);// 获取该对象// 创建数据行HSSFRow row = sheet.createRow(i + 1);for (short j = 0; j < data.length; j++) {// 设置对应单元格的值row.createCell(j).setCellValue(data[j]);}if (StringUtils.isNotEmpty(data[2])) {getMaxJs(Integer.valueOf(data[2]));}}if (maxJs > 0) {groupNonDetailLevel(dataset, sheet);}}// 写文件try {FileOutputStream out = new FileOutputStream(new File(file));out.flush();wb.write(out);out.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}static int maxJs = 0;/*** * @Description: 获取最大级数* @author fhy* @date 2022年6月22日*/public static int getMaxJs(int dwJs) {if (dwJs > maxJs) {maxJs = dwJs;}return maxJs;}/*** * @Description: 按照级数从大到小遍历* @author fhy* @date 2022年6月22日*/public static void groupNonDetailLevel(List<String[]> dataset,HSSFSheet sheet) {for (int j = maxJs; j > 1; j--) {groupDetailLevel(dataset,sheet,j);}}/*** * @Description: 明细级分级展示。先折叠叶子节点,折叠后将dataset中的值替换为null* (去掉当前的叶子节点,则上级成为了叶子节点,折叠上级;以此类推全部折叠)* @author fhy* @date 2022年6月22日*/public static void groupDetailLevel(List<String[]> dataset, HSSFSheet sheet,int level) {String dwJs = "";int startRow, endRow;List<Integer> fromRowToRow = new ArrayList<Integer>();for (int i = 0; i < dataset.size(); i++) {String[] data = dataset.get(i);// 获取该对象if (null == data) {continue;}dwJs = data[2];if (level == Integer.valueOf(dwJs)) {//获取到叶子节点所在下标,放入listfromRowToRow.add(i);//置空dataset.set(i, null);} else {if (CollectionUtils.isNotEmpty(fromRowToRow)) {//从list中取出第一个和最后一个叶子节点的下标作为开始分组和结束分组的下标startRow = fromRowToRow.get(0);endRow = fromRowToRow.get(fromRowToRow.size() - 1);sheet.groupRow(startRow + 1, endRow + 1);//分组sheet.setRowGroupCollapsed(startRow + 1, true);//折叠fromRowToRow.clear();}}}if (CollectionUtils.isNotEmpty(fromRowToRow)) {startRow = fromRowToRow.get(0);endRow = fromRowToRow.get(fromRowToRow.size() - 1);sheet.groupRow(startRow + 1, endRow + 1);sheet.setRowGroupCollapsed(startRow + 1, true);fromRowToRow.clear();}}
}

POI导出excel,按照父子节点进行分级显示相关推荐

  1. POI 导出excel带小数点的数字格式显示不对解决方法

    POI 导出excel带小数点的数字格式显示不对解决方法 参考文章: (1)POI 导出excel带小数点的数字格式显示不对解决方法 (2)https://www.cnblogs.com/firstd ...

  2. cpu java poi 导出_java基于poi导出excel透视表代码实例

    这篇文章主要介绍了java基于poi导出excel透视表代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 从前,我是一个前端程序猿,怀着对打通 ...

  3. @excel注解_java bean 一对多,多对一 poi导出excel表格

    最近造了个poi导出 excel轮子 特点 java bean 一对多.多对一关系合并单元行 支持图片导出 Bean 一对多关系合并行 代码 public class User { @Excel(na ...

  4. Java POI 导出EXCEL经典实现 Java导出Excel

    转自http://blog.csdn.net/evangel_z/article/details/7332535 在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者 ...

  5. SpringMVC+Hibernate +MySql+ EasyUI实现POI导出Excel(二)

    为什么80%的码农都做不了架构师?>>> SpringMVC+Hibernate +MySql+ EasyUI实现CRUD(一) 大概的截图.很简单的小功能 注:使用的是MyEcli ...

  6. springboot中使用poi导出excel文件(亲测实现了第一个功能)

    1.POI简介 Jakarta POI 是一套用于访问微软格式文档的Java API. 组件HWPF用于操作Word的; 组件HSSF用于操作Excel格式文件. 2.常用组件 HSSFWorkboo ...

  7. java poi 导出excel 数字有问题

    在用poi导出excel时 导出的数字为文本格式(左上角有绿色三角) 原因: cell.setCellType(Cell.CELL_TYPE_NUMERIC); cell.setCellValue( ...

  8. java excel 导出图片_JAVA 使用 POI 导出 EXCEL 自定义背景颜色

    开发中常用表格导入和导出 Excel 是常见的功能. 在这里分享下使用 POI 导出表格的简单实现,也是为大家提供个思路吧,抛砖引玉,话不多说直接上代码. 1.项目引入 maven 依赖 <!- ...

  9. POI导出EXCEL设置高度和宽度

    -------------------------------------------------------------------------------SSFRow hssfRow = shee ...

最新文章

  1. Q币才是腾讯真正的世界级产品
  2. Linux和unix中 awk 的print浅谈
  3. STL 里 resize 和 reserve 的区别
  4. Flutter瀑布流及通用列表解决方案
  5. Msc系统上的eclipse遇到乱码问题解决方式
  6. windows下使用nginx调试简介
  7. oledb excel java_C#中Excel 2016的oledb连接字符串
  8. Redis原理及拓展
  9. android发送点击事件,Android 模拟发送事件
  10. 如何快速查找下载java项目所需jar包
  11. animition动画的加入
  12. 【代码备份】ORACLE数据库表同步DBLINK
  13. java代码生成UUID以及在线UUID生成器
  14. ps之选区抠图,发丝
  15. 云炬随笔集(2016.7~2022.1)
  16. 基因结构图的0_肿瘤基因突变Biomarkers的药物研究神器—OncoKB数据库
  17. 在数据库中使用关键字作为字段名
  18. 利用CSS制作通栏,css6——通栏平均分布
  19. SQL实战(51到60题)
  20. 关于拖延症的一些小思考

热门文章

  1. 开关电源变换器稳态原理分析(电感伏秒平衡及电容电荷平衡)
  2. html多张图片合在一块,多张照片怎么拼在一起?10张以上多图拼图方法 超简单! (全文)...
  3. Elk实时日志分析平台搭建
  4. [收藏]家用三线插座(220V单相)正确接线方法
  5. Java Email 发HTML邮件工具 采用 freemarker模板引擎渲染
  6. 2018秦皇岛ccpc赛后总结
  7. 涨姿势!摹客切图小技巧
  8. 因融资失败倒闭 五分钟倒在黎明前五分钟
  9. 阿里云服务器是如何计费的?包年包月与按量付费有什么区别?
  10. Minecraft 从入门到入坑(边玩游戏边学编程)