springboot + easypoi 一行代码搞定excel导入导出

  • A+
所属分类:java

我们不造轮子,只是轮子的搬运工。(其实最好是造轮子,造比别人好的轮子)

开发中经常会遇到的excel的处理,导入导出解析等等,JAVA中比较流行的用POI,但是每次都要写大段工具类来搞定这事儿,此处推荐一个别人造好的轮子【 easypoi】,下面介绍下“轮子”的使用。

POM引入

不再需要其他的jar

  1. <dependency>
  2.            <groupId>cn.afterturn</groupId>
  3.            <artifactId>easypoi-base</artifactId>
  4.            <version>3.0.3</version>
  5.        </dependency>
  6.        <dependency>
  7.            <groupId>cn.afterturn</groupId>
  8.            <artifactId>easypoi-web</artifactId>
  9.            <version>3.0.3</version>
  10.        </dependency>
  11.        <dependency>
  12.            <groupId>cn.afterturn</groupId>
  13.            <artifactId>easypoi-annotation</artifactId>
  14.            <version>3.0.3</version>
  15.        </dependency>

编写实体类

此处注意必须要有空构造函数,否则会报错“对象创建错误”
关于注解@ Excel,其他还有@ ExcelCollection,@ ExcelEntity,@ ExcelIgnore,@ ExcelTarget等,此处我们用不到,可以去官方查看更多

属性 类型 类型 说明
名称 空值 列名
needMerge 布尔 FASLE 纵向合并单元格
ORDERNUM “0” 列的排序,支持名_ID
更换 串[] {} 值得替换导出是{a_id,b_id}导入反过来
savePath “上传” 导入文件保存路径
类型 INT 1 导出类型1是文本2是图片,3是函数,10是数字默认是文本
宽度 10 列宽
高度 10 列高,后期打算统一使用@ExcelTarget的高度,这个会被废弃,注意
isStatistics 布尔 FASLE 自动统计数据,在追加一行统计,把所有数据都和输出这个处理会吞没异常,请注意这一点
isHyperlink 布尔 超链接,如果是需要实现接口返回对象
isImportField 布尔 真正 校验字段,看看这个字段是不是导入的Excel中中有,如果没有说明是错误的Excel中,读取失败,支持名_ID
exportFormat “” 导出的时间格式,以这个是否为空来判断是否需要格式化日期
importFormat “” 导入的时间格式,以这个是否为空来判断是否需要格式化日期
格式 “” 时间格式,相当于同时设置了exportFormat和importFormat
databaseFormat “YYYYMMDDHHMMSS” 导出时间设置,如果字段是日期类型则不需要设置数据库如果是string类型,这个需要设置这个数据库格式,用以转换时间格式输出
numFormat “” 数字格式化,参数是模式,使用的对象是DecimalFormat的
图像类型 INT 1 导出类型1从文件读取2是从数据库中读取默认是文件同样导入也是一样的
后缀 “” 文字后缀,如%90变成90%
isWrap 布尔 真正 是否换行即支持\ n
mergeRely INT [] {} 合并单元格依赖关系,比如第二列合并是基于第一列则{1}就可以了
mergeVertical 布尔 FASLE 纵向合并内容相同的单元格

实体类

  1. import cn.afterturn.easypoi.excel.annotation.Excel;
  2. import java.util.Date;
  3. public class Person {
  4.     @Excel(name = "姓名", orderNum = "0")
  5.     private String name;
  6.     @Excel(name = "性别", replace = {"男_1""女_2"}, orderNum = "1")
  7.     private String sex;
  8.     @Excel(name = "生日", exportFormat = "yyyy-MM-dd", orderNum = "2")
  9.     private Date birthday;
  10.     public Person(String name, String sex, Date birthday) {
  11.         this.name = name;
  12.         this.sex = sex;
  13.         this.birthday = birthday;
  14.     }
  15.     public String getName() {
  16.         return name;
  17.     }
  18.     public void setName(String name) {
  19.         this.name = name;
  20.     }
  21.     public String getSex() {
  22.         return sex;
  23.     }
  24.     public void setSex(String sex) {
  25.         this.sex = sex;
  26.     }
  27.     public Date getBirthday() {
  28.         return birthday;
  29.     }
  30.     public void setBirthday(Date birthday) {
  31.         this.birthday = birthday;
  32.     }
  33. }

导入导出公用方法

  1. public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass,String fileName,boolean isCreateHeader, HttpServletResponse response){
  2.         ExportParams exportParams = new ExportParams(title, sheetName);
  3.         exportParams.setCreateHeadRows(isCreateHeader);
  4.         defaultExport(list, pojoClass, fileName, response, exportParams);
  5.     }
  6.     public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass,String fileName, HttpServletResponse response){
  7.         defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName));
  8.     }
  9. public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response){
  10.         defaultExport(list, fileName, response);
  11.     }
  12.     private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) {
  13.         Workbook workbook = ExcelExportUtil.exportExcel(exportParams,pojoClass,list);
  14.         if (workbook != null);
  15.         downLoadExcel(fileName, response, workbook);
  16.     }
  17.     private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
  18.         try {
  19.             response.setCharacterEncoding("UTF-8");
  20.             response.setHeader("content-Type""application/vnd.ms-excel");
  21.             response.setHeader("Content-Disposition",
  22.                     "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
  23.             workbook.write(response.getOutputStream());
  24.         } catch (IOException e) {
  25.             throw new NormalException(e.getMessage());
  26.         }
  27.     }
  28. private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response) {
  29.         Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);
  30.         if (workbook != null);
  31.         downLoadExcel(fileName, response, workbook);
  32.     }
  33.     public static <T> List<T> importExcel(String filePath,Integer titleRows,Integer headerRows, Class<T> pojoClass){
  34.         if (StringUtils.isBlank(filePath)){
  35.             return null;
  36.         }
  37.         ImportParams params = new ImportParams();
  38.         params.setTitleRows(titleRows);
  39.         params.setHeadRows(headerRows);
  40.         List<T> list = null;
  41.         try {
  42.             list = ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);
  43.         }catch (NoSuchElementException e){
  44.             throw new NormalException("模板不能为空");
  45.         } catch (Exception e) {
  46.             e.printStackTrace();
  47.             throw new NormalException(e.getMessage());
  48.         }
  49.         return list;
  50.     }
  51.     public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass){
  52.         if (file == null){
  53.             return null;
  54.         }
  55.         ImportParams params = new ImportParams();
  56.         params.setTitleRows(titleRows);
  57.         params.setHeadRows(headerRows);
  58.         List<T> list = null;
  59.         try {
  60.             list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params);
  61.         }catch (NoSuchElementException e){
  62.             throw new NormalException("excel文件不能为空");
  63.         } catch (Exception e) {
  64.             throw new NormalException(e.getMessage());
  65.         }
  66.         return list;
  67.     }

对的,没看错,这就可以导出导入了,看起来代码挺多,其实是提供了多个导入导出方法而已

测试

  1. @RequestMapping("export")
  2.     public void export(HttpServletResponse response){
  3.         //模拟从数据库获取需要导出的数据
  4.         List<Person> personList = new ArrayList<>();
  5.         Person person1 = new Person("路飞","1",new Date());
  6.         Person person2 = new Person("娜美","2", DateUtils.addDate(new Date(),3));
  7.         Person person3 = new Person("索隆","1", DateUtils.addDate(new Date(),10));
  8.         Person person4 = new Person("小狸猫","1", DateUtils.addDate(new Date(),-10));
  9.         personList.add(person1);
  10.         personList.add(person2);
  11.         personList.add(person3);
  12.         personList.add(person4);
  13.         //导出操作
  14.         FileUtil.exportExcel(personList,"花名册","草帽一伙",Person.class,"海贼王.xls",response);
  15.     }
  16.     @RequestMapping("importExcel")
  17.     public void importExcel(){
  18.         String filePath = "F:\\海贼王.xls";
  19.         //解析excel,
  20.         List<Person> personList = FileUtil.importExcel(filePath,1,1,Person.class);
  21.         //也可以使用MultipartFile,使用 FileUtil.importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass)导入
  22.         System.out.println("导入数据一共【"+personList.size()+"】行");
  23.         //TODO 保存数据库
  24.     }

导出结果

springboot + easypoi 一行代码搞定excel导入导出
导出结果

测试导入

导出结果再添加一行,执行,输出导入数据行数


springboot + easypoi 一行代码搞定excel导入导出
导入结果

 

 

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: