java 使用POI導出百萬級數據


先看結果吧,這只是測試其中有很多因數影響了性能。

表總數為:7千多萬,測試導出100萬

 

 

 表字段有17個字段

最終excel大小有60多兆

 

 

 

 

 

總耗時:126165毫秒 差不多2分多鍾

 

 

其核心簡單來說就是分批寫入,就是分頁一樣。這樣的好處就是不會內存溢出。

(真的不會寫博客。。。)

直接上代碼了

public void download(HttpServletResponse response) throws Exception{
        // 一次讀取的數量
        int listCount  = 200000;
        // 求數據庫中導出數據的總行數
        Integer totalCount = analysisMapper.totalNum();
        // 根據行數求數據獲取次數
        int pageSize = totalCount % listCount > 0 ? (totalCount / listCount) + 1 : totalCount / listCount;
        //創建poi導出數據對象
        SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook();
        //創建sheet頁
        SXSSFSheet sheet = sxssfWorkbook.createSheet();
        //設置表頭信息
        SXSSFRow headRow = sheet.createRow(0);
        List<String> indexList = new ArrayList<>();
        for (int pg = 0; pg < pageSize; pg++) {
            List<Map<String, Object>> list = analysisMapper.downloadData(pg * listCount, listCount);
            if(pg == 0 && list.size() > 0){
                Map<String, Object> map = list.get(0);
                for(Map.Entry<String,Object> entry : map.entrySet()){
                    indexList.add(entry.getKey());
                }
                for (int j = 0; j < indexList.size(); j++) {
                    headRow.createCell(j).setCellValue(indexList.get(j));
                }
            }
            // 遍歷上面數據庫查到的數據
            for (int i = 0; i < list.size(); i++) {
                SXSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1);
                for (int j = 0; j < indexList.size(); j++) {
                    dataRow.createCell(j).setCellValue(list.get(i).get(indexList.get(j)).toString());
                }
            }
        }
        createFile(response, sxssfWorkbook);
    }

 

private void createFile(HttpServletResponse response,SXSSFWorkbook sxssfWorkbook) throws Exception{
        // 下載導出
        String filename = UUID.randomUUID().toString();
        // 設置頭信息
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/vnd.ms-excel");
        //設置成xlsx格式
        response.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(filename + ".xlsx","UTF-8"));
        //創建輸出流
        ServletOutputStream outputStream = response.getOutputStream();
        //寫入數據
        sxssfWorkbook.write(outputStream);
        //關閉流
        outputStream.close();
        sxssfWorkbook.close();
    }

若果有啥問題請指正。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM