关于Java poi导出excel 合并单元格问题

本文详细介绍了使用Java的POI库如何在导出Excel时进行单元格合并,适用于多层级数据结构的展示需求,提供了一种高效的方法来处理复杂的Excel导出问题。
    实现类:
public Map<String, Object> downLoadGuiHuaPathById(Integer id) throws IOException {
        Map<String, Object> mapModel = new HashMap<>();
        if (id == null) {
            throw new ArgumentException("ID不能为空。");
        }
        // 根据规划ID获取一级规划信息
        TrGuiHua trGuiHua = trGuiHuaMapper.getGuiHuaById(id);
        Date startTime = trGuiHua.getStartTime();
        Date endTime = trGuiHua.getEndTime();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
        int startYear = Integer.parseInt(sdf.format(startTime));
        int endYear = Integer.parseInt(sdf.format(endTime));

        String sheetName = trGuiHua.getName();
        mapModel.put("fileName", sheetName);
        HSSFWorkbook wb = new HSSFWorkbook();
        HSSFSheet sheet = wb.createSheet(sheetName);
        HSSFCellStyle cellStyle = createCellStyle(wb, (short) 11, true);
        // 处理表头第一行
        HSSFRow row1 = sheet.createRow(0);
        HSSFCell cell11 = row1.createCell(0);
        cell11.setCellValue(sheetName);
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, ((((endYear-startYear)+1)*5))+6));
        cell11.setCellStyle(cellStyle);
        // 处理表头第二行
        HSSFRow row2 = sheet.createRow(1);
        HSSFCell cell21 = row2.createCell(0);
        cell21.setCellValue("专项规划");
        CellRangeAddress cellRangeAddress = new CellRangeAddress(1, 2, 0, 0);
        sheet.addMergedRegion(cellRangeAddress);
        cell21.setCellStyle(cellStyle);
        HSSFCell cell22 = row2.createCell(1);
        cell22.setCellValue("规划");
        sheet.addMergedRegion(new CellRangeAddress(1, 2, 1, 1));
        cell22.setCellStyle(cellStyle);
        HSSFCell cell23 = row2.createCell(2);
        cell23.setCellValue("项目");
        sheet.addMergedRegion(new CellRangeAddress(1, 1, 2, 6));
        cell23.setCellStyle(cellStyle);
//        Cell cell24 = row2.createCell(3);
//        cell24.setCellValue("负责部门");
//        Cell cell25 = row2.createCell(4);
//        cell25.setCellValue("目标");
        // 处理表头第三行
        HSSFRow row3 = sheet.createRow(2);
        String title1="编号,内容,负责部门,开始日期,结束日期,";
        for (int i = startYear; i <=endYear ; i++) {
            title1+="编号,内容,负责部门,开始日期,结束日期,";
            HSSFCell cell = row2.createCell((((i - startYear)+1)*5)+2);
            cell.setCellValue(i+"");
            CellRangeAddress region = new CellRangeAddress(1, 1, (((i - startYear)+1)*5)+2, (((i - startYear)+1)*5)+6);
            sheet.addMergedRegion(region);
            cell.setCellStyle(cellStyle);
        }
        title1=title1.substring(0,title1.length()-1);
        String[] split = title1.split(",");
        for (int i = 0; i <split.length ; i++) {
            HSSFCell cell = row3.createCell(i + 2);
            cell.setCellValue(split[i]);
            cell.setCellStyle(cellStyle);
        }

//        int i = 1;
//        for (int l = startYear; l <= endYear; l++) {
//            Cell cell2 = row2.createCell(4 + i);
//            cell2.setCellValue(l);
//            i++;
//        }
//
//        // 合并表头
//        CellRangeAddress regionTh = new CellRangeAddress(0, 0, 0, 4 + i - 1);
//        sheet.addMergedRegion(regionTh);


        // 获取一级规划的下级规划
        SimpleDateFormat sim=new SimpleDateFormat("yyyy-MM-dd");
        List<TrGuiHua> trGuiHuaList = trGuiHuaMapper.getChildGuiHuaList(id,null);
        if (trGuiHuaList != null && trGuiHuaList.size() > 0) {
            int startRow = 3; // 专项规划开始行
            int endRow = 3; // 专项规划结束行
            for (int j = 0; j < trGuiHuaList.size(); j++) {
                TrGuiHua trGuiHuaZx = trGuiHuaList.get(j);
                Integer zXId = trGuiHuaZx.getId();
                String zxName = trGuiHuaZx.getName();

                // 获取专项规划下的子规划
                List<TrGuiHua> trGuiHuaChild = trGuiHuaMapper.getChildGuiHuaList(zXId,null);
                if (trGuiHuaChild != null && trGuiHuaChild.size() > 0) {
                    int ghStartRow = startRow; // 子规划开始行
                    int ghEndRow = startRow; // 子规划结束行
                    for (int k = 0; k < trGuiHuaChild.size(); k++) {
                        TrGuiHua trGuiHua1 = trGuiHuaChild.get(k);
                        Integer childGuiHuaId = trGuiHua1.getId();
                        // 获取规划下的项目
                        List<TrProject> trProjectList = trGuiHuaMapper.getChildProjectList(childGuiHuaId);
                        if (trProjectList != null && trProjectList.size() > 0) {
                            int projectStartRow = ghStartRow; // 项目开始行
                            int projectEndRow = ghStartRow; // 项目结束行
                            for (int m = 0; m < trProjectList.size(); m++) {
                                List<String> projectTempList=new ArrayList<>();
                                TrProject trProject = trProjectList.get(m);
                                Integer projectId = trProject.getId();
                                for (int l = startYear; l <= endYear; l++) {
                                    Integer initCell= ((((l - startYear) + 1) * 5) + 2);
                                    TrTargetDto trTargetDto = new TrTargetDto();
                                    trTargetDto.setProjectId(projectId);
                                    trTargetDto.setFlag(1);
                                    trTargetDto.setTargetYear(l);
                                    List<TrTarget> trTargetList = trTargetMapper.getTargetListByCon(trTargetDto);
//                                    StringBuffer stringBuffer = new StringBuffer();

                                    if (trTargetList != null && trTargetList.size() > 0) {
                                        projectEndRow=projectStartRow+trTargetList.size();
                                        ghEndRow=projectStartRow+trTargetList.size();
                                        int targetStartRow = projectStartRow;
                                        endRow = targetStartRow + trTargetList.size()-3;
                                        for (int n = 0; n < trTargetList.size(); n++) {
                                            List<String> targetTempList=new ArrayList<>();
                                            TrTarget trTarget = trTargetList.get(n);
                                            targetTempList.add(n+1+"");
                                            targetTempList.add(trTarget.getTargetName());
                                            targetTempList.add(trTarget.getManagerDeptName());
                                            targetTempList.add(trTarget.getStartTime()==null?"":sim.format(trTarget.getStartTime()));
                                            targetTempList.add(trTarget.getEndTime()==null?"":sim.format(trTarget.getEndTime()));
                                            HSSFRow row = sheet.getRow(targetStartRow);
                                            if (row==null){
                                                row = sheet.createRow(targetStartRow);
                                            }
                                            for (int i = 0; i < targetTempList.size(); i++) {
                                                HSSFCell cell = row.createCell( initCell+ i);
                                                cell.setCellValue(targetTempList.get(i));
                                                cell.setCellStyle(cellStyle);
                                            }
//                                          stringBuffer.append(trTarget.getTargetName() + ";\r\n");
                                            targetStartRow++;
                                        }
                                    }else {
                                        endRow++;
                                        if (sheet.getRow(projectStartRow)==null){
                                            sheet.createRow(projectStartRow);
                                        }
                                    }
//                                    Cell cell = row.createCell((l - startYear) + 5);
//                                    cell.setCellValue(stringBuffer.toString());
                                }

                                projectTempList.add(m+1+"");
                                projectTempList.add(trProject.getProjectName());
                                projectTempList.add(trProject.getManagerDeptName());
                                projectTempList.add(trProject.getStartTime()==null?"":sim.format(trProject.getStartTime()));
                                projectTempList.add(trProject.getEndTime()==null?"":sim.format(trProject.getEndTime()));
                                HSSFRow row = sheet.getRow(projectStartRow);
                                for (int i = 0; i <projectTempList.size() ; i++) {
                                    HSSFCell cell = row.createCell(i + 2);
                                    cell.setCellValue(projectTempList.get(i));
                                    if (projectEndRow - 1 > projectStartRow) {
                                        CellRangeAddress region = new CellRangeAddress(projectStartRow, projectEndRow - 1, i + 2, i + 2);
                                        sheet.addMergedRegion(region);
                                    }
                                    cell.setCellStyle(cellStyle);
                                }
                                projectStartRow=projectEndRow;
                            }
                        } else {
                            endRow++;
                            sheet.createRow(ghStartRow);
                        }

                        // 处理子规划
                        HSSFRow row = sheet.getRow(ghStartRow);
                        HSSFCell cell1 = row.createCell(1);
                        cell1.setCellValue(trGuiHua1.getName());

                        // 处理一个子规划的合并
                        if (ghEndRow - 1 > ghStartRow) {
                            CellRangeAddress region = new CellRangeAddress(ghStartRow, ghEndRow - 1, 1, 1);
                            sheet.addMergedRegion(region);
                        }
                        cell1.setCellStyle(cellStyle);
                        ghStartRow = ghEndRow;
                    }
                } else {
                    endRow++;
                    sheet.createRow(startRow);
                }

                // 处理专项规划
                HSSFRow row = sheet.getRow(startRow);
                HSSFCell cell0 = row.createCell(0);
                cell0.setCellValue(zxName);

                // 合并一个专项规划
                if (endRow - 1 > startRow) {
                    CellRangeAddress region = new CellRangeAddress(startRow, endRow - 1, 0, 0);
                    sheet.addMergedRegion(region);
                }
                cell0.setCellStyle(cellStyle);
                startRow = endRow;
            }
            for (int i = 0; i <=endRow ; i++) {
                sheet.autoSizeColumn(i);
                sheet.setColumnWidth(i,sheet.getColumnWidth(i)*14/11);
            }
        }
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        wb.write(baos);
        mapModel.put("data", baos);
        baos.close();
        wb.close();
        return mapModel;
    }
//导出excel样式设置
    private static HSSFCellStyle createCellStyle(HSSFWorkbook workbook, short fontsize, boolean center) {
        // TODO Auto-generated method stub
        HSSFCellStyle style = workbook.createCellStyle();
//        style.setBorderTop(BorderStyle.THIN);
//        style.setBorderBottom(BorderStyle.THIN);
//        style.setBorderLeft(BorderStyle.THIN);
//        style.setBorderRight(BorderStyle.THIN);
        //是否水平居中
        if (center) {
            style.setAlignment(HorizontalAlignment.CENTER);//水平居中
        }else {
            style.setAlignment(HorizontalAlignment.LEFT);//水平居中
        }
        style.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
        //创建字体
        HSSFFont font = workbook.createFont();
        font.setFontHeightInPoints(fontsize);
        //加载字体
        style.setFont(font);
        style.setWrapText(true);

        return style;
    }

以上示例导出分为四个层级,可以按需求层级嵌套

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值