使用easyexcel需要的pom依赖
<properties>
<easyexcel.version>2.2.0-beta2</easyexcel.version>
</properties> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>${easyexcel.version}</version> </dependency>
导入
controller层
// 需要使用post请求
// 参数是MultipartFile类型
// ApiOperation是swagger测试使用的
@PostMapping("/importData")
@ApiOperation(value = "导入",notes = "测试")
public String importData(MultipartFile file) throws IOException {
dictService.importData(file);
return "success";
}
service层
// 导入监听器
@Resource
private ExcelListener excelListener;
@Override
public void importData(MultipartFile file) {
// EasyExcel.read 导入方法
// 参数1:文件的序列化。
// 参数2:DictEeVo(和表格中字段对应的实体类)
// 参数3:excelListener监听器,在此监听器中可以做导入表格时候所做的事情
try {
EasyExcel.read(file.getInputStream(), DictEeVo.class,excelListener).sheet().doRead();
} catch (IOException e) {
e.printStackTrace();
}
}
表格示例
实体类定义
@Data
public class DictEeVo {
@ExcelProperty(value = "id" ,index = 0)
// @ApiModelProperty(value = "id")
private Long id;
@ExcelProperty(value = "上级id" ,index = 1)
private Long parentId;
@ExcelProperty(value = "名称" ,index = 2)
private String name;
@ExcelProperty(value = "值" ,index = 3)
private String value;
@ExcelProperty(value = "编码" ,index = 4)
private String dictCode;
}
实体类和表格中字段需要时一一对应的关系
监听器:需要继承AnalysisEventListener类,泛型是你的实体类
@Configuration
public class ExcelListener extends AnalysisEventListener<DictEeVo> {
// 注入service层
@Resource
private DictService dictService;
// 上传之前所做的事情在这个方法里面
@Override
public void invoke(DictEeVo dictEeVo, AnalysisContext analysisContext) {
// dictEeVo这个就是你的表格中的数据,就会一行一行的进行输入,此时可以直接操作数据库添加
Dict dict = new Dict();
// BeanUtils.copyProperties(dictEeVo,dict);
// 此方法是一般进行数据库添加的时候会出现数据库字段不一致的情况,这样的情况下可以使用这个BeanUtils工具类进行转换
BeanUtils.copyProperties(dictEeVo,dict);
dict.setIsDeleted(0);
// mybatis-plus中的方法saveOrUpdate,如果此id的信息存在就进行修改,不存在则进行添加
dictService.saveOrUpdate(dict);
}
// 上传之后所做的事情在这个方法里面
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}
此时,就做好了导入
导出
controller
// 直接get请求
// 参数是HttpServletResponse
@GetMapping("/exportData")
@ApiOperation(value = "导出",notes = "测试")
public void getAllCmd(HttpServletResponse httpResponse){
dictService.exportData(httpResponse);
}
service
@Override
public void exportData(HttpServletResponse response) {
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = null;
try {
fileName = URLEncoder.encode("公共", "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
// 查询出所有的数据
List<Dict> dicts = dictMapper.selectList(null);
// 这里使用的导出的类和数据库中的类不一样
// 需要使用 BeanUtils.copyProperties进行转换
List<DictEeVo> dictEeVoList = new ArrayList<>();
for (Dict dict : dicts) {
DictEeVo dictEeVo = new DictEeVo();
BeanUtils.copyProperties(dict,dictEeVo);
dictEeVoList.add(dictEeVo);
}
// 这里直接调用方法进行导出
// 参数controller传入response和实体类和名字和需要导出的集合
EasyExcel.write(response.getOutputStream(), DictEeVo.class).sheet("公共").doWrite(dictEeVoList);
} catch (IOException e) {
e.printStackTrace();
}
}
service这个方法可以直接进入官网文档进行粘贴使用