我是靠谱客的博主 无私镜子,最近开发中收集的这篇文章主要介绍java 导出数据到Excel表格(动态合并单元格)需求实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

java 导出数据到Excel表格,并根据数据动态合并单元格

  • 需求
  • 实现
    • 1.引入依赖
    • 2.实现代码


需求

java导出数据到Excel表格,主信息与关联信息一对多,生成下图类似的表格内容

数据表格


实现

1.引入依赖

代码如下:

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

2.实现代码

代码如下:

    @RequestMapping("/exportExcel")
    public void exportExcel(HttpServletResponse response,OutChannelInfo outChannelInfo,
                            @RequestParam(defaultValue = "1") Integer page,
                            @RequestParam(defaultValue = "20") Integer rows,
                            String sord,String sidx)throws Exception{
        //接收参数
        PageBean<OutChannelInfo> pageBean=outChannelService.findByPageCpid(outChannelInfo,"800033",page,rows,sord,sidx);
        List<OutChannelInfo> outChannelInfoList=pageBean.getResult();
        List<OutChannelResourceInfo> list=outChannelResourceService.
                getOutChannelResources(outChannelInfoList.stream().map(OutChannelInfo::getOutChannelId).collect(Collectors.toList()));
        //创建poi导出数据对象
        SXSSFWorkbook sxssfWorkbook=new SXSSFWorkbook();
        //创建sheet页
        SXSSFSheet sheet=sxssfWorkbook.createSheet("频道信息表");
        //创建表头
        SXSSFRow headRow=sheet.createRow(0);
        //设置表头信息
        headRow.createCell(0).setCellValue("播出频道ID");
        headRow.createCell(1).setCellValue("名称");
        headRow.createCell(2).setCellValue("类型");
        headRow.createCell(3).setCellValue("内容ID");
        headRow.createCell(4).setCellValue("码率模板");
        headRow.createCell(5).setCellValue("输出地址");
        Map<Long, OutChannelInfo> map=outChannelInfoList.stream().collect(Collectors.toMap(OutChannelInfo::getOutChannelId, Function.identity(),(v1, v2)->v2));
        // 遍历上面数据库查到的数据
        Long outChannelId=null;
        //定义一个值,标记行数
        int count=1;
        //组装数据
        for(OutChannelResourceInfo outChannelResourceInfo:list){
            SXSSFRow dataRow=sheet.createRow(count);
            if(!outChannelResourceInfo.getOutChannelId().equals(outChannelId)){
                OutChannelInfo pm=map.get(outChannelResourceInfo.getOutChannelId());
                //id赋值
                outChannelId=outChannelResourceInfo.getOutChannelId();
                //频道信息填入
                dataRow.createCell(0).setCellValue(pm.getOutChannelId());
                dataRow.createCell(1).setCellValue(pm.getName());
                dataRow.createCell(2).setCellValue(getTypeValue().get(pm.getType()));
                dataRow.createCell(3).setCellValue(pm.getContentId());
            }
            dataRow.createCell(4).setCellValue(outChannelResourceInfo.getTpl());
            dataRow.createCell(5).setCellValue(outChannelResourceInfo.getOutUrls());
            count++;
        }
        //筛选出合并行
        int firstRow=1;
        int lastRow;
        //从第二条开始
        Map<Integer, Integer> hbMap=new LinkedHashMap<>();
        for(int i=1;i<list.size();i++){
            boolean flag=!list.get(i).getOutChannelId().equals(list.get(i-1).getOutChannelId())||i>=list.size()-1;
            if(flag){
                if(i!=list.size()-1){
                    lastRow=i;
                }else{
                    //i+1是因为前面的表头占了一行
                    lastRow=i+1;
                }
                hbMap.put(firstRow,lastRow);
                firstRow=i+1;
            }
        }
        //有一行数据的不进行合并
        for(Map.Entry<Integer, Integer> e:hbMap.entrySet()){
            for(int i=0;i< 4;i++){
                if(e.getKey().equals(e.getValue())){
                    continue;
                }
                CellRangeAddress region2=new CellRangeAddress(e.getKey(),e.getValue(),i,i);
                sheet.addMergedRegion(region2);
            }

        }
        // 下载导出
        String filename="频道信息表";
        // 设置头信息
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/vnd.ms-excel");
        //一定要设置成xlsx格式
        response.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(filename+".xlsx","UTF-8"));
        //创建一个输出流
        ServletOutputStream outputStream=response.getOutputStream();
        //写入数据
        sxssfWorkbook.write(outputStream);
        // 关闭
        outputStream.close();
        sxssfWorkbook.close();
    }
参考链接:https://blog.csdn.net/cxy_12345/article/details/103179111

最后

以上就是无私镜子为你收集整理的java 导出数据到Excel表格(动态合并单元格)需求实现的全部内容,希望文章能够帮你解决java 导出数据到Excel表格(动态合并单元格)需求实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部