2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > Apache POI和EasyExcel 第七集:EasyExcel的基本操作 读取和写入Excel 一行足矣

Apache POI和EasyExcel 第七集:EasyExcel的基本操作 读取和写入Excel 一行足矣

时间:2021-06-11 05:48:22

相关推荐

Apache POI和EasyExcel 第七集:EasyExcel的基本操作 读取和写入Excel 一行足矣

Apache POI和EasyExcel 第七集:EasyExcel的基本操作,读取和写入Excel,一行搞定

一、资源

在这里设置lombok会遇到一个问题,以前在springboot那里都没遇到,也不知道为啥这里会出问题。。。。

Lombok Requires Annotation Processing: Do you want to enable annotation processors? Enable

二、代码实现

pom.xml

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.41</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version></dependency>

与Excel相对应的实体类

@Datapublic class DemoData {@ExcelProperty("字符串标题")private String string;@ExcelProperty("日期标题")private Date date;@ExcelProperty("数字标题")private Double doubleData;/*** 忽略这个字段*/a@ExcelIgnoreprivate String ignore;}

监听器

@Slf4jpublic class DemoDataListener implements ReadListener<DemoData> {/*** 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收*/private static final int BATCH_COUNT = 100;/*** 缓存的数据*/private List<DemoData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);/*** 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。*/private DemoDAO demoDAO;public DemoDataListener() {// 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数demoDAO = new DemoDAO();}/*** 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来** @param demoDAO*/public DemoDataListener(DemoDAO demoDAO) {this.demoDAO = demoDAO;}@Overridepublic void invoke(DemoData data, AnalysisContext context) {log.info("解析到一条数据:{}", JSON.toJSONString(data));System.out.println(data);cachedDataList.add(data);// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOMif (cachedDataList.size() >= BATCH_COUNT) {saveData();// 存储完成清理 listcachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);}}/*** 所有数据解析完成了 都会来调用** @param context*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 这里也要保存数据,确保最后遗留的数据也存储到数据库saveData();log.info("所有数据解析完成!");}/*** 加上存储数据库*/private void saveData() {log.info("{}条数据,开始存储数据库!", cachedDataList.size());demoDAO.save(cachedDataList);log.info("存储数据库成功!");}}

如果是项目之类的需要涉及到持久化对数据库进行操作,可以对下面的Dao层代码进行进一步修改。

/*** 假设这个是你的DAO存储。当然还要这个类让spring管理,当然你不用需要存储,也不需要这个类。**/public class DemoDAO {public void save(List<DemoData> list) {// 如果是mybatis,尽量别直接调用多次insert,自己写一个mapper里面新增一个方法batchInsert,所有数据一次性插入}}

最后是读和写的测试,写的话是简单的一行搞定;读Excel的话,可以分为两种,一种是最简单的直接读,需要做的操作在for循环之中修改即可,另一种是使用监听器,操作可以在invoke()函数中修改,或者在dao层的代码中增加自己的操作。

public class EasyExcelTest {String path = "D:\\IDEA\\ApachePOI_EasyExcel\\";private List<DemoData> data() {List<DemoData> list = new ArrayList<>();for (int i = 0; i < 10; i++) {DemoData data = new DemoData();data.setString("字符串" + i);data.setDate(new Date());data.setDoubleData(0.56);list.add(data);}return list;}// 最简单的写@Testpublic void simpleWrite() {// 写法1String fileName = path + "EasyExcel.xlsx";// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会 自动关闭// 如果这里想使用03 则 传入excelType参数即可EasyExcel.write(fileName, DemoData.class).sheet("模 板").doWrite(data());}@Testpublic void simpleRead() {// 写法1:JDK8+ ,不用额外写一个DemoDataListener// since: 3.0.0-beta1String fileName = path + "EasyExcel.xlsx";// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭// 这里每次会读取3000条数据 然后返回过来 直接调用使用数据就行EasyExcel.read(fileName, DemoData.class, new PageReadListener<DemoData>(dataList -> {for (DemoData demoData : dataList) {System.out.println(JSON.toJSONString(demoData));}})).sheet().doRead();}@Testpublic void simpleRead1() {String fileName = path + "EasyExcel.xlsx";// 写法3:// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();}}

三、成果截图

四、完结撒花

拖更了将近两个月的Apache POI和EasyExcel专题终于学完了,未来有机会的话要试着在项目中运用一下,接下来准备学习Redis,想学很久了,这次放假了终于有时间看看了。那么,Apache POI和EasyExcel完结撒花了!!!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。