一个搭配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;
  }

}

 

posted @ 2024-05-15 00:21  Jackie_JK  阅读(12)  评论(0编辑  收藏  举报