public class ExcelHelper {
...
* 导出并获取excel的sid
*
* <pre>
* 使用list数据导出。适用于数据量比较小的导出,推荐1W行下使用
* 注意,如果需要查询的数据量较大,会增大获取sid接口耗时
* </pre>
*
* @param fileName 文件名
* @param clazz excel对象类型
* @param data 要导出的数据
* @param <T> excel对象类
* @return sid 导出唯一标识
*/
public <T> String exportForSid(final String fileName, Class<T> clazz, List<T> data) {
return exportForSid(fileName, sid -> generateExcelFile(sid, fileName, clazz, data));
}
* 导出并获取excel的sid
*
* <pre>
* 根据查询列表的方法导出excel。
* 因为传入查询方法后内部会异步去查询,故该方式不会产生接口超时的问题
* 该方式可复用列表查询的方法,推荐老项目改造时使用该方式
* </pre>
*
* @param fileName 文件名。无需拼接.xlsx后缀
* @param clazz excel对象类型
* @param supplier 查询数据列表的方法
* @param <T> excel对象类
* @return sid 导出唯一标识
*/
public <T> String exportForSid(final String fileName, Class<T> clazz, Supplier<List<T>> supplier) {
return exportForSid(fileName, sid -> generateExcelFile(sid, fileName, clazz, supplier.get()));
}
*************** private start ***************
*/
* 导出并获取excel的sid
*
* <pre>
* 根据分页查询的方法导出excel
* 注意该分页查询的方法入参必须继承 {@code BizPageRequest},且返回值类型为 {@code BizPageInfo}
* 该方式可复用列表查询的方法,推荐新项目接入时采用该方式
* </pre>
*
* @param fileName 文件名。无需拼接.xlsx后缀
* @param clazz excel对象类型
* @param request 查询参数
* @param supplier 分页查询方法
* @param <T> excel对象类
* @return sid 导出唯一标识
*/
public <T> String exportForSid(final String fileName, Class<T> clazz, BizPageRequest request, Supplier<BizPageInfo<T>> supplier) {
return exportForSid(fileName, sid -> generateExcelFile(sid, fileName, clazz, request, supplier));
}
* 导出并获取excel的sid
*
* @param fileName 文件名
* @param generateFileFunction 生成excel文件的方法
* @return sid 导出唯一标识
*/
private <T> String exportForSid(final String fileName, Function<String, File> generateFileFunction) {
final String sid = UUID.randomUUID().toString();
this.syncExportResult(sid, fileName, ExportStatusEnum.GENERATED, null);
executor.execute(() -> {
File tempFile = null;
ExportStatusEnum exportStatus = ExportStatusEnum.FAIL;
String url = null;
try {
tempFile = generateFileFunction.apply(sid);
url = this.uploadExcelFile(tempFile);
if (StringUtil.isNotEmpty(url)) {
exportStatus = ExportStatusEnum.SUCCESS;
}
} catch (Exception e) {
log.error("导出失败", e);
} finally {
this.syncExportResult(sid, fileName, exportStatus, url);
if (tempFile != null && tempFile.exists()) {
tempFile.delete();
}
}
});
return sid;
}
* 生成excel文件
*
* @param sid 导出唯一标识
* @param sheetName 导出sheet名称
* @param clazz excel对象模型
* @param data 导出的数据
* @return excel文件
*/
private <T> File generateExcelFile(String sid, String sheetName, Class<T> clazz, List<T> data) {
File tempFile;
try {
tempFile = File.createTempFile(sid, EXPORT_UPLOAD_EXTENSIONS);
} catch (IOException e) {
throw new RuntimeException(e);
}
ExcelWriter excelWriter = EasyExcel.write(tempFile, clazz).build();
sheetName = this.encodeFileName(sheetName);
WriteSheet writeSheet = EasyExcel.writerSheet(sheetName)
.registerConverter(new LocalTimeConvert())
.registerConverter(new LocalDateConvert())
.registerConverter(new LocalDateTimeConvert())
.build();
excelWriter.write(data, writeSheet);
excelWriter.finish();
return tempFile;
}
* 生成excel文件
*
* @param sid 导出唯一标识
* @param sheetName 导出sheet名称
* @param clazz excel对象模型
* @param request 查询参数
* @param supplier 分页查询方法
* @return excel文件
*/
private <T> File generateExcelFile(String sid, String sheetName, Class<T> clazz, BizPageRequest request, Supplier<BizPageInfo<T>> supplier) {
File tempFile;
try {
tempFile = File.createTempFile(sid, EXPORT_UPLOAD_EXTENSIONS);
} catch (IOException e) {
throw new RuntimeException(e);
}
ExcelWriter excelWriter = EasyExcel.write(tempFile, clazz).build();
sheetName = this.encodeFileName(sheetName);
WriteSheet writeSheet = EasyExcel.writerSheet(sheetName).needHead(Boolean.FALSE)
.registerConverter(new LocalTimeConvert())
.registerConverter(new LocalDateConvert())
.registerConverter(new LocalDateTimeConvert())
.build();
WriteTable writeTable;
BizPageInfo<T> bizPageInfo;
int pageIndex = 1;
request.setPageNum(1);
request.setPageSize(QUERY_LIMIT);
do {
writeTable = EasyExcel.writerTable(pageIndex).needHead(pageIndex == 1).build();
request.setPageNum(pageIndex);
bizPageInfo = supplier.get();
excelWriter.write(bizPageInfo.getList(), writeSheet, writeTable);
pageIndex++;
} while (bizPageInfo.getHasNextPage() && pageIndex < PageLoopHelper.PAGE_LOOP_LIMIT);
excelWriter.finish();
return tempFile;
}
}
评论