最基本的导入导出,要导出的数据的实体类如下:
publicclassTeacher{/***老师的主键*/privateIntegerteacherId;/***名字*/privateStringteacherName;/***头像图片地址*/privateStringteacherImage;/***老师的状态0代表正常1代表删除*/privateIntegerteacherStatus;}复制代码省略getset
导出代码
/***基本的导出*/@Testpublicvoidtest1(){//准备数据List
关于EasyExcel的数据读取会稍微麻烦一点,直接通过工具类读取到的数据不能直接处理,需要借助一个中间的类监听器类,大致的流程如下图
监听器的代码如下,有详细的注释
导入的代码如下:
/***添加数据库用到的dao*/@AutowiredprivateTeacherDaoteacherDao;/***最简单的读*/@TestpublicvoidsimpleRead(){StringfileName="/Users/lubingyang/Desktop/hhhh.xlsx";//这里需要指定读用哪个class去读,然后读取第一个sheet文件流会自动关闭/***参数1要读取的文件*参数2要读取的数据对应的实体类类对象*参数3监听器对象可以在创建的时候把dao当做参数传进去*/EasyExcel.read(fileName,Teacher.class,newDemoDataListener(teacherDao)).sheet().doRead();}复制代码读取的结果如下:
在EasyExcel中支持多种图片的导入导出,什么意思呢?一般情况下,数据库表中的图片字段存储的是图片路径,读取图片文件导出是支持的,除此之外,还支持网络路径,流,字节数组等方式。我的案例以读取本地图片文件为主。
实体类改造
导出的代码是【不需要做任何改变】
EasyExcel最大的特点就是能够避免内存溢出,那么是怎么做到的呢?
首先我们说一下为什么Poi会有内存溢出的风险
Poi在读取Excel文件的时候,会先将所有的数据都读取的内存中,再进行处理。这个时候如果读取的文件数据量比较大,就会发生java.lang.OutOfMemoryError:Javaheapspace错误。
那么EasyPoi是怎么做的呢?
接下来我们通过代码测试一下百万数据的导入和导出
百万数据导出
思路
准备一个百万数据的用户表
用户实体类如下:
@DatapublicclassCmfzUserimplementsSerializable{@ExcelIgnoreprivateIntegeruserId;@ExcelProperty("手机号")privateStringuserTelphone;privateStringuserPassword;@ExcelProperty("头像地址")privateStringuserImage;@ExcelProperty("昵称")privateStringuserNickname;@ExcelProperty("名字")privateStringuserName;@ExcelProperty("性别")privateStringuserSex;@ExcelProperty("个性签名")privateStringuserAutograph;@ExcelProperty("省份")privateStringuserProvince;@ExcelProperty("城市")privateStringuserCity;@ExcelIgnoreprivateIntegerguruId;@ExcelIgnoreprivateIntegeruserStatus;@ExcelIgnoreprivateDateuserCreateDate;}复制代码代码:
百万数据读取
百万数据的Excel文件是不能通过Poi直接读取的,我测试了一下,发生一下异常
如果要使用Poi的话需要做一些处理接下来我们通过EasyExcel看一下效果
使用EasyExcel读取文件分为两步:
监听器代码
publicclassUserDataListenerextendsAnalysisEventListener
@Testpublicvoidtest4(){StringfileName="/Users/lubingyang/Desktop/大数据.xlsx";//这里需要指定读用哪个class去读,然后读取第一个sheet文件流会自动关闭/***参数1要读取的文件*参数2要读取的数据对应的实体类类对象*参数3监听器对象可以在创建的时候把dao当做参数传进去*/EasyExcel.read(fileName,CmfzUser.class,newUserDataListener(userDao)).sheet().doRead();}复制代码