• java动态合并表格


    效果图:
    
    package com.ai.dsg.utils;
    
    import org.apache.poi.hssf.usermodel.*;
    import org.apache.poi.ss.usermodel.HorizontalAlignment;
    import org.apache.poi.ss.usermodel.VerticalAlignment;
    import org.apache.poi.ss.util.CellRangeAddress;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class DynamicExport {
    
        /**
         *
         * @param sheetName sheet名称
         * @param titles 表头数组 LinkedList(防止乱序)
         * @param keyList 表格数据填充时根据key获取数据 LinkedList(与表头对应)
         * @param list 表格填充需要的数据
         * @param needMergeColIndexList 需要进行合并的列索引
         * @return
         */
        public static HSSFWorkbook getDynamicExport(String sheetName,List titles,List keyList,
                                                    List> list,List needMergeColIndexList) {
            HSSFWorkbook workbook = new HSSFWorkbook();
            HSSFSheet sheet = workbook.createSheet(sheetName);
            HSSFCellStyle titelStyle = createTitleCellStyle(workbook);
            HSSFCellStyle dataStyle = createDataCellStyle(workbook);
            //设置表头
            HSSFRow row = sheet.createRow(0);
            for (int i = 0; i < titles.size(); i++) {
                HSSFCell cell = row.createCell(i);
                cell.setCellValue(titles.get(i));
                cell.setCellStyle(titelStyle);
            }
            Map preMap = null;
            Map fisrtRowMap = new HashMap<>(titles.size());
            Map lastRowMap = new HashMap<>(titles.size());
            for(int i=0;i map = list.get(i);
                HSSFRow dataRow = sheet.createRow(i + 1);
                for(int j=0;jfirstCol){
                                mergedRegion(sheet,i+1,i+1,firstCol,lastCol);
                            }
                            preValue = String.valueOf(valueObj);
                            firstCol = j;
                            lastCol = j;
                        }
                        if(i==0){
                            fisrtRowMap.put(keyList.get(j),i+1);
                            lastRowMap.put(keyList.get(j),i+1);
                        }else{
                            if(null!=valueObj&&String.valueOf(preMap.get(keyList.get(j))).equals(String.valueOf(valueObj))){
                                lastRowMap.put(keyList.get(j),i+1);
                                if(i==list.size()-1){
                                    //最后一行
                                    mergedRegion(sheet,fisrtRowMap.get(keyList.get(j)),lastRowMap.get(keyList.get(j)),j,j);
                                }
                            }else{
                                if(null!=lastRowMap.get(keyList.get(j))&&lastRowMap.get(keyList.get(j))>fisrtRowMap.get(keyList.get(j))){
                                    mergedRegion(sheet,fisrtRowMap.get(keyList.get(j)),lastRowMap.get(keyList.get(j)),j,j);
                                }
                                fisrtRowMap.put(keyList.get(j),i+1);
                                lastRowMap.put(keyList.get(j),i+1);
                                preMap.put(keyList.get(j), String.valueOf(valueObj));
                            }
                        }
                    }
                }
            }
            return workbook;
        }
    
        /**
         * 设置合并单元格
         * @param sheet
         * @param firstRow 开始行
         * @param lastRow 结束行
         * @param firstCol 开始列
         * @param lastCol 结束列
         */
        private static void mergedRegion(HSSFSheet sheet, int firstRow, int lastRow, int firstCol, int lastCol) {
            boolean isMergedRegion = true;
            List cellRangeAddressList = sheet.getMergedRegions();
            for(CellRangeAddress mergedRegion : cellRangeAddressList){
                int fstRow = mergedRegion.getFirstRow();
                int lstRow = mergedRegion.getLastRow();
                int fstColumn = mergedRegion.getFirstColumn();
                int lstColumn = mergedRegion.getLastColumn();
                if(fstRow==firstRow&&fstColumn==firstCol){
                    //合并区域存在重叠
                    lstRow = lstRow>lastRow?lstRow:lastRow;
                    lstColumn = lstColumn>lastCol?lstColumn:lastCol;
                    mergedRegion.setLastRow(lstRow);
                    mergedRegion.setLastColumn(lstColumn);
                    isMergedRegion = false;
                    break;
                }
                if(lstRow==lastRow&&lstColumn==lastCol){
                    //合并区域存在重叠
                    lstRow = lstRow>lastRow?lstRow:lastRow;
                    lstColumn = lstColumn>lastCol?lstColumn:lastCol;
                    mergedRegion.setLastRow(lstRow);
                    mergedRegion.setLastColumn(lstColumn);
                    isMergedRegion = false;
                    break;
                }
            }
            if(isMergedRegion){
                sheet.addMergedRegion(new CellRangeAddress(firstRow,lastRow,firstCol,lastCol));
            }
        }
    
        private static HSSFCellStyle createTitleCellStyle(HSSFWorkbook workbook) {
            HSSFCellStyle cellStyle = workbook.createCellStyle();
            //设置水平居中
            cellStyle.setAlignment(HorizontalAlignment.CENTER);
            //cellStyle.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
            //cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
            //HSSFFont font = workbook.createFont();
            //font.setColor(HSSFColor.WHITE.index);
            //cellStyle.setFont(font);
            return cellStyle;
        }
    
        private static HSSFCellStyle createDataCellStyle(HSSFWorkbook workbook) {
            HSSFCellStyle cellStyle = workbook.createCellStyle();
            //设置垂直居中
            cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
            return cellStyle;
        }
    }
    

     

  • 相关阅读:
    Java成员变量与成员方法简介说明
    R语言使用epiDisplay包的aggregate函数将数值变量基于因子变量拆分为不同的子集,计算每个子集的汇总统计信息、计算单个连续变量的分组汇总统计信息
    使用GSON把数据保存为json格式文件
    《设计模式:可复用面向对象软件的基础》——行为模式(3)(笔记)
    catalog database 的配置
    【微信公众号】微信 jsapi 支付大概流程
    一些k8s集群操作命令
    经典算法系列之(五):七大查找——斐波那契查找(黄金分割)
    彻底弄懂C#中delegate、event、EventHandler、Action、Func的使用和区别
    【Windows】网线直连实现两台电脑共享文件夹
  • 原文地址:https://blog.csdn.net/qq_14918243/article/details/126094428