Java中利用Alibaba开源技术EasyExcel来操作Excel表的示例代码

网友投稿 288 2023-01-26

Java中利用Alibaba开源技术EasyExcel来操作Excel表的示例代码

一.读Excel

1.Excel表格示例

2.对象示例

@Data

public class DemoData {

private String string;

private Date date;

private Double doubleData;

}

3.监听器(重点部分)

// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去

public class DemoDataListener extends AnalysisEventListener {

private static final Logger LOGGER = LoggerFactory.getLogger(DemoDataListener.class);

/**

* 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收

*/

private static final int BATCH_COUNT = 5;

List list = new ArrayList();

/**

* 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。

*/

private DemoDAO demoDAO;

public DemoDataListener() {http://

// 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数

demoDAO = new DemoDAO();

}

/**

* 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来

*

* @param demoDAO

*/

public DemoDataListener(DemoDAO demoDAO) {

this.demoDAO = demoDAO;

}

/**

* 这个每一条数据解析都会来调用

*

* @param data

* one row value. Is is same as {@link AnalysisContext#readRowHolder()}

* @param context

*/

@Override

public void invoke(DemoData data, AnalysisContext context) {

LOGGER.info("解析到一条数据:{}", jsON.toJSONString(data));

list.add(data);

// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM

if (list.size() >= BATCH_COUNT) {

saveData();

// 存储完成清理 list

list.clear();

}

}

/**

* 所有数据解析完成了 都会来调用

*

* @param context

*/

@Override

public void doAfterAllAnalysed(AnalysisContext context) {

// 这里也要保存数据,确保最后遗留的数据也存储到数据库

saveData();

LOGGER.info("所有数据解析完成!");

}

/**

* 加上存储数据库

*/

private void saveData() {

LOGGER.info("{}条数据,开始存储数据库!", list.size());

demoDAO.save(list);

LOGGER.info("存储数据库成功!");

}

}

4.持久层-将读出的Excel表格内容存到数据库

/**

* 假设这个是你的DAO存储。当然还要这个类让spring管理,当然你不用需要存储,也不需要这个类。

**/

public class DemoDAO {

public void save(List list) {

// 这里根据自己的业务需求自己去实现业务逻辑dao service

}

}

5.测试类

/**

* 最简单的读

*

1. 创建excel对应的实体对象 参照{@link DemoData}

*

2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link DemoDataListener}

*

3. 直接读即可

*/

@Test

public void simpleRead() {

// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去

// 写法1:

String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";

// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭

EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();

// 写法2:

fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";

ExcelReader excelReader = null;

try {

excelReader = EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).build();

ReadSheet readSheet = EasyExcel.readSheet(0).build();

excelReader.read(readSheet);

} finally {

if (excelReader != null) {

// 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的

excelReader.finish();

}

}

}

5.测试结果

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:新浪星座开放api接口(新浪星座开放api接口有哪些)
下一篇:电影api接口吗(免费影视api接口)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~