我也是凑巧用上了,就在这里分享一下,性能确实是没得说!

对easyexcel的介绍是:Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到KB级别,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便

1、导入的pom.xml

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

实际上版本(1.0.1)在读取的时候是有BUG的,读取03版的.xls格式的excel正常,但是读取07版的.xlsx版的excel就会出异常,原因是在解析的时候sheet临时文件路径拼装有误,所以我们用1.0.3

2、使用easyexcel读取excel的时候需要设置excel的版本,但是有些时候我们无法预知excel的版本,所以在网上copy了大神模仿poi写了一个用于获取com.alibaba.excel.ExcelReader对象的工具类

package easyExcel.com.easy.excel;import java.io.IOException;
import java.io.InputStream;
import java.io.PushbackInputStream;import org.apache.poi.EmptyFileException;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.poifs.filesystem.DocumentFactoryHelper;
import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
import org.apache.poi.util.IOUtils;import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.read.context.AnalysisContext;
import com.alibaba.excel.read.event.AnalysisEventListener;
import com.alibaba.excel.support.ExcelTypeEnum;public class ExcelReaderFactory {/*** @param in*           文件输入流* @param customContent*           自定义模型可以在*           {@link AnalysisEventListener#invoke(Object, AnalysisContext) }*           AnalysisContext中获取用于监听者回调使用* @param eventListener*           用户监听* @throws IOException* @throws EmptyFileException* @throws InvalidFormatException*/public static ExcelReader getExcelReader(InputStream in, Object customContent,AnalysisEventListener<?> eventListener) throws EmptyFileException, IOException, InvalidFormatException {// 如果输入流不支持mark/reset,需要对其进行包裹if (!in.markSupported()) {in = new PushbackInputStream(in, 8);}// 确保至少有一些数据byte[] header8 = IOUtils.peekFirst8Bytes(in);ExcelTypeEnum excelTypeEnum = null;if (NPOIFSFileSystem.hasPOIFSHeader(header8)) {excelTypeEnum = ExcelTypeEnum.XLS;}if (DocumentFactoryHelper.hasOOXMLHeader(in)) {excelTypeEnum = ExcelTypeEnum.XLSX;}if (excelTypeEnum != null) {return new ExcelReader(in, excelTypeEnum, customContent, eventListener);}throw new InvalidFormatException("Your InputStream was neither an OLE2 stream, nor an OOXML stream");}/*** @param in*           文件输入流* @param customContent*           自定义模型可以在*           {@link AnalysisEventListener#invoke(Object, AnalysisContext) }*           AnalysisContext中获取用于监听者回调使用* @param eventListener*           用户监听* @param trim*           是否对解析的String做trim()默认true,用于防止 excel中空格引起的装换报错。* @throws IOException* @throws EmptyFileException* @throws InvalidFormatException*/public static ExcelReader getExcelReader(InputStream in, Object customContent,AnalysisEventListener<?> eventListener, boolean trim)throws EmptyFileException, IOException, InvalidFormatException {// 如果输入流不支持mark/reset,需要对其进行包裹if (!in.markSupported()) {in = new PushbackInputStream(in, 8);}// 确保至少有一些数据byte[] header8 = IOUtils.peekFirst8Bytes(in);ExcelTypeEnum excelTypeEnum = null;if (NPOIFSFileSystem.hasPOIFSHeader(header8)) {excelTypeEnum = ExcelTypeEnum.XLS;}if (DocumentFactoryHelper.hasOOXMLHeader(in)) {excelTypeEnum = ExcelTypeEnum.XLSX;}if (excelTypeEnum != null) {return new ExcelReader(in, excelTypeEnum, customContent, eventListener, trim);}throw new InvalidFormatException("Your InputStream was neither an OLE2 stream, nor an OOXML stream");}
}

3、然后编写一个简单的测试类

package easyExcel.com.easy.excel;import java.io.FileInputStream;
import java.io.InputStream;import org.junit.Test;import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.metadata.BaseRowModel;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.excel.read.context.AnalysisContext;
import com.alibaba.excel.read.event.AnalysisEventListener;public class ExcelWriteTest {public static class ExcelPropertyIndexModel extends BaseRowModel {@ExcelProperty(value = "姓名", index = 0)private String name;@ExcelProperty(value = "年龄", index = 1)private String age;@ExcelProperty(value = "邮箱", index = 2)private String email;@ExcelProperty(value = "地址", index = 3)private String address;@ExcelProperty(value = "性别", index = 4)private String sax;@ExcelProperty(value = "高度", index = 5)private String heigh;@ExcelProperty(value = "备注", index = 6)private String last;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getSax() {return sax;}public void setSax(String sax) {this.sax = sax;}public String getHeigh() {return heigh;}public void setHeigh(String heigh) {this.heigh = heigh;}public String getLast() {return last;}public void setLast(String last) {this.last = last;}@Overridepublic String toString() {return "ExcelPropertyIndexModel [name=" + name + ", age=" + age + ", email=" + email + ", address="+ address + ", sax=" + sax + ", heigh=" + heigh + ", last=" + last + "]";}}@Testpublic void read() throws Exception {//text.xlsxtry (InputStream in = new FileInputStream("try.xlsx");) {AnalysisEventListener<ExcelPropertyIndexModel> listener = new AnalysisEventListener<ExcelPropertyIndexModel>() {@Overridepublic void invoke(ExcelPropertyIndexModelobject, AnalysisContext context) {System.err.println("Row:" + context.getCurrentRowNum() + " Data:" + object.toString());}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {System.err.println("doAfterAllAnalysed...");}};ExcelReader excelReader = ExcelReaderFactory.getExcelReader(in, null, listener);// 第二个参数为表头行数,按照实际设置excelReader.read(new Sheet(1, 1, ExcelPropertyIndexModel.class));}}
}

解释一下测试类的代码:ExcelPropertyIndexModel是一个用来存放解析完表格的数据类,@ExcelProperty(value = "名称", index = 10)注解中的index标识着这个参数对应的列,index从0开始

使用easyexcel操作Excel相关推荐

  1. POI和EasyExcel操作Excel

    POI和EasyExcel操作Excel 常用场景 1.将用户信息导出为excel表格(导出数据- ) 2.将Excel表中的信息录入到网站数据库(文件数据上传- ) 开发中经常会设计到excel的处 ...

  2. java利用EasyExcel操作Excel

    EasyExcel EasyExcel读写Excel的基本使用 Excel导入导出的应用场景 数据导入:减轻录入工作量 数据导出:统计信息归档 数据传输:异构系统之间数据传输 EasyExcel简介 ...

  3. Java使用easyExcel操作Excel就是这么简单!

    文章目录 前言 第一步:导入依赖 第二步:创建一个EasyExcelReadListener类,继承easyExcel中的AnalysisEventListener类,实现里面的invoke()和do ...

  4. Java使用poi/easyexcel操作excel

    前言 在工作的开发过过程中,我们总会遇到将数据导出到excel的需求,和导入excel到数据库,下面会讲解当今比较流行的两个工具实现Java操作excel: Apache POI 阿里巴巴的easye ...

  5. SpringBoot整合Easyexcel操作Excel,闲暇之余,让我们学习更多

    easyexcel 3.0.2 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boo ...

  6. Java使用EasyExcel操作Excel表格

    1 EasyExcel简介 EasyExcel是阿里巴巴开源的一个基于Java的简单.省内存的读写Excel的开源项目.在尽可能节约内存的情况下支持读写百M的Excel. github地址:https ...

  7. poi和easyExcel基于Java操作Excel学习笔记

    1 学习前言 Excel和读写和文件的读写没有本质的区别,都是属于IO操作,我们使用原生的IO就能解决Excel的导入和导出,当然操作起来比较麻烦,性能也不高,这次我们就学习poi和easyExcel ...

  8. java操作excel

    使用Java操作excel可以使用两种方式: 关于表格导入导出,市面上比较知名的开源就是 Apache 的POI 和 阿里巴巴的 EasyExcel了.EasyExcel 也是对 POI 的改进和封装 ...

  9. EasyExcel实现Excel文件导入导出

    1 EasyExcel简介 EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项目.在尽可能节约内存的情况下支持读写百M的Excel. github地址: https://git ...

最新文章

  1. Excel自定义格式的小技巧
  2. oracle 表分区[三]
  3. WinXP下替代IIS的新思路
  4. LeetCode 123. 买卖股票的最佳时机 III(动态规划)
  5. fastai学习:05_pet_breeds Questionnaire
  6. 【C语言】通过原子操作实现加减乘除操作Ⅱ
  7. 【译】TetroGL: An OpenGL Game Tutorial in C++ for Win32 Platforms - Part 2 (上)
  8. php 调用python 脚本
  9. python自动化测试-Python实现性能自动化测试竟然如此简单
  10. win7 ie9总是跳转到官方主页的解决方法
  11. xxx.lib(xxx.obj)fatal error LNK1103: debugging information corrupt; recompile module 的解决方案
  12. 3dmax模型在web端
  13. Snap7 在西门子PLC的使用
  14. 24节气—小雪海报、文案分享。雨凝成雪,万物冬藏。
  15. ice的意思_ice什么意思
  16. 【Mac使用技巧】Mac的VMware虚拟机系统时间如何调成不同步
  17. 有的放矢-电气工程师的工作重心
  18. 如何删除Mac OS Monterey自带(预装)软件?
  19. Activiti 学习笔记七:连线(SequenceFlow)
  20. FPGA基础测试题 verilog

热门文章

  1. 纯css 使元素像画卷一样展开或者横向展开
  2. 中国电信3G格式 CDMA2000 1x和CDMA2000 EVDO 有什么区别?
  3. CDMA1xRTT 走向成功的捷径(转)
  4. 火爆全网的DragGAN作者,潘新钢团队招全奖博士/博后
  5. 快速学习MyBatis|实战项目详解
  6. 简述python爬虫原理_python 爬虫原理
  7. linux查看磁盘空间情况命令,linux查看磁盘空间的命令是什么
  8. 阅面科技赵京雷:人工智能时代,智能机器需要怎样的眼睛?
  9. 做APP接口开发过程总结
  10. 安卓网络数据缓存策略