Java導出百萬級數據到Excel中

使用POI導出大批量數據到Excel操作步驟:

第一步: 你的自己準備一個大批量的數據 最好能超過65536條以上

分享一個SQL文件 鏈接:https://pan.baidu.com/s/13sL7hATEWUTZCqrUHAbzJA 提取碼:gp60

第二部: 開始編寫代碼,查詢所有的數據,將結果集出傳遞給導出的工具類進行導出

 	@RequestMapping("/export")
    public void exportBigDataToExcel(User user,HttpServletRequest request, HttpServletResponse respose) {
        // 創建時間格式變量後面要重新格式化日期時間
        SimpleDateFormat sdf_1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		// 設置文件名稱
		String exportFileName = "用戶信息";
		// 根據條件獲取數據庫中的所有數據
        List<User> bigDataList= userService.exportBigDataToExcel(user);
        // 獲取數據總行
        int totalRowNum = memberIntegralDtoList.size();
        try {
            //創建SXSSFWorkbook對象(excel的文檔對象) 
            SXSSFWorkbook wb = new SXSSFWorkbook();
            /* 設定單個sheet的最大數據行數 博主選的是2003 
            	提醒: excel單個sheet的最大行 
            		2003版:65536行 256列;
            		2007版:1048576行 16384列;
					2010版:1048576行 16384列;
					2013版:1048576行 16384列 */
            int maxRowNum = 60000;
            // 根據查詢的數據總條數計算需要多少個sheet 來存儲數據
            int sheets = totalRowNum % 60000 == 0 ? (totalRowNum / maxRowNum) : (totalRowNum / maxRowNum + 1);
            // 循環創建sheet 並寫入數據
            for (int i = 0; i < sheets; i++) {
                // 創建SheetName
                SXSSFSheet sheet = wb.createSheet("用戶" + i);
                // 計算單sheet的數據起止範圍
                int begin = (i - 1) * maxRowNum;
                int end = maxRowNum * i;
                // 此處需要進行結束數據範圍的比對  當 i=3時數據截止是18W 但我們查詢出來的數據是15W 就會異常 所以需要進行比對
                end = Math.min(end, totalRowNum);
                // 設定一個Excel的行數用來進行Excel數據寫入換行的
                int num = 0;
                //  最重要的 寫入數據到了
                for (int j = begin; j < end; j++) {
                    // 定義一個Excel的行對象
                    SXSSFRow rowContent = null;
                    // 寫入表頭信息
                    if (num == 0) {
                        //在sheet裏創建第一行,參數爲行索引(excel的行),可以是0~60000之間的任何一個
                        SXSSFRow rowTitle = sheet.createRow(num);
                        //創建單元格並設置單元格內容
                        rowTitle.createCell(0).setCellValue("用戶編號");
                        rowTitle.createCell(1).setCellValue("用戶名稱");
                        rowTitle.createCell(2).setCellValue("用戶性別");
                        rowTitle.createCell(3).setCellValue("用戶電話");
                        rowTitle.createCell(4).setCellValue("用戶身份證");
                        rowTitle.createCell(5).setCellValue("家庭住址");
                        rowTitle.createCell(6).setCellValue("用戶暱稱");
                        rowTitle.createCell(7).setCellValue("用戶狀態");
                    }
                    rowContent = sheet.createRow(++num);
                    //在sheet裏創建第三行
                    rowContent.createCell(0).setCellValue(bigDataList.get(j).getUserId() == null ? "未知" : bigDataList.get(j).getUserId());
                    rowContent.createCell(1).setCellValue(bigDataList.get(j).getUserName() == null ? "未知" : bigDataList.get(j).getUserName());
                    rowContent.createCell(2).setCellValue(bigDataList.get(j).getUserSex() == null ? "未知" : bigDataList.get(j).getUserSex());
                    rowContent.createCell(3).setCellValue(bigDataList.get(j).getUserPhone() == null ? "未知" : bigDataList.get(j).getUserPhone());
                    rowContent.createCell(4).setCellValue(bigDataList.get(j).getUserCard() == null ? "未知" : bigDataList.get(j).getUserCard());
                    rowContent.createCell(5).setCellValue(bigDataList.get(j).getAddress() == null ? "未知" : bigDataList.get(j).getAddress());
                    rowContent.createCell(6).setCellValue(bigDataList.get(j).getNickName() == null ? "未知" : bigDataList.get(j).getNickName());
                    rowContent.createCell(7).setCellValue(bigDataList.get(j).getUserState() == null ? "未知" : bigDataList.get(j).getUserState());
                }
            }
            //輸出Excel文件
            OutputStream output = response.getOutputStream();
            response.reset();
            // 設置輸出類型和文件名稱
            response.setHeader("Content-disposition", "attachment; filename="+exportFileName+".xls");
            response.setContentType("application/msexcel");
            wb.write(output);
            output.close();
        } catch (Exception e) {
            e.getMessage();
        } 
        logger.info("數據導出完成,共導出:"+totalRowNum+" 條數用戶信息")
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章