首页 > 编程语言 >JAVA 使用POI实现单元格行合并

JAVA 使用POI实现单元格行合并

时间:2024-03-25 17:29:40浏览次数:13  
标签:cellStyle JAVA region 单元格 lastRowIndex chlist POI new size

POI实现单元格行合并

实现效果

你好! 这是你第一次使用 **Markdown编辑器** 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
如果最后面的三行数据大于1时 那么前面十二行就需要行合并

引入jar

 <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>5.2.2</version>
            </dependency>

代码实现

controller层

@PostMapping(value = "getExcel")
    public  void getExcel(@RequestBody BrucellosisListDTO brucellosisListDTO, HttpServletRequest request, HttpServletResponse response){
        businessTaskBrucellosisService.getExcel(brucellosisListDTO,request,response);
    }

Service层

void getExcel(BrucellosisListDTO brucellosisListDTO, HttpServletRequest request, HttpServletResponse response);

ServiceImpl层实现类

@Override
    public void getExcel(BrucellosisListDTO brucellosisListDTO, HttpServletRequest request, HttpServletResponse response) {
        //数据来源
        List<BrucellosisExportExcel> list = queryExcelList(brucellosisListDTO);
        //数据来源 通过参数传入
        String[] masterHead = {"姓名","养殖户类型","手机号码","人口数","所在区域(省)","所在区域(市)","所在区域(区/县)","所在区域(乡镇)","所在区域(乡村)","防疫负责人","养殖总数","布病人数"};
        String[] childHead = {"布病人员","布病人手机号码","布病人身份证号码"};
        int[] widthColumn = new int[]{20,20,25,15,30,30,30,20,30,30,20,15,25,50,50,50};
        //创建Excel工作薄对象
        XSSFWorkbook workbook=new XSSFWorkbook();
        //创建Excel工作表对象
        Sheet sheet = workbook.createSheet("布病人员统计");

       //设置单元格居中
        CellStyle cellStyle = workbook.createCellStyle();
        //设置边框样式
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 上下居中

        //创建行的单元格,从0开始
        Row row = sheet.createRow(0);
        //创建统计单元格
        Cell masterCell=row.createCell(0);
        //设置第一个表头样式
        CellStyle cellStyleHead = workbook.createCellStyle();
        cellStyleHead.setAlignment(HorizontalAlignment.CENTER);
        cellStyleHead.setVerticalAlignment(VerticalAlignment.CENTER);
        cellStyleHead.setBorderBottom(BorderStyle.THIN);
        cellStyleHead.setBorderLeft(BorderStyle.THIN);
        cellStyleHead.setBorderRight(BorderStyle.THIN);
        cellStyleHead.setBorderTop(BorderStyle.THIN);
        cellStyleHead.setFillForegroundColor(IndexedColors.LIGHT_TURQUOISE.getIndex());
        cellStyleHead.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        //赋值
        masterCell.setCellValue("养殖户布病人员基本信息统计");
        masterCell.setCellStyle(cellStyleHead);
        //合并列
        CellRangeAddress region = new CellRangeAddress(0, 0, 0, (masterHead.length+childHead.length-1));
        sheet.addMergedRegion(region);
        row.setHeight((short) (3*200));
        // 设置列宽
        for (int i = 0; i <widthColumn.length; i++) {
            sheet.setColumnWidth((short) i, (short) widthColumn[i] * 200);
        }
        //表头 从1开始 设置第二个表头样式
        Row titleRow = sheet.createRow(1);
        //主表头
        for (int i = 0; i < masterHead.length ; i++) {
            Cell msCell = titleRow.createCell(i);
            msCell.setCellStyle(cellStyleHead);
            msCell.setCellValue(masterHead[i]);
        }
        //子表头
        for (int i = 0; i < childHead.length; i++) {
            Cell chcell = titleRow.createCell(masterHead.length+i);
            chcell.setCellStyle(cellStyleHead);
            chcell.setCellValue(childHead[i]);
        }
        //封装数据
        excelPoi(list,sheet,cellStyle,region);
        String fileName = null;
        try {
            fileName = URLEncoder.encode("患布病人员统计","UTF-8");
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".xlsx");
            response.setHeader("filename", fileName + ".xlsx");
            response.setHeader("Pragma", "public");
            response.setHeader("Cache-Control", "no-store");
            response.addHeader("Cache-Control", "max-age=0");
            response.setHeader("Access-Control-Expose-Headers","Content-Disposition");
            OutputStream os = response.getOutputStream();
            workbook.write(os);
            os.flush();
            os.close();
            workbook.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    
    //数据封装以及塞值方法
  public void excelPoi(List<BrucellosisExportExcel> list, Sheet sheet,CellStyle cellStyle, CellRangeAddress region){

        //封装父表和子表对象
        Map<String, List<BrucellosisExportExcel>> farmerPhoneMap = list.stream().collect(Collectors.groupingBy(BrucellosisExportExcel::getFarmerPhone));
        Set<String> strings = farmerPhoneMap.keySet();
        List<String> farmerPhoneList = new ArrayList<>(strings);
        List<Map<BrucellosisExportExcel,List<BrucellosisExportExcel>>> masterList = new ArrayList<>();
        Map<BrucellosisExportExcel,List<BrucellosisExportExcel>> map = new HashMap();
        for (int i = 0; i < farmerPhoneList.size(); i++) {
            List<BrucellosisExportExcel> brucellosisExportExcels = farmerPhoneMap.get(farmerPhoneList.get(i));
            //养殖户基本信息
            BrucellosisExportExcel brucellosisExportExcel = brucellosisExportExcels.get(0);
            map.put(brucellosisExportExcel,brucellosisExportExcels);
        }
        masterList.add(map);

        //填充数据
        int lastRowIndex = 2; //记录最后行位置
        for (Map<BrucellosisExportExcel,List<BrucellosisExportExcel>> m : masterList){
            for (BrucellosisExportExcel key : m.keySet()){
                List<BrucellosisExportExcel> chlist = m.get(key);
                Row valueRow = sheet.createRow(lastRowIndex);
                Cell farmerNameCell = valueRow.createCell(0);
                farmerNameCell.setCellStyle(cellStyle);
                farmerNameCell.setCellValue(key.getFarmerName());
                if (chlist.size()>1){ //子表数量大于1才进行 行合并
                    region=new CellRangeAddress(lastRowIndex, lastRowIndex+chlist.size()-1, 0, 0);
                    sheet.addMergedRegion(region);
                }

                Cell farmerTypeNameCell = valueRow.createCell(1);
                farmerTypeNameCell.setCellStyle(cellStyle);
                farmerTypeNameCell.setCellValue(key.getFarmerTypeName());
                if (chlist.size()>1){ //子表数量大于1才进行 行合并
                    region=new CellRangeAddress(lastRowIndex, lastRowIndex+chlist.size()-1, 1, 1);
                    sheet.addMergedRegion(region);
                }

                Cell farmerPhoneCell = valueRow.createCell(2);
                farmerPhoneCell.setCellStyle(cellStyle);
                farmerPhoneCell.setCellValue(key.getFarmerPhone());
                if (chlist.size()>1){ //子表数量大于1才进行 行合并
                    region=new CellRangeAddress(lastRowIndex, lastRowIndex+chlist.size()-1, 2, 2);
                    sheet.addMergedRegion(region);
                }

                Cell populationCell = valueRow.createCell(3);
                populationCell.setCellStyle(cellStyle);
                populationCell.setCellValue(key.getPopulation());
                if (chlist.size()>1){ //子表数量大于1才进行 行合并
                    region=new CellRangeAddress(lastRowIndex, lastRowIndex+chlist.size()-1, 3, 3);
                    sheet.addMergedRegion(region);
                }

                Cell provinceNameCell = valueRow.createCell(4);
                provinceNameCell.setCellStyle(cellStyle);
                provinceNameCell.setCellValue(key.getProvinceName());
                if (chlist.size()>1){ //子表数量大于1才进行 行合并
                    region=new CellRangeAddress(lastRowIndex, lastRowIndex+chlist.size()-1, 4, 4);
                    sheet.addMergedRegion(region);
                }

                Cell cityNameCell = valueRow.createCell(5);
                cityNameCell.setCellStyle(cellStyle);
                cityNameCell.setCellValue(key.getCityName());
                if (chlist.size()>1){ //子表数量大于1才进行 行合并
                    region=new CellRangeAddress(lastRowIndex, lastRowIndex+chlist.size()-1, 5, 5);
                    sheet.addMergedRegion(region);
                }

                Cell areaNameCell = valueRow.createCell(6);
                areaNameCell.setCellStyle(cellStyle);
                areaNameCell.setCellValue(key.getAreaName());
                if (chlist.size()>1){ //子表数量大于1才进行 行合并
                    region=new CellRangeAddress(lastRowIndex, lastRowIndex+chlist.size()-1, 6, 6);
                    sheet.addMergedRegion(region);
                }

                Cell townNameCell = valueRow.createCell(7);
                townNameCell.setCellStyle(cellStyle);
                townNameCell.setCellValue(key.getTownshipName());
                if (chlist.size()>1){ //子表数量大于1才进行 行合并
                    region=new CellRangeAddress(lastRowIndex, lastRowIndex+chlist.size()-1, 7, 7);
                    sheet.addMergedRegion(region);
                }

                Cell streetNameCell = valueRow.createCell(8);
                streetNameCell.setCellStyle(cellStyle);
                streetNameCell.setCellValue(key.getStreetName());
                if (chlist.size()>1){ //子表数量大于1才进行 行合并
                    region=new CellRangeAddress(lastRowIndex, lastRowIndex+chlist.size()-1, 8, 8);
                    sheet.addMergedRegion(region);
                }

                Cell personInChargeNameCell = valueRow.createCell(9);
                personInChargeNameCell.setCellStyle(cellStyle);
                personInChargeNameCell.setCellValue(key.getPersonInChargeName());
                if (chlist.size()>1){ //子表数量大于1才进行 行合并
                    region=new CellRangeAddress(lastRowIndex, lastRowIndex+chlist.size()-1, 9, 9);
                    sheet.addMergedRegion(region);
                }

                Cell animalNumCell = valueRow.createCell(10);
                animalNumCell.setCellStyle(cellStyle);
                animalNumCell.setCellValue(key.getAnimalNum());
                if (chlist.size()>1){ //子表数量大于1才进行 行合并
                    region=new CellRangeAddress(lastRowIndex, lastRowIndex+chlist.size()-1, 10, 10);
                    sheet.addMergedRegion(region);
                }

                Cell bruNumCell = valueRow.createCell(11);
                bruNumCell.setCellStyle(cellStyle);
                bruNumCell.setCellValue(key.getBruNum());
                if (chlist.size()>1){ //子表数量大于1才进行 行合并
                    region=new CellRangeAddress(lastRowIndex, lastRowIndex+chlist.size()-1, 11, 11);
                    sheet.addMergedRegion(region);
                }

                for (int i = 0; i < chlist.size(); i++) {
                    BrucellosisExportExcel brucellosisExportExcel = chlist.get(i);
                    Row chRow;
                    if (i == 0){ //避免重复创建 覆盖主表数据
                        chRow = valueRow;
                    }else {
                        chRow  = sheet.createRow(lastRowIndex);
                    }
                    lastRowIndex++;
                    Cell userNameCell = chRow.createCell(12);
                    userNameCell.setCellStyle(cellStyle);
                    userNameCell.setCellValue(brucellosisExportExcel.getUserName());

                    Cell usePhoneCell = chRow.createCell(13);
                    usePhoneCell.setCellStyle(cellStyle);
                    usePhoneCell.setCellValue(brucellosisExportExcel.getUserPhone());

                    Cell idCardCell = chRow.createCell(14);
                    idCardCell.setCellStyle(cellStyle);
                    idCardCell.setCellValue(brucellosisExportExcel.getIdCard());
                }
            }
        }

    }

备注: 由于我这里要合并的列比较多而且牵扯到每一列都不同,所以使用了一行一行去校验和合并的方法;当然 如果需要合并的就只有一行 可以在 excelPoi的第二个for循环里面使用循环合并的方式。

标签:cellStyle,JAVA,region,单元格,lastRowIndex,chlist,POI,new,size
From: https://blog.csdn.net/qq_43419105/article/details/137018202

相关文章

  • JavaScript 基础 - 第1天
     了解变量、数据类型、运算符等基础概念,能够实现数据类型的转换,结合四则运算体会如何编程。体会现实世界中的事物与计算机的关系理解什么是数据并知道数据的分类理解变量存储数据的“容器”掌握常见运算符的使用,了解优先级关系知道JavaScript数据类型隐式转......
  • 【VTKExamples::Points】第十期 NormalEstimation
    很高兴在雪易的CSDN遇见你 VTK技术爱好者QQ:870202403   公众号:VTK忠粉前言本文分享VTK样例NormalEstimation,并解析接口vtkPCANormalEstimation,希望对各位小伙伴有所帮助!感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!你的点赞就是我的动力(^U^)ノ~YO1.Norm......
  • 基于java中的springboot框架实现学生宿舍管理系统的设计与开发演示【附项目源码+论文
    基于springboot实现学生宿舍管理系统的设计与开发演示摘要互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对学生宿舍信息管理混乱,出错率高,信息安全性差,劳动强......
  • 基于java中的SpringBoot框架实现企业客户管理系统演示【附项目源码+论文说明】
    基于SpringBoot实现企业客户管理系统演示摘要本论文主要论述了如何使用JAVA语言开发一个企业客户管理系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述企业客户管理系统的当前背景以及系统开发的目的,后......
  • 基于java中的springboot框架实现学生宿舍管理系统的设计与开发演示【附项目源码+论文
    基于springboot实现学生宿舍管理系统的设计与开发演示摘要互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对学生宿舍信息管理混乱,出错率高,信息安全性差,劳动强......
  • 基于java中的SpringBoot框架实现企业客户管理系统演示【附项目源码+论文说明】
    基于SpringBoot实现企业客户管理系统演示摘要本论文主要论述了如何使用JAVA语言开发一个企业客户管理系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述企业客户管理系统的当前背景以及系统开发的目的,后......
  • vue中导出excel表格, Workbook 导出的表格的单元格格式设置为文本
    <template><button@click="exportExcel">导出Excel</button></template><script>importXLSXfrom'xlsx';exportdefault{methods:{exportExcel(){//创建Workbook和工作表constworkbook=......
  • Linux设置Java服务启动用户一系列的配置
    添加用户这里创建一个用户,用于启动jar包的用户,不需要创建家目录。useradd-M<用户名>有两种方式可以以特定用户进行启动。第一种是使用su命令,使用su-c命令用户名的方式进行启动。第二种就是使用sudo命令,这个需要配置下/etc/sudoers文件,推荐使用visudo命令进行配置,因为这......
  • Java学习第二天
    类型转换高转低要强制转换,而低转高则自动转换如何进行强制转换:(要转换的数据类型)变量名例如:inti=10;byteb=(byte)i;注意点:不能对布尔值进行转换。不能把对象类型转换为不相干类型。转换时可能存在内存溢出或者精度问题。变量变量作用域类变量实例变量局部......
  • Java泛型方法和泛型参数之美
    1.泛型方法和泛型参数的介绍在Java中,泛型方法和泛型参数是一种强大的特性,它们可以增加代码的灵活性和可重用性。下面是对泛型方法和泛型参数的介绍:泛型方法:泛型方法是一种在方法中使用泛型类型的方式。通过在方法声明中使用尖括号和类型参数,可以使方法具有通用性,可以在......