JXL java excel導出,並在數據量過大時進行分工作薄處理

使用jxl需要導入對應jar包,maven下導入方式爲:

<dependency>
	<groupId>jexcelapi</groupId>
	<artifactId>jxl</artifactId>
	<version>2.6</version>
</dependency>

具體方法如下:


    private static int maxRow = 60000;
    /**
     * 添加工作薄並導入數據
     * @param workbook
     * @param sheetData
     * @param sheetIndex
     * @throws IOException
     * @throws RowsExceededException
     * @throws WriteException
     */
    public static int createSheet( WritableWorkbook workbook,ExcelSheetData sheetData,int sheetIndex) throws IOException, RowsExceededException, WriteException{
       //添加工作薄
        WritableSheet sheet = workbook.createSheet(sheetData.getName(), sheetIndex);
        //單元格
        Label label=null;
        //給第一行設置列名
        //第一行顏色
        WritableCellFormat wcf = new WritableCellFormat();
        wcf.setBackground(Colour.YELLOW);
        wcf.setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.THIN);
        //第一行固定添加編號
        label=new Label(0,0,"編號",wcf);
        sheet.addCell(label);
        sheet.setColumnView(0,10);
        for(int i=0;i<sheetData.getTitleList().size();i++){
            label=new Label(i+1,0,sheetData.getTitleList().get(i).getName(),wcf);
            //添加單元格
            sheet.addCell(label);
            sheet.setColumnView(i,sheetData.getTitleList().get(i).getWidth());
        }
        //導入數據
        int row = 0;
        for(int i=0;i<sheetData.getDataMapList().size();i++){
            row++;
            if (row>maxRow){//這裏,當數據條數大於6W時,爲防止數據溢出,將剩餘數據分到下一個工作薄以此類推
                sheet = workbook.createSheet(sheetData.getName()+"_"+(i/65535+1), ++sheetIndex);
                //第一行固定添加編號
                label=new Label(0,0,"編號",wcf);
                //添加單元格
                sheet.addCell(label);
                //設置單元格寬
                sheet.setColumnView(0,10);
                for(int j=0;j<sheetData.getTitleList().size();j++){
                    
                    label=new Label(j+1,0,sheetData.getTitleList().get(j).getName(),wcf);
                    sheet.addCell(label);
                    sheet.setColumnView(j+1,sheetData.getTitleList().get(j).getWidth());
                }
                row = 1;
            }
            int dataIndex = 0;
            label=new Label(0,row,(i+1)+"");
            sheet.addCell(label);
            for (Map.Entry<Integer,Object> dataMap : sheetData.getDataMapList().get(i).entrySet()) {
                label=new Label(dataMap.getKey(),row,dataMap.getValue().toString());
                sheet.addCell(label);
            }
        }
        return sheetIndex;
    }

這裏對數據條數進行檢查,如果數量過大則進行分工作薄處理

  /**
     * 通過文件方式生成excel並導出數據
     * createExcelToFile(fileName,sheetDataList) 方法簡化,只生成單個工作薄時使用
     * @param fileName 文件名稱
     * @param sheetData 工作薄數據類
     * @return
     * @throws IOException
     * @throws RowsExceededException
     * @throws WriteException
     */
    public static File createExcelOneSheetToFile(String fileName,ExcelSheetData sheetData) throws IOException, RowsExceededException, WriteException{
        List<ExcelSheetData> sheetDataList = new ArrayList<ExcelSheetData>();
        sheetDataList.add(sheetData);
        return createExcelToFile(fileName,sheetDataList);
    }

    /**
     * 通過文件方式生成excel並導出數據,可生成多個工作薄
     * @param fileName 文件名
     * @param sheetData 工作薄數據類
     * @throws IOException
     * @throws RowsExceededException
     * @throws WriteException
     */
    public static File createExcelToFile(String fileName, List<ExcelSheetData> sheetData) throws IOException, RowsExceededException, WriteException{
        File file = new File(fileName);
        //創建工作簿
        WritableWorkbook workbook=Workbook.createWorkbook(file);
        //創建sheet,設置第二三四..個sheet,依次類推即可
        int sheetIndex = 0;
        for (int i=0;i<sheetData.size();i++){
            sheetIndex = createSheet(workbook,sheetData.get(i),sheetIndex);
            sheetIndex++;
        }
        //寫入數據,一定記得寫入數據,不然你都開始懷疑世界了,excel裏面啥都沒有
        workbook.write();
        //最後一步,關閉工作簿
        workbook.close();
        return file;
    }

jxl支持多工作簿導出,對開發也方便了許多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章