一个搭配Easyexcel3模板导出的抽象类
@Slf4j
public abstract class AbstractTemplateExport<Q extends QoI, D> implements ReportI {
private static final String TEMPORARY_PATH = "tmp";
protected static final String EXPORT_FILE_SUFFIX = ".xlsx";
protected static final DateTimeFormatter FILE_NAME_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");
protected final Module getModule() {
return Module.getByClass(this.getClass());
}
/*
* excel模板名 (*.xlsx)
* */
protected String getTemplateName(Q qo) {
return PropertiesUtils.get(getModule()).getProperty("email.report.template");
}
/*
*导出后的文件名字 (*.xlsx)
*/
public String getOriginalFileName(Q qo) {
return getOriginalFileName(qo, EXPORT_FILE_SUFFIX);
}
public String getOriginalFileName(Q qo, String suffix) {
String t1 = qo.getStartTime().format(FILE_NAME_TIME_FORMATTER);
String t2 = qo.getEndTime().format(FILE_NAME_TIME_FORMATTER);
return String.join("_", getModule().name().toLowerCase(), t1, t2) + suffix;
}
/*
* 要导出的数据 (一定要有getter)
* */
protected abstract D getExportData(Q qo);
/*
* 自定义填充时覆写
* */
public void customFill(ExcelWriter excelWriter, D data) {
WriteSheet writeSheet = EasyExcelFactory.writerSheet().build();
excelWriter.fill(data, writeSheet);
}
protected Path temporaryFilePath(String suffix) {
Paths.get(TEMPORARY_PATH, getModule().toString().toLowerCase()).toFile().mkdirs();
int i = 0;
Path path = Paths.get(TEMPORARY_PATH, getModule().name().toLowerCase(), UUID.randomUUID() + suffix);
while (path.toFile().exists()) {
if (i++ > 10) {
throw new NoSuchElementException("获取不到可用文件名");
}
path = Paths.get(TEMPORARY_PATH, getModule().name().toLowerCase(), UUID.randomUUID() + suffix);
}
return path;
}
protected Path temporaryFilePath() {
return temporaryFilePath(EXPORT_FILE_SUFFIX);
}
public WriteHandler[] getWriteHandlers(D d) {
return new WriteHandler[0];
}
public Path export(Q qo) throws IOException {
Path path = temporaryFilePath();
ExcelWriterBuilder excelWriterBuilder = EasyExcelFactory.write(path.toFile()).excelType(ExcelTypeEnum.XLSX);
D exportData = getExportData(qo);
WriteHandler[] writeHandlers = getWriteHandlers(exportData);
for (WriteHandler handler : writeHandlers) {
excelWriterBuilder.registerWriteHandler(handler);
}
try (InputStream inputStream = TemplateUtils.getInputStream(getTemplateName(qo));
ExcelWriter excelWriter = excelWriterBuilder.withTemplate(inputStream).build();) {
customFill(excelWriter, exportData);
excelWriter.finish();
}
log.info("已导出{}", path);
return path;
}
protected final <T extends QoI> T getTimeFromArgs(Args args, T qo) {
if (args.getStartTime() != null && args.getEndTime() != null) {
qo.setStartTime(args.getStartTime());
qo.setEndTime(args.getEndTime());
if (Duration.between(qo.getStartTime(), qo.getEndTime()).toDays() > 366) {
throw new IllegalArgumentException("时间范围不能超过12个月");
}
} else {
LocalDate localDate = LocalDate.now().minusMonths(1);
LocalDate firstDayOfMonth = LocalDate.of(localDate.getYear(), localDate.getMonth(), 1);
LocalDate lastDayOfMonth = firstDayOfMonth.with(TemporalAdjusters.lastDayOfMonth());
qo.setStartTime(firstDayOfMonth.atStartOfDay());
qo.setEndTime(lastDayOfMonth.atTime(LocalTime.MAX));
}
return qo;
}
}