• 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html
  • 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html

一行代码完成Java的Excel读写

技术杂谈 勤劳的小蚂蚁 2个月前 (02-22) 72次浏览 已收录 0个评论 扫描二维码

前段时间在 github 上发现了阿里的 EasyExcel 项目,觉得挺不错的,就写了一个简单的方法封装,做到只用一个函数就完成 Excel 的导入或者导。刚好前段时间更新修复了一些 BUG,就把我的这个封装分享出来,请多多指教。

附上源码:


EasyExcel


EasyExcel 的 github 地址: 

EasyExcel 的官方介绍:


可以看到 EasyExcel 最大的特点就是使用内存少,当然现在它的功能还比较简单,能够面对的复杂场景比较少,不过基本的读写完全可以满足。


一. 依赖


首先是添加该项目的依赖,目前的版本是 1.0.2。

<dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>easyexcel</artifactId>
 <version>1.0.2</version>
</dependency>

二. 需要的类

1. ExcelUtil

工具类,可以直接调用该工具类的方法完成 Excel 的读或者写。

2. ExcelListener

监听类,可以根据需要与自己的情况,自定义处理获取到的数据,我这里只是简单地把数据添加到一个 List 里面。
publicclassExcelListenerextendsAnalysisEventListener {

   //自定义用于暂时存储data。
   //可以通过实例获取该值
   private List<Object> datas = new ArrayList<>();

   /**
    * 通过 AnalysisContext 对象还可以获取当前 sheet,当前行等数据
    */
   @Override
   publicvoidinvoke(Object object, AnalysisContext context) {
       //数据存储到list,供批量处理,或后续自己业务逻辑处理。
       datas.add(object);
       //根据自己业务做处理
       doSomething(object);
   }

   privatevoiddoSomething(Object object) {
   }

   @Override
   publicvoiddoAfterAllAnalysed(AnalysisContext context) {
       /*
           datas.clear();
           解析结束销毁不用的资源
        */
   }

   public List<Object> getDatas() {
       return datas;
   }

   publicvoidsetDatas(List<Object> datas) {
       this.datas = datas;
   }

}


3. ExcelWriterFactroy


用于导出多个 sheet 的 Excel,通过多次调用 write 方法写入多个 sheet。


4. ExcelException


捕获相关 Exception。

三. 读取 Excel


读取 Excel 时只需要调用 ExcelUtil.readExcel() 方法:

@RequestMapping(value = “readExcel”, method = RequestMethod.POST)
public Object readExcel(MultipartFile excel) {
   return ExcelUtil.readExcel(excel, new ImportInfo());
}

其中 excel 是 MultipartFile 类型的文件对象,而 new ImportInfo() 是该 Excel 所映射的实体对象,需要继承 BaseRowModel 类,如:

publicclass ImportInfo extends BaseRowModel {
   @ExcelProperty(index = 0)
   privateString name;

   @ExcelProperty(index = 1)
   privateString age;

   @ExcelProperty(index = 2)
   privateString email;

   /*
       作为 excel 的模型映射,需要 setter 方法
    */
   publicString getName() {
       return name;
   }

   publicvoid setName(String name) {
       this.name = name;
   }

   publicString getAge() {
       return age;
   }

   publicvoid setAge(String age) {
       this.age = age;
   }

   publicString getEmail() {
       return email;
   }

   publicvoid setEmail(String email) {
       this.email = email;
   }

}

作为映射实体类,通过 @ExcelProperty 注解与 index 变量可以标注成员变量所映射的列,同时不可缺少 setter 方法。

四. 导出 Excel


1. 导出的 Excel 只拥有一个 sheet


只需要调用 ExcelUtil.writeExcelWithSheets() 方法:

@RequestMapping(value = “writeExcel”, method = RequestMethod.GET)
publicvoidwriteExcel(HttpServletResponse response) throws IOException {
   List<ExportInfo> list = getList();
   String fileName = “一个 Excel 文件”;
   String sheetName = “第一个 sheet”;

   ExcelUtil.writeExcel(response, list, fileName, sheetName, new ExportInfo());
   }

fileName,sheetName 分别是导出文件的文件名和 sheet 名,new ExportInfo() 为导出数据的映射实体对象,list 为导出数据。

对于映射实体类,可以根据需要通过 @ExcelProperty 注解自定义表头,当然同样需要继承 BaseRowModel 类,如:

publicclass ExportInfo extends BaseRowModel {
   @ExcelProperty(value = “姓名” ,index = 0)
   privateString name;

   @ExcelProperty(value = “年龄”,index = 1)
   privateString age;

   @ExcelProperty(value = “邮箱”,index = 2)
   privateString email;

   @ExcelProperty(value = “地址”,index = 3)
   privateString address;
}

value 为列名,index 为列的序号。
如果需要复杂一点,可以实现如下图的效果:
对应的实体类写法如下:
publicclass MultiLineHeadExcelModel extends BaseRowModel {

   @ExcelProperty(value = {“表头1”,“表头1”,“表头31”},index = 0)
   privateString p1;

   @ExcelProperty(value = {“表头1”,“表头1”,“表头32”},index = 1)
   privateString p2;

   @ExcelProperty(value = {“表头3”,“表头3”,“表头3”},index = 2)
   private int p3;

   @ExcelProperty(value = {“表头4”,“表头4”,“表头4”},index = 3)
   private long p4;

   @ExcelProperty(value = {“表头5”,“表头51”,“表头52”},index = 4)
   privateString p5;

   @ExcelProperty(value = {“表头6”,“表头61”,“表头611”},index = 5)
   privateString p6;

   @ExcelProperty(value = {“表头6”,“表头61”,“表头612”},index = 6)
   privateString p7;

   @ExcelProperty(value = {“表头6”,“表头62”,“表头621”},index = 7)
   privateString p8;

   @ExcelProperty(value = {“表头6”,“表头62”,“表头622”},index = 8)
   privateString p9;

}


2. 导出的 Excel 拥有多个 sheet

调用 ExcelUtil.writeExcelWithSheets() 处理第一个 sheet,之后调用 write() 方法依次处理之后的 sheet,最后使用 finish() 方法结束。
publicvoidwriteExcelWithSheets(HttpServletResponse response) throws IOException {
   List<ExportInfo> list = getList();
   String fileName = “一个 Excel 文件”;
   String sheetName1 = “第一个 sheet”;
   String sheetName2 = “第二个 sheet”;
   String sheetName3 = “第三个 sheet”;

   ExcelUtil.writeExcelWithSheets(response, list, fileName, sheetName1, new ExportInfo())
               .write(list, sheetName2, new ExportInfo())
               .write(list, sheetName3, new ExportInfo())
               .finish();
}

write 方法的参数为当前 sheet 的 list 数据,当前 sheet 名以及对应的映射类。


丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:一行代码完成Java的Excel读写
喜欢 (0)
[247507792@qq.com]
分享 (0)
勤劳的小蚂蚁
关于作者:
温馨提示:本文来源于网络,转载文章皆标明了出处,如果您发现侵权文章,请及时向站长反馈删除。

您必须 登录 才能发表评论!

  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ


QQ:2248886839


工作时间:09:00-23:00