本人这段时间接手一个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,欢迎各位与我展开交流!
=======================================================