Excel导入导出
sz-admin 集成了 EasyExcel 库,以简化 Excel 文件的导入和导出流程。EasyExcel 是一个高效的处理 Excel 文件的 Java 库,它提供了丰富的功能来满足各种数据处理需求。更多关于 EasyExcel 的详细信息和高级操作,请访问 EasyExcel 官网。
本文档将介绍 sz-admin中 EasyExcel 的一些扩展操作,帮助您更高效地处理 Excel 数据。
基础操作
导入
步骤一:定义导入实体
创建一个名为
XXXImportDTO
的导入结构实体,并使用@ExcelProperty
等注解来标记 Excel 中的列。以下是一个示例:
TeacherStatisticsImportDTO.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 方法示例代码
@SneakyThrows
@Override
public void importExcel(ImportExcelDTO dto) {
...
ExcelResult<TeacherStatisticsImportDTO> excelResult = ExcelUtils.importExcel(dto.getFile().getInputStream(), TeacherStatisticsImportDTO.class, true);
...
}
- 步骤三:处理导入结果
excelResult 示例代码
...
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 示例代码
@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方法示例代码
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 操作。
以下是如何使用这些注解的详细说明,以“讲师区分类型”字典为例。
Key | Value | 字典类型 |
---|---|---|
1000001 | 正常 | 讲师区分类型 |
1000002 | 禁用 | 讲师区分类型 |
1000003 | 禁言 | 讲师区分类型 |
导入字典映射
在导入实体的对应字段上应用 @DictFormat
注解,以指定相应的字典项。这一操作确保在导入过程中,字典中的显示值(Value)如“正常”将被自动转换为对应的键值(Key),例如从 “正常” 转换为 1000001。
...
@ExcelProperty(value = "讲师区分类型")
@DictFormat(dictType = "account_status")
@Schema(description = "讲师区分类型")
private String teacherCommonType;
...
效果
导出字典映射
在导出实体的对应字段上添加@DictFormat注解指定字典项。这一操作确保在导入过程中,字典中的键值(Key)将被自动转换为对应的显示值(Value),例如从 1000001转换为 “正常” 。
...
@ExcelProperty(value = "讲师区分类型")
@DictFormat(dictType = "account_status")
@Schema(description = "讲师区分类型")
private String teacherCommonType;
...
效果
合并单元格相同项
为了在导出的 Excel 文件中对具有相同值的列进行单元格合并,您可以在导出实体的对应字段上添加 @CellMerge
注解。这将自动合并列中相同的项,从而提供一个更加整洁和易于阅读的表格视图。
...
@ExcelProperty(value = "统计年月")
@Schema(description = "统计年月")
@CellMerge
private String duringTime;
...
效果