本人這段時間接手一個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,歡迎各位與我展開交流!
=======================================================
