EasyExcel使用

157 阅读1分钟

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,"导入失败"); } }