依赖jar包
引入包 |
版本 |
jdk |
1.8 |
spring boot |
2.7.4 |
easyexcel |
3.1.1 |
spring-boot-starter-validation |
2.7.4 |
spring-boot-starter-web |
2.7.4 |
allbs-common |
1.1.8 |
spring-boot-starter-aop |
2.7.4 |
使用
添加依赖
1 2 3 4 5
| <dependency> <groupId>cn.allbs</groupId> <artifactId>allbs-excel</artifactId> <version>1.1.8</version> </dependency>
|
1
| implementation 'cn.allbs:allbs-excel:1.1.8'
|
1
| implementation("cn.allbs:allbs-excel:1.1.8")
|
基本导出
当前特殊类型转换的只有java8的LocalDate和LocalDateTime以及TimeStamp 类型转换,如有其他特殊要求请联系我添加转换方法
java
1 2 3 4 5 6 7
| @ApiOperation(value = "excel导出") @GetMapping("exportExcel") @ExportExcel(name = "测试excel", sheets = @Sheet(sheetName = "第一个sheet")) public List<MeterAccountEntity> exportExcel() { List<MeterAccountEntity> accountEntities = meterAccountService.list(); return accountEntities; }
|
前端
1
| window.location.href = serverUrl + "/meterAccount/exportExcel";
|
定义字段名称、宽度、忽略字段等
注解 |
说明 |
@ColumnWidth |
设定宽度 |
@ExcelIgnore |
忽略该行 |
@ExcelProperty |
设定列名称 |
@ContentStyle |
样式设置各样式具体查看源码即可 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| @Data @ApiModel(value = "") @EqualsAndHashCode(callSuper = true) @Accessors(chain = true) @TableName("meter_account") public class MeterAccountEntity extends Model<MeterAccountEntity> {
private static final long serialVersionUID = 356241669539194507L;
@TableId(value = "id", type = IdType.AUTO) @ApiModelProperty(value = "") @ColumnWidth(10) private Long id;
@ApiModelProperty(value = "用户名") @ExcelProperty("用户名") @ContentStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 40) private String userName;
@ApiModelProperty(value = "密码") @ExcelProperty("密码") private String password;
@ApiModelProperty(value = "id") private String clientId;
@ApiModelProperty(value = "企业名称") private String unitName;
@ApiModelProperty(value = "0:正常1:逻辑删除") @TableLogic @ExcelIgnore private Integer delFlg;
@ApiModelProperty(value = "创建人id") @ExcelIgnore private Long createId;
@ApiModelProperty(value = "创建时间") private LocalDateTime createTime;
@ApiModelProperty(value = "更新人id") @ExcelIgnore private Long updateId;
@ApiModelProperty(value = "更新时间") private LocalDateTime updateTime;
@ApiModelProperty(value = "") @ExcelIgnore private Long unitId; }
|
FillPattern模式说明
fillForegroundColor颜色表
导出多个sheet,并加上密码
1 2 3 4 5 6 7 8 9 10
| @ApiOperation(value = "excel导出多sheet") @GetMapping("exportSheets") @ExportExcel(name = "多sheet导出", sheets = {@Sheet(sheetName = "第一个sheet"), @Sheet(sheetName = "第二个sheet")}, password = "chenqi") public List<List<MeterAccountEntity>> exportSheets() { List<MeterAccountEntity> accountEntities = meterAccountService.list(); List<List<MeterAccountEntity>> list = new ArrayList<>(); list.add(accountEntities.stream().filter(a -> a.getId() % 2 == 0).collect(Collectors.toList())); list.add(accountEntities.stream().filter(a -> a.getId() % 2 != 0).collect(Collectors.toList())); return list; }
|
读excel
注意实体类中千万不要加@Accessors(chain = true) 否则会读不到数据
导入时适用spring-boot-starter-validation字段校验,所有错误信息将会保存在BindingResult中,出现校验错误的行
将不会导入
方式一 使用注解@RequestExcel
1 2 3 4 5 6 7
| @PostMapping("importExcel") public String importExcel(@RequestExcel(ignoreEmptyRow = true) List<MeterAccountEntity> list, BindingResult bindingResult) { meterAccountService.saveBatch(list); List<ErrorMessage> errorMessageList = Convert.toList(ErrorMessage.class, bindingResult.getTarget()); List<String> resList = errorMessageList.stream().map(a -> "第" + a.getLineNum() + "行" + a.getErrors()).collect(Collectors.toList()); return StrUtil.join(StringPool.SEMICOLON, resList); }
|
方式二 文件流读取
1 2 3 4 5
| @PostMapping("/importExcel") public List<TestFirEntity> importExcel(MultipartFile file) throws IOException { List<TestFirEntity> list = EasyExcel.read(file.getInputStream()).head(TestFirEntity.class).sheet().doReadSync(); return list; }
|
方式三 添加监听器
监听器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| @Slf4j public class MeterAccountListener extends AnalysisEventListener<MeterAccountEntity> {
private static final int BATCH_COUNT = 5; List<MeterAccountEntity> list = new ArrayList<MeterAccountEntity>();
@Resource private MeterAccountService demoDAO;
@Override public void invoke(MeterAccountEntity data, AnalysisContext context) { log.info("解析到一条数据:{}", JSON.toJSONString(data)); list.add(data); if (list.size() >= BATCH_COUNT) { saveData(); list.clear(); } }
@Override public void doAfterAllAnalysed(AnalysisContext context) { saveData(); log.info("所有数据解析完成!"); }
private void saveData() { log.info("{}条数据,开始存储数据库!", list.size()); demoDAO.saveBatch(list); log.info("存储数据库成功!"); } }
|
controller
1 2 3 4 5 6 7 8 9
| @PostMapping("importExcel1") public String importExcel1(@RequestParam("file") MultipartFile file) throws IOException { ExcelReader excelReader = EasyExcel.read(file.getInputStream(), MeterAccountEntity.class, new MeterAccountListener()).build(); ReadSheet readSheet = EasyExcel.readSheet(0).build(); excelReader.read(readSheet); excelReader.finish(); return "success"; }
|
Entity
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| @Data @ApiModel(value = "") @EqualsAndHashCode(callSuper = true) @AllArgsConstructor @NoArgsConstructor @TableName("meter_account") public class MeterAccountEntity extends Model<MeterAccountEntity> { private static final long serialVersionUID = 356241669539194507L; @TableId(value = "id", type = IdType.AUTO) @ApiModelProperty(value = "") @ColumnWidth(10) @ExcelIgnore private Long id; @ApiModelProperty(value = "用户名") @ExcelProperty(value = "用户名", index = 0) @ContentStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 40) private String userName; @ApiModelProperty(value = "密码") @ExcelProperty(value = "密码", index = 1) private String password; @ApiModelProperty(value = "id") @ExcelProperty(index = 2) private String clientId; @ApiModelProperty(value = "企业名称") @ExcelProperty(index = 3) private String unitName; @ApiModelProperty(value = "0:正常1:逻辑删除") @TableLogic @ExcelIgnore private Integer delFlg; @ApiModelProperty(value = "创建人id") @ExcelIgnore private Long createId; @ApiModelProperty(value = "创建时间") @ExcelProperty(index = 4) private Date createTime; @ApiModelProperty(value = "更新人id") @ExcelIgnore private Long updateId; @ApiModelProperty(value = "更新时间") @ExcelProperty(index = 5) private Date updateTime; @ApiModelProperty(value = "") @ExcelIgnore private Long unitId; }
|