Skip to content

Excel导入导出

sz-admin 集成了 EasyExcel 库,以简化 Excel 文件的导入和导出流程。EasyExcel 是一个高效的处理 Excel 文件的 Java 库,它提供了丰富的功能来满足各种数据处理需求。更多关于 EasyExcel 的详细信息和高级操作,请访问 EasyExcel 官网

本文档将介绍 sz-admin中 EasyExcel 的一些扩展操作,帮助您更高效地处理 Excel 数据。

基础操作

导入

  • 步骤一:定义导入实体

    创建一个名为 XXXImportDTO 的导入结构实体,并使用 @ExcelProperty等注解来标记 Excel 中的列。以下是一个示例:

TeacherStatisticsImportDTO.java 示例代码
java
@Data
@Schema(description = "TeacherStatistics导入DTO")
public class TeacherStatisticsImportDTO {

    @ExcelProperty(value = "统计年限")
    @Schema(description = "统计年限")
    private String year;

    @ExcelProperty(value = "统计月份")
    @Schema(description = "统计月份")
    private String month;

    @ExcelProperty(value = "统计年月")
    @Schema(description = "统计年月")
    private String duringTime;

    @ExcelProperty(value = "教师id")
    @Schema(description = "教师id")
    private String teacherId;

    @ExcelProperty(value = "讲师区分类型")
    @DictFormat(dictType = "account_status")
    @Schema(description = "讲师区分类型")
    private String teacherCommonType;

    @ExcelProperty(value = "授课总数")
    @Schema(description = "授课总数")
    private Integer totalTeaching;

    @ExcelProperty(value = "服务班次数")
    @Schema(description = "服务班次数")
    private Integer totalClassCount;

    @ExcelProperty(value = "课时总数")
    @Schema(description = "课时总数")
    private BigDecimal totalHours;

    @ExcelProperty(value = "核对状态")
    /* @DictFormat(dictType = "account_status") */
    @Schema(description = "核对状态")
    private String checkStatus;

    @Schema(description = "核对时间")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime checkTime;

    @Schema(description = "最近一次同步时间")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime lastSyncTime;

    @ExcelProperty(value = "备注")
    @Schema(description = "备注")
    private String remark;

}
  • 步骤二:读取 Excel 文件

使用 ExcelUtils.importExcel 方法来读取 Excel 文件并获取导入结果。以下是一个示例:

importExcel 方法示例代码
java
  @SneakyThrows
  @Override
  public void importExcel(ImportExcelDTO dto) {
...        
      ExcelResult<TeacherStatisticsImportDTO> excelResult = ExcelUtils.importExcel(dto.getFile().getInputStream(), TeacherStatisticsImportDTO.class, true);
...
  }
  • 步骤三:处理导入结果
excelResult 示例代码
java
...
      List<TeacherStatisticsImportDTO> list = excelResult.getList();
      List<String> errorList = excelResult.getErrorList();
      String analysis = excelResult.getAnalysis();
      System.out.println(" analysis : " + analysis);
      System.out.println(" isCover : " + dto.getIsCover());
      System.out.println("list ==" + JsonUtils.toJsonString(list));
  	// TODO 你的业务
...

导出

  • 步骤一:定义导出实体

    创建一个数据模型类来定义导出的数据结构,并使用 @ExcelProperty@ExcelIgnore 注解来指定哪些字段应该被包含在 Excel 文件中。以下是一个示例:

TeacherStatisticsVO.java 示例代码
java
@Data
@Schema(description = "TeacherStatistics返回vo")
public class TeacherStatisticsVO {

  @ExcelIgnore
  @Schema(description = "id")
  private Long id;

  @ExcelProperty(value = "统计年限")
  @Schema(description = "统计年限")
  private String year;

  @ExcelProperty(value = "统计月份")
  @Schema(description = "统计月份")
  private String month;

  @ExcelProperty(value = "统计年月")
  @Schema(description = "统计年月")
  private String duringTime;

  @ExcelProperty(value = "教师id")
  @Schema(description = "教师id")
  private String teacherId;

  @ExcelProperty(value = "讲师区分类型")
  @DictFormat(dictType = "account_status", isSelected = true)
  @Schema(description = "讲师区分类型")
  private String teacherCommonType;

  @ExcelProperty(value = "授课总数")
  @Schema(description = "授课总数")
  private Integer totalTeaching;

  @ExcelProperty(value = "服务班次数")
  @Schema(description = "服务班次数")
  private Integer totalClassCount;

  @ExcelProperty(value = "课时总数")
  @Schema(description = "课时总数")
  private BigDecimal totalHours;

  @ExcelProperty(value = "核对状态")
  @Schema(description = "核对状态")
  @DictFormat(dictType = "account_status")
  private Integer checkStatus;

  @ExcelProperty(value = "核对时间")
  @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  @Schema(description = "核对时间")
  private LocalDateTime checkTime;

  @ExcelProperty(value = "最近一次同步时间")
  @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  @Schema(description = "最近一次同步时间")
  private LocalDateTime lastSyncTime;

  @ExcelProperty(value = "备注")
  @Schema(description = "备注")
  private String remark;

  @ExcelProperty(value = "创建人id")
  @DictFormat(dictType = "dynamic_user_options")
  @Schema(description = "创建人id")
  private Long createId;

}
  • 步骤二:执行导出操作

使用 ExcelUtils.exportExcel 方法将数据导出到 Excel 文件中。以下是一个示例:

exportExcel方法示例代码
java
  public void exportExcel(TeacherStatisticsListDTO dto, HttpServletResponse response) {
  // 获取数据列表
  List<TeacherStatisticsVO> list = list(dto);
  // 获取响应的输出流
  ServletOutputStream os = response.getOutputStream();
  // 执行导出操作
  ExcelUtils.exportExcel(list, "教师统计", TeacherStatisticsVO.class, os, true);
}

拓展

NOTE

sz-admin 提供了 @DictFormat@CellMerge 两个自定义注解,以简化常见的 Excel 操作。

以下是如何使用这些注解的详细说明,以“讲师区分类型”字典为例。

KeyValue字典类型
1000001正常讲师区分类型
1000002禁用讲师区分类型
1000003禁言讲师区分类型

导入字典映射

在导入实体的对应字段上应用 @DictFormat 注解,以指定相应的字典项。这一操作确保在导入过程中,字典中的显示值(Value)如“正常”将被自动转换为对应的键值(Key),例如从 “正常” 转换为 1000001

java
...
    @ExcelProperty(value = "讲师区分类型")
    @DictFormat(dictType = "account_status")
    @Schema(description = "讲师区分类型")
    private String teacherCommonType;    
...

效果

import-excel-column

import-excel-console.png

导出字典映射

在导出实体的对应字段上添加@DictFormat注解指定字典项。这一操作确保在导入过程中,字典中的键值(Key)将被自动转换为对应的显示值(Value),例如从 1000001转换为 “正常”

java
...
    @ExcelProperty(value = "讲师区分类型")
    @DictFormat(dictType = "account_status")
    @Schema(description = "讲师区分类型")
    private String teacherCommonType;
...

效果

export-excel-sql.png

export-excel-xls.png

合并单元格相同项

为了在导出的 Excel 文件中对具有相同值的列进行单元格合并,您可以在导出实体的对应字段上添加 @CellMerge 注解。这将自动合并列中相同的项,从而提供一个更加整洁和易于阅读的表格视图。

java
...
    @ExcelProperty(value = "统计年月")
    @Schema(description = "统计年月")
    @CellMerge
    private String duringTime;  
...

效果

export-cell-merge.png