help wanted
Metriche repository
- Star
- (33.728 star)
- Metriche merge PR
- (Nessuna PR mergiata in 30 g)
Descrizione
`String filePath = ""; //导出的文件名 String exportFileName = encodingFilename(fileName); //文件在服务器的路径 String localFilePath = getAbsoluteFile(exportFileName);
//构建 writer
ExcelWriter writer = EasyExcel.write(localFilePath, clazz)
// 自动适配
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
.registerWriteHandler(new ImageCellWriteHandler())
.registerWriteHandler(new CommonStyleStrategy())
.excelType(ExcelTypeEnum.XLSX)
.includeColumnFieldNames(Arrays.asList(query.getExports().split(CommonConstants.STR_COMMA)))
// 大数值自动转换 防止失真
.registerConverter(new ExcelBigNumberConvert())
.build();
WriteSheet sheet = EasyExcel.writerSheet(fileName).build();
List<T> entityList = new ArrayList<>();
baseMapper.selectExportList(lqw, new ResultHandler<T>() {
int count = 0;
@Override
public void handleResult(ResultContext<? extends T> resultContext) {
T resultObject = resultContext.getResultObject();
entityList.add(resultObject);
count++;
if (entityList.size() >= batchSize) {
//处理数据
List<V> convert = entity2DtoFunction.apply(entityList, clazz);
writer.write(convert, sheet);
entityList.clear();
if (Objects.nonNull(taskId)) {
ExportMessageDto messageDto = new ExportMessageDto();
messageDto.setTopic(WebSocketConstants.EXPORT_PROCESS_TOPIC);
messageDto.setProcessStatus(AsyncTaskStatus.PROCESSING.getCode());
messageDto.setTaskId(taskId);
messageDto.setProcessRate(BigDecimal.valueOf(count).divide(BigDecimal.valueOf(totalCount), 4, RoundingMode.HALF_UP));
WebSocketUtils.sendMessage(LoginHelper.getUserId(), JSONUtil.toJsonStr(messageDto));
System.out.println(JSONUtil.toJsonStr(messageDto));
}
}
}
});
if (!entityList.isEmpty()) {
//处理数据
List<V> convert = entity2DtoFunction.apply(entityList, clazz);
writer.write(convert, sheet);
entityList.clear();
}
try {
writer.close();
} catch (Exception e) {
System.err.println("excelWrite关闭失败: " + e.getMessage());
}
//上传文件到oss
filePath = SpringUtils.getBean(OssService.class).uploadExcel(new File(localFilePath), "export");
try {
boolean delete = Files.deleteIfExists(Paths.get(localFilePath));
if (!delete) {
System.err.println("文件删除失败: " + localFilePath);
}
} catch (Exception e) {
System.err.println("删除文件时发生错误: " + e.getMessage());
}
return filePath;`
目前已经定位到writer.write(convert, sheet);这个方法耗时占比90%以上, 是我的用法错误吗, 已经排除了是几个样式处理器的问题, 去掉样式处理器一样很慢, 而且不考虑多次写入, 单次也如一样很慢