前言
EasyExcel是基于Java的开源项目,用于处理大量的Excel数据,相较于传统的Apache POI解决方案,具有更好的性能,特别是处理超大数据量的Excel文件时,可以有效地降低内存消耗。其主要特点包括:
- 低内存消耗:内存使用量几乎与文件数量量无关,取决于配置缓存的大小。
- 快速读写:通过流式处理Excel文件
- 简单易用
- 扩展性强
使用方式
1.引入alibaba的依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.0</version>
</dependency>
2.下载excel模板,通过配置使其成为静态资源
public class ResourcesConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
/** excel模板路径 */
registry.addResourceHandler("/excel/**")
.addResourceLocations("classpath:/templates/excel/")
.setCacheControl(CacheControl.maxAge(1, TimeUnit.DAYS).cachePublic());
}
3.导入数据,返回错误列表,并返回错误原因
@PostMapping("/importConsumer")
@ApiOperation(value = "导入客户")
public BaseResponse importConsumer(@RequestPart("file") MultipartFile file, HttpServletResponse response) {
consumerService.inportConsumer(file, response);
return BaseResponse.getSuccess();
}
@Data
public class ConsumerDTO {
/** 姓名 */
@ExcelProperty(value = "姓名")
private String name ;
/** 电话 */
@ExcelProperty(value = "电话")
private String tel ;
/** 地址 */
@ExcelProperty(value = "地址")
private String address ;
/** 错误原因 */
@ExcelProperty(value = "错误原因")
private String errorMessage ;
}
@Override
@Transactional
public void inportConsumer(MultipartFile file, HttpServletResponse response) {
try {
InputStream inputStream = file.getInputStream();
List<ConsumerDTO> consumerList = EasyExcel.read(inputStream)
.head(ConsumerDTO.class)
.sheet("Sheet1")
.headRowNumber(1)
.doReadSync();
if (!CollectionUtils.isEmpty(consumerList)) {
List<ConsumerDTO> errorList = new ArrayList<>();
// 调用新增接口
for (ConsumerDTO consumer : consumerList) {
try {
// 组装数据
ConsumerRequest consumerRequest = new ConsumerRequest();
BeanUtils.copyProperties(consumer, consumerRequest);
// 新增数据
insert(consumerRequest);
} catch (Exception e) {
// 把错误数据加入到错误列表
consumer.setErrorMessage(e.getMessage());
errorList.add(consumer);
}
}
// 导出错误列表
if (errorList.size() > 0) {
ServletOutputStream outputStream = response.getOutputStream();
response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type", "application/octet-stream");
String fileName = "导入用户错误列表";
// 指定文件如何展示给用户, 希望用户下载而不是直接在浏览器中打开可以使用attachment类型
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
EasyExcel.write(outputStream, ConsumerDTO.class).sheet("Sheet1").doWrite(errorList);
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}