当前位置:   article > 正文

Java实现excel动态表头及动态sheet_java excel gif

java excel gif

大家实际项目开发过程中肯定都会导出Excel,我接触过的有三种:JAVA POI、EasyExcel、Hutool。最近使用EasyExcel的比较多,所以本片介绍使用该方法的操作步骤。

需求千变万化,没有最复杂只有更复杂,最近的项目过程中,需要生成动态表头且包含多sheet,之前没有做过类似的,特此记录下也希望可以帮助到大家。

简单了解EasyExcel

EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。

与其他框架的区别

我之前用过Apache poi及hutool工具,其实Hutool也是在POI基础上进行封装,简单易用,但是功能不太全。他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc。而EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)。

优势:

  • 注解式自定义操作
  • 输入输出简单,提供输入输出过程的接口。
  • 支持一定程度的单元格合并等灵活化操作。
  • 可以基于对象的方式操作Excel。
  • 节省内存。
  • 大数据量的速度有明显优势。

实现动态表头及sheet

因为项目中代码太多业务逻辑,所以仅将esasyExcel生成多sheet动态表头逻辑抽取出来放到main方法里面,每一步都有注释说明。废话不多说,文章组织语言能力有限,直接上代码。

public static void main(String[] args) {
        //生成excel路径
        String filePath = "d:\\easyexcel-test.xls";
        //ExcelWriter初始化
        ExcelWriter excelWriter = EasyExcel
                .write(filePath)
                .autoCloseStream(Boolean.TRUE)
                .registerConverter(new LongStringConverter())
                .registerWriteHandler(new SimpleColumnWidthStyleStrategy(45))
                .build();
                
        //第一个sheet的表头
        List<String> cols1 = new ArrayList<>();
        cols1.add("cola-1");
        cols1.add("colb-1");
        
        //第一个sheet的数据
        List<String> datas1 = new ArrayList<>();
        datas1.add("data1-1");
        datas1.add("data2-1");
        
        //第二个sheet的表头
        List<String> cols2 = new ArrayList<>();
        cols2.add("colc-2");
        cols2.add("cold-2");
        
        //第二个sheet的数据
        List<String> datas2 = new ArrayList<>();
        datas2.add("data3-2");
        datas2.add("data4-2");

        Map<String, List<String>> dataMap1 = new HashMap<>();
        dataMap1.put("cols", cols1);
        dataMap1.put("datas", datas1);

        Map<String, List<String>> dataMap2 = new HashMap<>();
        dataMap2.put("cols", cols2);
        dataMap2.put("datas", datas2);
        
        //组装为list
        List<Map<String, List<String>>> sheetMaps = new ArrayList<>();
        sheetMaps.add(dataMap1);
        sheetMaps.add(dataMap2);

        //遍历list
        for (int i = 0; i < sheetMaps.size(); i++) {
        
            //获得当前sheet的信息
            Map<String, List<String>> sheetMap = sheetMaps.get(i);
            
            //获得当前sheet的表头
            List<String> cols = sheetMap.get("cols");
            
            //表头二维
            List<List<String>> doubleCols = new ArrayList<>();
            for (String column : cols) {
                List<String> objects = new ArrayList<>();
                objects.add(column);
                doubleCols.add(objects);
            }
            
            //数据二维
            List<List<String>> doubleDatas = new ArrayList<>();
            List<String> datas = sheetMap.get("datas");
            doubleDatas.add(datas);
            
            //WriteSheet将该sheet内容写入excel中
            WriteSheet writeSheet = EasyExcel.writerSheet(i, i+"test").head(doubleCols).build();
            excelWriter.write(doubleDatas, writeSheet);
        }
        
        //写完所有sheet后执行
        excelWriter.finish();

        //注释部分为写入流
        /*try {
            response.setHeader("Content-Disposition", "attachment; filename=" + new String(fileName.getBytes("gb2312"), "ISO8859-1"));
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            InputStream in = new FileInputStream(new File(filePath));
            OutputStream out = response.getOutputStream();
            byte[] b = new byte[1024];
            while ((in.read(b)) != -1) {
                out.write(b);
                out.flush();
            }
            in.close();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }*/
        
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92

特殊说明

  • 字段与数据顺序要对应起来(cols1与datas1)。
  • 在文件路径存在的前提下,可以直接执行main方法查看生成的excel文件。
  • 本篇使用的简单数据,主要抽象出具体逻辑,实际过程中数据肯定会复杂,自行修改即可。

——————————————————
JAVA面试知识点相关:JAVA面试知识点
SpringAOP原理使用相关:SpringAOP原理使用详解

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/590626
推荐阅读
相关标签
  

闽ICP备14008679号