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