POI -- 02 -- Excel大数据导出
之前提及了 Excel 大数据的读取,现在我们再来了解下 Excel 大数据的导出
一、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 时,速度是相当之快的

浙公网安备 33010602011771号