1.简介:easyExcel是阿里巴巴的一个开源excel处理框架,使用起来非常简单,就如它的名字一样。
2.demo案例:
2.1引入依赖
` com.alibaba easyexcel 2.1.1
`
2.2 创建一个实体
`@Data public class Stu { //设置表头名称 @ExcelProperty("学生编号") private int sno;
@ExcelProperty("学生姓名")
private String sname;
} `
2.3实现写的操作
public static void main(String[] args) {
String fileName= "D:\\Project\\test\\01.xlsx";
EasyExcel.write(fileName,Stu.class).sheet("学生名单").doWrite(data());
}
//循环设置要添加的数据,最终封装到list集合中
private static List<Stu> data() {
List<Stu> list = new ArrayList<Stu>();
for (int i = 0; i < 10; i++) {
Stu data = new Stu();
data.setSno(i);
data.setSname("张三"+i);
list.add(data);
}
return list;
}
2.4实现读操作
(1)改造实体
`@Data public class Stu { //设置表头名称 value是列名 index是列的下标 @ExcelProperty(value = "学生编号",index = 0) private int sno;
@ExcelProperty(value = "学生姓名",index = 1)
private String sname;
} `
(2)创建监听器(只要读的时候需要)
`public class ExcelListener extends AnalysisEventListener { //读取每一行数据 @Override public void invoke(Stu stu, AnalysisContext analysisContext) { System.out.println("stu = " + stu); }
//读取excel表头信息
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
System.out.println("表头信息:"+headMap);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}
`
2.5融入最近项目中使用
(1)找到实体DictEeVo
(2) 在controller添加方法
@ApiOperation(value = "导出") @GetMapping(value = "/exportData") public void exportData(HttpServletResponse response){ dictService.exportData(response); }
(3)service实现
/** * 实现数据字典表的导出 * @param response */ @Override public void exportData(HttpServletResponse response) { try { //设置导出的类型为excel response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 String fileName = URLEncoder.encode("数据字典表", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); //查询数据库字典表数据 List<Dict> dictList = baseMapper.selectList(null); //查询出的数据需要写入到dictEeVo中 但两个实体类不一致 //遍历封装 List<DictEeVo> dictEeVoList = new ArrayList<>(); for (Dict dict : dictList) { DictEeVo dictEeVo = new DictEeVo(); //使用BeanUtils工具实现拷贝 把Dict中的字段拷贝到DictEeVo中(相同的字段) BeanUtils.copyProperties(dict, dictEeVo); dictEeVoList.add(dictEeVo); } //写入数据 EasyExcel.write(response.getOutputStream(), DictEeVo.class) .sheet("数据字典表") .doWrite(dictEeVoList); } catch (IOException e) { e.printStackTrace(); } }
(4)实现导入
1.创建监听器
` @Component public class DictListener extends AnalysisEventListener {
@Autowired
private DictMapper dictMapper;
@Override
public void invoke(DictEeVo dictEeVo, AnalysisContext analysisContext) {
//读取每一行数据 然后保存到dict实体中
Dict dict = new Dict();
BeanUtils.copyProperties(dictEeVo,dict);
dict.setIsDeleted(0);
dictMapper.insert(dict);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
} `
(2)controller入口
@ApiOperation(value = "导入") @PostMapping("importData") public R importData(MultipartFile file){ dictService.importData(file); return R.ok(); }
(3)service实现
@Autowired private DictListener dictListener; /** * 实现数据字典的导入 * @param file */ @Override public void importData(MultipartFile file) { try { EasyExcel.read(file.getInputStream(),DictEeVo.class,dictListener) .sheet().doRead(); } catch (IOException e) { e.printStackTrace(); throw new YyghException(20001,"导入失败"); } }