java操作excel表格详解
程序员文章站
2022-03-23 11:02:43
目录什么是easyexcel使用场景1、将用户信息导出为excel表格(导出数据....)2、将excel表中的信息录入到网站数据库(习题上传....)大大减轻网站录入量!开发中经常会设计到excel...
使用场景
1、将用户信息导出为excel表格(导出数据....)
2、将excel表中的信息录入到网站数据库(习题上传....)大大减轻网站录入量!开发中经常会设计到excel的处理,如导出excel,导入excel到数据库中!
操作excel目前比较流行的就是apache poi和阿里巴巴的easyexcel !
这里我们主要使用easyexcel进行操作
什么是easyexcel
easyexcel是一个基于java的简单、省内存的读写excel的开源项目。在尽可能节约内存的情况下支持读写百m的excel。
一个excel表格由工作簿、工作表、行、列组成
写入表格
1、引入依赖
<!-- easyexcel--> <dependency> <groupid>com.alibaba</groupid> <artifactid>easyexcel</artifactid> <version>2.2.0-beta2</version> </dependency> <dependency> <groupid>com.alibaba</groupid> <artifactid>fastjson</artifactid> <version>1.2.54</version> </dependency> <!--lombok--> <dependency> <groupid>org.projectlombok</groupid> <artifactid>lombok</artifactid> <version>1.18.20</version> </dependency> <!--日期格式化工具--> <dependency> <groupid>joda-time</groupid> <artifactid>joda-time</artifactid> <version>2.10.10</version> </dependency> <!--test--> <dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version>4.13.2</version> </dependency>
2、先创建与表对应的实体类
@data public class demodata { @excelproperty("字符串标题") private string string; @excelproperty("日期标题") private date date; @excelproperty("数字标题") private double doubledata; /** * 忽略这个字段 */ @excelignore private string ignore; }
3、生成表格
private list<demodata> data() { list<demodata> list = new arraylist<demodata>(); 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; } //根据list 写入excel @test public void simplewrite() { string path = "d:\\qdsystem\\resources\\下载\\"; // 写法1 string filename = path + "qiadnu.xlsx"; // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭 easyexcel.write(filename, demodata.class).sheet("模板").dowrite(data()); }
读取表格
1、实体类 同上。
2、解析
// 有个很重要的点 demodatalistener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去 public class demodatalistener extends analysiseventlistener<demodata> { private static final logger logger = loggerfactory.getlogger(demodatalistener.class); /** * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收 */ private static final int batch_count = 5; list<demodata> list = new arraylist<demodata>(); /** * 假设这个是一个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; } /** * 这个每一条数据解析都会来调用 * @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("存储数据库成功!"); } }
dao层
/** * 假设这个是你的dao存储。当然还要这个类让spring管理,当然你不用需要存储,也不需要这个类。 **/ public class demodao { public void save(list<demodata> list) { // 如果是mybatis,尽量别直接调用多次insert,自己写一个mapper里面新增一个方法batchinsert,所有数据一次性插入 } }
3、测试
@test public void simpleread() { // 有个很重要的点 demodatalistener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去 // 写法1: string filename = path + "qiadnu.xlsx"; // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭 easyexcel.read(filename, demodata.class, new demodatalistener()).sheet().doread(); }
这里只是简单使用,具体到官方文档进行解读
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!
上一篇: AIML应答机器人(二)java实现