EasyExcel
EasyExcel是一个基于Java的简单 省内存的读写Excel的开源项目
在尽可能节约内存的情况下支持读写百M的Excel
第一步 引入依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.1</version> </dependency>
第二步 创建vo类
在对应属性上添加注解
设置表头内容
DictEeVo类用于将实体类Dict中的数据映射到Excel表中
@Data public class DictEeVo { @ExcelProperty(value = "id" ,index = 0) 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; }
第三步 实现操作具体代码
写操作
public void exportDictData(HttpServletResponse response) { //设置下载信息 response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); String fileName = "dict"; response.setHeader("Content-disposition", "attachment;filename="+ fileName + ".xlsx"); //查询数据库 List<Dict> dictList = baseMapper.selectList(null); //Dict -- DictEeVo List<DictEeVo> dictVoList = new ArrayList<>(); for(Dict dict:dictList) { DictEeVo dictEeVo = new DictEeVo(); // dictEeVo.setId(dict.getId()); BeanUtils.copyProperties(dict,dictEeVo); dictVoList.add(dictEeVo); } //调用方法进行写操作 try { EasyExcel.write(response.getOutputStream(), DictEeVo.class).sheet("dict") .doWrite(dictVoList); } catch (IOException e) { e.printStackTrace(); } }
读操作
创建Listener
public class DictListener extends AnalysisEventListener<DictEeVo> { private DictMapper dictMapper; public DictListener(DictMapper dictMapper) { this.dictMapper = dictMapper; } //一行一行进行读取 @Override public void invoke(DictEeVo dictEeVo, AnalysisContext analysisContext) { Dict dict = new Dict(); //将dictEeVo中的属性值按照属性名赋值到dict的属性中 BeanUtils.copyProperties(dictEeVo,dict); //调用方法添加数据库 dictMapper.insert(dict); } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { } }
使用EasyExcel类的静态方法read进行读取
public void importDictData(MultipartFile file) { //file是传入的excel表文件 try { EasyExcel.read(file.getInputStream(),DictEeVo.class,new DictListener(baseMapper)) .sheet().doRead(); } catch (IOException e) { e.printStackTrace(); } }
EasyPoi
easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完成以前复杂的写法
Easypoi的目标不是替代poi,而是让一个不懂导入导出的快速使用poi完成Excel和word的各种操作,而不是看很多api才可以完成这样工作
第一步 引入依赖
<dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-spring-boot-starter</artifactId> <version>4.1.3</version> </dependency>
第二步 在实体类对应的属性上添加注解
@Data public class Employee { private Integer id; @Excel(name = "员工姓名") private String name; @Excel(name = "性别") private String gender; @Excel(name = "出生日期",width = 20,format = "yyyy-MM-dd") private LocalDate birthday; }
第三步 实现操作具体代码
写操作
public void exportEmployee(HttpServletResponse response){ //查询数据库 List<Employee> list = employeeService.getEmployee(null); //设置导出参数 ExportParams params = new ExportParams("员工表","员工表", ExcelType.HSSF); //生成Excel Workbook workbook = ExcelExportUtil.exportExcel(params,Employee.class,list); ServletOutputStream out = null; try { //用流的形式传输 response.setHeader("content-type","application/octet-stream"); //暴露content-disposition response.setHeader("Access-Control-Expose-Headers", "content-disposition"); //防止中文乱码 response.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode("员工表.xls","UTF-8")); out = response.getOutputStream(); //使用ServletOutputStream输出流将Excel文件传输至客户端 workbook.write(out); } catch (IOException e) { e.printStackTrace(); }finally { if(null!=out){ try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } }
读文件
public RespBean importEmployee(MultipartFile file){ //设置导入参数 ImportParams params = new ImportParams(); //去掉第一行标题行 params.setTitleRows(1); try { List<Employee> list = ExcelImportUtil.importExcel(file.getInputStream(), Employee.class, params); //将数据储存至数据库,并向客户端返回结果 if(employeeService.saveBatch(list)){ return RespBean.success("导入成功"); } } catch (Exception e) { e.printStackTrace(); } return RespBean.error("导入失败"); }