POI -- 02 -- Excel大数据导出

之前提及了 Excel 大数据的读取,现在我们再来了解下 Excel 大数据的导出


官方文档:SXSSF (Streaming Usermodel API)


一、Excel 导出工具类

    /**
     * 生成单个工作表
     *
     * @param rowNums 行数
     * @param columnNums 列数
     * @param filePath Excel保存路径
     */
    public void generateSingleSheet(int rowNums, int columnNums, String filePath) {
        // 在内存中保留100行数据,超出100行将刷新到磁盘中
        SXSSFWorkbook wb = new SXSSFWorkbook(100);
        Sheet sh = wb.createSheet("sheet1");
        // 行数据
        IntStream.range(0, rowNums).forEach(rowNum -> {
            Row row = sh.createRow(rowNum);
            // 列数据
            IntStream.range(0, columnNums).forEach(columnNum -> {
                Cell cell = row.createCell(columnNum);
                String address = new CellReference(cell).formatAsString();
                System.out.println(address);
                cell.setCellValue(address);
            });
        });
        try (FileOutputStream out = new FileOutputStream(filePath)) {
            wb.write(out);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 丢弃在磁盘上备份此工作表的临时文件
            wb.dispose();
        }
    }

    /**
     * 生成多个工作表
     *
     * @param rowNums 行数
     * @param columnNums 列数
     * @param sheetNums 工作表数
     * @param filePath Excel保存路径
     */
    public void generateMultipleSheets(int rowNums, int columnNums, int sheetNums, String filePath) {
        // 在内存中保留100行数据,超出100行将刷新到磁盘中
        SXSSFWorkbook wb = new SXSSFWorkbook(100);
        List<Sheet> sheetList = new ArrayList<>();
        IntStream.range(0, sheetNums).forEach(count -> {
            Sheet sheet = wb.createSheet("sheet" + (count + 1));
            sheetList.add(sheet);
        });
        sheetList.forEach(sheet -> {
            // 行数据
            IntStream.range(0, rowNums).forEach(rowNum -> {
                Row row = sheet.createRow(rowNum);
                // 列数据
                IntStream.range(0, columnNums).forEach(columnNum -> {
                    Cell cell = row.createCell(columnNum);
                    String address = new CellReference(cell).formatAsString();
                    System.out.println(address);
                    cell.setCellValue(address);
                });
            });
        });
        try (FileOutputStream out = new FileOutputStream(filePath)) {
            wb.write(out);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 丢弃在磁盘上备份此工作表的临时文件
            wb.dispose();
        }
    }
}

二、导出测试

  • 生成单个工作表

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        int rowNums = 10000;
        int columnNums = 100;
        LargeExcelExportUtil exportUtil = new LargeExcelExportUtil();
        exportUtil.generateSingleSheet(rowNums, columnNums, "C:\\Users\\Qi\\Desktop\\Excel.xlsx");
        long end = System.currentTimeMillis();
        System.out.println("共生成【" + (rowNums * columnNums) + "】条数据,耗时【" + (end - start) + "】毫秒" );
    }
    
    // 生成【1000000】条数据,耗时【11846】毫秒
    
  • 生成多个工作表

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        int rowNums = 10000;
        int columnNums = 100;
        int sheetnums = 5;
        LargeExcelExportUtil exportUtil = new LargeExcelExportUtil();
        exportUtil.generateMultipleSheets(rowNums, columnNums, sheetnums, "C:\\Users\\Qi\\Desktop\\Excel.xlsx");
        long end = System.currentTimeMillis();
        System.out.println("共生成【" + (rowNums * columnNums * sheetnums) + "】条数据,耗时【" + (end - start) + "】毫秒" );
    }
    
    // 生成【5000000】条数据,耗时【46611】毫秒
    
  • 从上面的测试中,我们可以看出,采用事件模型来导出大数据的 Excel 时,速度是相当之快的

posted @ 2019-06-03 21:25  GeneXu  阅读(117)  评论(0)    收藏  举报