JXLS 2.4.3 加快下载报表速度


本人这段时间接手一个spring boot项目,其中一个任务就是升级jxls版本来优化下载Excel的速度。原来的报表下载速度很慢,一万条数据大约1分钟( ̄□ ̄||)。

下载jxls的demo,地址链接详见:https://bitbucket.org/leonate/jxls-demo。然后我根据SxssfDemo的内容改造了我项目原有下载Excel的方法,性能还算不错。现在将代码贴出来:

 1 /**
 2  * 导出公共方法(针对数据量较大,速度快)
 3  *
 4  * @author admin
 5  * @date 2018-4-10 10:11
 6  * @param templateName 模版名称
 7  * @param templateTitle 导出Excel的标题
 8  * @param list 导出数据List
 9  * @return java.util.Map<java.lang.String,java.lang.Object>
10  */
11 protected <T> Map<String, Object> exportBigDataExcel(String templateName, String templateTitle, List<T> list , Boolean isImportFail) {
12     Map<String, Object> result = new HashMap<>();
13     //1 模板
14     String template = getExportTemPath() + templateName + ".xlsx";
15     //2 取得数据
16     if (CollectionUtils.isEmpty(list)) {
17         result.put("success", false);
18         result.put("message", "没有相关记录导出");
19         return result;
20     }
21 
22     String fileRandomName = templateName + "-" + (isImportFail ? "importFail-" : "") + DateUtils.formatDate(new Date(), "yyyyMMddHHmmss") + "-"  + new Random().nextInt();
23     String exportFolder = getExportFilesPath() + templateName;
24     String filename = exportFolder + File.separator + fileRandomName + ".xlsx";
25 
26     log.info("Running Big Data Excel Download test 1");
27     log.info("Created " + list.size() + " data");
28     File file = new File(exportFolder);
29     if (!file.exists()) {
30         file.mkdirs();
31     }
32     try(InputStream  is = new FileInputStream(template)) {
33         assert is != null;
34         Workbook workbook = WorkbookFactory.create(is);
35         Transformer transformer = PoiTransformer.createSxssfTransformer(workbook);
36 
37         // 获得配置
38         JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator)transformer.getTransformationConfig().getExpressionEvaluator();
39         // 设置静默模式,不报警告(不设置成静默模式,运行过程会刷出大量警告日志,影响速度)
40         evaluator.getJexlEngine().setSilent(true);
41 
42         AreaBuilder areaBuilder = new XlsCommentAreaBuilder(transformer);
43         List<Area> xlsAreaList = areaBuilder.build();
44         Area xlsArea = xlsAreaList.get(0);
45 
46         Context context = new PoiContext();
47         context.putVar("data", list);
48         context.putVar("dataTitle", templateTitle);
49         context.getConfig().setIsFormulaProcessingRequired(false);
50         long startTime = System.nanoTime();
51 
52         xlsArea.applyAt(new CellRef("Result!A1"), context);
53         // 从模板中获得设置的sheet名
54         String sheetName = workbook.getSheetName(0);
55         // 因为下载下的Excel第一个sheet保留了模板的内容,需要删除第一个模板sheet
56         workbook.removeSheetAt(0);
57         workbook.setSheetName(0, sheetName);
58         long endTime = System.nanoTime();
59         log.info("Download data cost 1 time (s): " + (endTime - startTime) / 1000000000);
60         workbook.setForceFormulaRecalculation(true);
61         workbook.setActiveSheet(0);
62 
63         try(OutputStream os = new FileOutputStream(filename)) {
64             ((PoiTransformer) transformer).getWorkbook().write(os);
65         } catch (Throwable ex) {
66             log.warn(ex.getMessage());
67             result.put("success", false);
68             result.put("message", "导出失败" + ex.getMessage());
69             return result;
70         }
71         result.put("success", true);
72         result.put("message", fileRandomName);
73         return result;
74         
75     }catch (Exception e) {
76         log.error("导出失败!");
77     }
78     return result;
79 }

经测试,优化后下载速度提升很多,3万数据量,下载速度10秒;24万数据量,下载速度75秒。

 

=======================================================

原创文章,转载请注明 http://www.cnblogs.com/cheergo/,邮件avril376495267@qq.com,欢迎各位与我展开交流!

 =======================================================


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM