POI excel 导出合并单元格工具

自己写的一个工具类,传入拿到的数据,并且可以邻近相同数据的util

 

/**
 * 把从数据库读出的数据写成excel
 */
public class WriteExcelUtil {

    public int writeExcel(String  filePath , List<Map<String, Object>> data) throws IOException {

        //创建excel
        HSSFWorkbook wb = new HSSFWorkbook();//创建Excel工作簿对象
        HSSFSheet sheet = wb.createSheet("人员信息");//创建工作表并命名
        HSSFCellStyle cellStyle = wb.createCellStyle();//创建单元格样式

        //写入数据
        writeData(sheet,data);

        //合并单元格
        //行合并
        mergeCell(sheet);
        //列合并
        mergeRow(sheet);


        //以 文件名 + 精确到秒的时间.xls 的格式命名
        FileOutputStream out = new FileOutputStream(filePath+"sample"+ getTime() +".xls");
        wb.write(out);
        out.close();//关闭文件流
        return 1;
    }

    /**
     *
     * @return
     */
    public String getTime(){
        Date now = new Date();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
        String time = dateFormat.format( now );
        return time;
    }

    /**
     * 数据写入sheet
     * @param sheet
     * @param data
     * @return
     */
    public int writeData(HSSFSheet sheet,List<Map<String, Object>> data){
        for (int i=0;i<data.size();i++) {
            HSSFRow row = sheet.createRow(i);
            //int num = 0;
            int len = data.get(i).size();
            for (int j=1;j <= 27;j++) {
                ;
                row.createCell(j-1).setCellValue(data.get(i).get("COL"+j).toString()); //设置Excel工作表的值
            } 
        }
        return 1;
    }

    /**
     * 比较列中相同单元格并合并
     * @param sheet
     * @return
     */
    public int mergeRow(HSSFSheet sheet){
        int rowNum = sheet.getLastRowNum()+1;//注意:此处有n行获取到n-1
        int cellNum = sheet.getRow(0).getLastCellNum();   //总共的列数量 注意:此处有n行获取到n

        int strat=-1,end=-1,flag=-1;
        String cellValue1="",cellValue2="";
        for(int i=0;i < cellNum ;i++) {
            for (int j = 0; j < rowNum - 1; j++) {
                cellValue1 = sheet.getRow(j).getCell(i).getStringCellValue();
                cellValue2 = sheet.getRow(j + 1).getCell(i).getStringCellValue();
                //相等则记录相等起始位置
                if( cellValue1.trim().equals(cellValue2.trim())  ){
                    if(strat == -1 ){
                        strat=j; //
                        end=j+1;
                        flag=i;
                    }else{
                        end++;
                    }
                }else{
                    if(strat !=-1 ){
                        sheet.addMergedRegion(new CellRangeAddress(strat, end,flag,flag));
                        strat=-1;
                        end=-1;
                        flag=-1;
                    }
                }
                //判断此列是否结束 且 是否需要合并单元格
                if(strat !=-1 &&  j == rowNum - 2 ){
                    sheet.addMergedRegion(new CellRangeAddress(strat, end,flag,flag));
                    strat=-1;
                    end=-1;
                    flag=-1;
                }
            }
        }

        if(strat !=-1 ){
            sheet.addMergedRegion(new CellRangeAddress(strat, end,flag,flag));
            strat=-1;
            end=-1;
            flag=-1;
        }

        return 1;
    }

    /**
     * 合并单元格行
     * @param sheet
     * @return
     */
    public int mergeCell(HSSFSheet sheet){
        int rowNum = sheet.getLastRowNum()+1;//注意:此处有n行获取到n-1
        int cellNum = sheet.getRow(0).getLastCellNum();   //总共的列数量 注意:此处有n行获取到n

        int strat=-1,end=-1,flag=-1;
        String cellValue1="",cellValue2="";
        for(int i=0;i < rowNum ;i++){
            for(int j=0;j < cellNum - 1;j++){
                cellValue1=sheet.getRow(i).getCell(j).getStringCellValue();
                cellValue2=sheet.getRow(i).getCell(j+1).getStringCellValue();
                if( cellValue1.trim().equals(cellValue2.trim())  ){
                    if(strat == -1 ){
                        strat=j;
                        end=j+1;
                        flag=i;
                    }else{
                        end++;
                    }
                }else{
                    if(strat !=-1 ){
                        sheet.addMergedRegion(new CellRangeAddress(flag,flag,strat, end));
                        strat=-1;
                        end=-1;
                        flag=-1;
                    }
                }

                //判断此列是否结束 且 是否需要合并单元格
                if(strat !=-1 &&  j == rowNum - 2 ){
                    sheet.addMergedRegion(new CellRangeAddress(flag,flag,strat, end));
                    strat=-1;
                    end=-1;
                    flag=-1;
                }
            }
        }

        if(strat !=-1 ){
            sheet.addMergedRegion(new CellRangeAddress(flag,flag,strat, end));
            strat=-1;
            end=-1;
            flag=-1;
        }

        return 1;
    }
}

下面展示一组设计好的数据合并成的表头

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值