-
Notifications
You must be signed in to change notification settings - Fork 324
Excel流式导出
清沐 edited this page Nov 17, 2023
·
42 revisions
流式导出与默认导出不同之处在于:流式导出采用生产者消费者模式,允许分批获取数据,分批写入Excel,且默认采用SXSSF模式,内存占用量极低,真正意义上实现海量数据导出,另外,流式导出支持zip压缩包等独有特性。
使用流式导出分为三步:
- 配置
DefaultStreamExcelBuilder<ArtCrowd> streamExcelBuilder = DefaultStreamExcelBuilder
.of(ArtCrowd.class) // 如导出Map类型数据,请使用of(Map.class)
.threadPool(Executors.newFixedThreadPool(10))// 线程池,可选
.templateHandler(FreemarkerTemplateHandler.class)// 追加模板数据,可选,适合极度个性化数据导出
.capacity(10_000)// 容量设定,在主动划分excel使用,可选
.start();
如需向已存在Excel中追加数据,请使用
of(ArtCrowd.class, Paths.get("/user.xlsx"))
或of(ArtCrowd.class, new FileInputStream(new File("/user.xlsx")))
,需要注意的是,追加的文件内容必须和Bean一致,且目前暂不支持多sheet追加。
- 数据追加
append参数可为列表,也可为单个数据,建议使用单个数据追加,如Bean、Map
// streamExcelBuilder.append(data);
streamExcelBuilder.asyncAppend(this::getDataList); // 异步追加,屏蔽多线程处理细节
在某些情况下,可能需要个性化的表头,或者汇总等等,这些需求可能会涉及合并行、列、样式等复杂布局,DefaultStreamExcelBuilder
本身对Bean的能力不足以支撑,版本3.6.0以及以后,DefaultStreamExcelBuilder
支持模板的追加,在模板中定义复杂布局,追加模板方式如下:
DefaultStreamExcelBuilder<ArtCrowd> streamExcelBuilder = DefaultStreamExcelBuilder
.of(ArtCrowd.class)
.templateHandler(FreemarkerTemplateHandler.class)// 追加模板数据,可选,适合极度个性化数据导出
.start();
Map<String,Object> dataMap=new HashMap<>();
dataMap.put("title","测试");
streamExcelBuilder.append("/templates/xxx.ftl",dataMap);
- 完成构建
Workbook workbook = streamExcelBuilder.build();
如需最大化提升导出性能,请调用
noStyle()
方法全面禁止样式.
DefaultStreamExcelBuilder默认采用SXSSF模式(内存占用低)导出,该模式下不支持自动列宽.
附件导出示例:
try-with-resource方式不可返回Workbook,因为在close方法中会关闭Wrokbook
try (DefaultStreamExcelBuilder<ArtCrowd> streamExcelBuilder = DefaultStreamExcelBuilder
.of(ArtCrowd.class)
.threadPool(Executors.newFixedThreadPool(10))
.start()) {
for (int i = 0; i < 100; i++) {
// 数据追加
streamExcelBuilder.asyncAppend(this::getDataList);
}
// 最终构建
Workbook workbook = defaultExcelBuilder.build();
// for javax.servlet
AttachmentExportUtil.export(workbook, "艺术生信息", response);
// for jakarta.servlet
AttachmentV2ExportUtil.export(workbook, "艺术生信息", response);
}
多文件导出示例:
设置Excel容量(capacity(10_000)),如设置,则当Excel的行数达到容量后产生新的Excel
try (DefaultStreamExcelBuilder<ArtCrowd> streamExcelBuilder = DefaultStreamExcelBuilder
.of(ArtCrowd.class)
.threadPool(Executors.newFixedThreadPool(10))
.capacity(10_000)
.start()) {
......
// 最终构建
List<Path> paths = streamExcelBuilder.buildAsPaths();
// do something
}
zip导出示例:
设置Excel容量(capacity(10_000))
try (DefaultStreamExcelBuilder<ArtCrowd> streamExcelBuilder = DefaultStreamExcelBuilder
.of(ArtCrowd.class)
.threadPool(Executors.newFixedThreadPool(10))
.capacity(10_000)
.start()) {
......
// 最终构建
Path zip = streamExcelBuilder.buildAsZip("test");
// for javax.servlet
AttachmentExportUtil.export(zip,"finalName.zip",response);
// for jakarta.servlet
AttachmentV2ExportUtil.export(zip,"finalName.zip",response);
}
导出使用注解
- @ExcelModel(includeAllField,excludeParent,workbookType,sheetName,useFieldNameAsTitle,defaultValue)
- @IgnoreColumn
- @ExcelColumn(title,order,format,groups,defaultValue)
对应注解详情请见:注解
-
Overview
概述 -
FAQ
常见问题 -
Dependency adding
依赖添加 -
Excel/Csv import
Excel/Csv导入 - 一对多导入
-
Excel default export
默认导出 -
Excel streaming export
流式导出 -
Dynamic export
动态导出 -
Excel template build
模板构建 -
CSV export
csv导出 -
Multiple sheet import
多sheet导入 -
Multiple sheet export
多sheet导出 - 聚合列&聚合导出
-
Custom style
自定义样式 -
Multilevel header
多级表头 -
Wrap within cell
单元格内换行 -
Image export
图片导出 -
Image import
图片导入 -
Hyperlink
链接 - 读取链接
-
Template row height setting
模板行高度设置 -
Drop-down-list
下拉列表 -
Custom convert
写入自定义转化 -
Formula usage
公式使用 -
Template cell setting
单元格设置 -
Header freeze
区域冻结 - 提示
-
Style support
样式支持 - 添加水印
- 按列读取
- 单元格斜线绘制
- 设置批注
- 版本日志