赞
踩
大家实际项目开发过程中肯定都会导出Excel,我接触过的有三种:JAVA POI、EasyExcel、Hutool。最近使用EasyExcel的比较多,所以本片介绍使用该方法的操作步骤。
需求千变万化,没有最复杂只有更复杂,最近的项目过程中,需要生成动态表头且包含多sheet,之前没有做过类似的,特此记录下也希望可以帮助到大家。
EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
我之前用过Apache poi及hutool工具,其实Hutool也是在POI基础上进行封装,简单易用,但是功能不太全。他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc。而EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)。
因为项目中代码太多业务逻辑,所以仅将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(); }*/ }
——————————————————
JAVA面试知识点相关:JAVA面试知识点
SpringAOP原理使用相关:SpringAOP原理使用详解
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。