JXL java excel导出,并在数据量过大时进行分工作薄处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/diaomeng11/article/details/82897918

使用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支持多工作簿导出,对开发也方便了许多。

猜你喜欢

转载自blog.csdn.net/diaomeng11/article/details/82897918