解決java poi導出excel2003不能超過65536行的問題


java poi在導出數據到excel2003工作表中時一個工作表只能存儲65536行數據,如果超過這個數據就會失敗,excel2007並沒有這個問題,但是為了兼容性我們通常都是導出到2003版本上的。 

1、導出成xlsx格式。

2、達到某個數值就再創建一張工作表。

 

    /**
     * 如果達到50000條數據則重新創建工作表的邏輯
     */
    @Override
    public void exportExcel(List<HolidayItemForm> formList, ServletOutputStream outputStream){
        try {
            //工作表名后面的數字,如表1,表2
            int i = 0;
            //記錄總行數
            int rownum = 0;
            //記錄每個sheet的行數
            int tempnum = 0;
            //分頁條數達到此條數則創建工作表
            int page = 5;
            //創建工作薄
            HSSFWorkbook workbook = new HSSFWorkbook();
            //創建列標題欄樣式
            HSSFCellStyle cellStyle = ExcelUtils.createCellStyle(workbook, (short)10);
            while(true){
                //創建工作表並應用上面的樣式
                HSSFSheet sheet = ExcelUtils.createWorkbook(workbook,cellStyle,++i);
                rownum++;
                //將數據庫中的數據列表寫入excel中
                if(formList != null){
                    tempnum = 0;
                    for (int j=rownum-i; j<formList.size(); j++) {
                        //進入第2個sheet寫出的行數從第2條數據開始(++tempnum等於1,因為標題行占了1行)
                        HSSFRow row2 = sheet.createRow(++tempnum);
                        rownum++;
                        row2.createCell(0).setCellValue(formList.get(j).getUserId());
                        row2.createCell(1).setCellValue(formList.get(j).getUserName());
                        row2.createCell(2).setCellValue(formList.get(j).getDeptName());
                        row2.createCell(3).setCellValue(formList.get(j).getUserJob());
                        row2.createCell(4).setCellValue(formList.get(j).getTypeName());
                        row2.createCell(5).setCellValue(formList.get(j).getBeginDate());
                        row2.createCell(6).setCellValue(formList.get(j).getEndDate());
                        row2.createCell(7).setCellValue(formList.get(j).getHolidayHour());
                        row2.createCell(8).setCellValue(formList.get(j).getCreateDate());
                        //達到5條退出並創建另外一個sheet
                        if(rownum%page == 0){
                            break;
                        }
                    }
                }
                //如果記錄的行數等於集合的總行數則退出
                if((rownum-i) == formList.size()){
                    break;
                }
            }
            //輸出
            workbook.write(outputStream);
            workbook.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

 

參考:https://blog.csdn.net/wjycgl/article/details/53942818

 


免責聲明!

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



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