当前位置: 首页 > news >正文

excel系列(二) - 利用 easypoi 快速实现 excel 文件导入导出

一、介绍

在上篇文章中,我们介绍了 apache poi 工具实现 excel 文件的导入导出。

本篇我们继续深入介绍另一款优秀的 excel 工具库:easypoi。

二、easypoi

以前的以前,有个大佬程序员,跳到一家公司之后就和业务人员聊上了,这些业务员对excel报表有着许许多多的要求,比如想要一个报表,他的表头是一个多行表头,过几天之后,他想要给这些表头添加样式,比如关键的数据标红,再过几天,他想要再末尾添加一条合计的数据,等等!

起初还好,都是copy、copy,之后发现系统中出现大量的重复代码,于是有一天真的忍受不了了,采用注解搞定来搞定这些定制化成程度高的逻辑,将公共化抽离出来,于是诞生了 easypoi!

easypoi 的底层也是基于 apache poi 进行深度开发的,它主要的特点就是将更多重复的工作,全部简单化,避免编写重复的代码!

下面,我们就一起来了解一下这款高大上的开源工具:easypoi

3.1、首先添加依赖包
<dependencies><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.1.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>4.1.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>4.1.0</version></dependency>
</dependencies>
3.2、采用注解导出导入

easypoi 最大的亮点就是基于注解实体类来导出、导入excel,使用起来非常简单!

首先,我们创建一个实体类UserEntity,其中@Excel注解表示导出文件的头部信息。

public class UserEntity {@Excel(name = "姓名")private String name;@Excel(name = "年龄")private int age;@Excel(name = "操作时间",format="yyyy-MM-dd HH:mm:ss", width = 20.0)private Date time;//set、get省略
}

接着,我们来编写导出服务!

public static void main(String[] args) throws Exception {List<UserEntity> dataList = new ArrayList<>();for (int i = 0; i < 10; i++) {UserEntity userEntity = new UserEntity();userEntity.setName("张三" + i);userEntity.setAge(20 + i);userEntity.setTime(new Date(System.currentTimeMillis() + i));dataList.add(userEntity);}//生成excel文档Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户","用户信息"),UserEntity.class, dataList);FileOutputStream fos = new FileOutputStream("/Users/hello/Documents/easypoi-user1.xls");workbook.write(fos);fos.close();
}

导出的文件预览如下:

对应的导入操作,也很简单,源码如下:

public static void main(String[] args) {ImportParams params = new ImportParams();params.setTitleRows(1);params.setHeadRows(1);long start = new Date().getTime();List<StudentEntity> list = ExcelImportUtil.importExcel(new File("/Users/hello/Documents/easypoi-user1.xls"),UserEntity.class, params);System.out.println(new Date().getTime() - start);System.out.println(JSONArray.toJSONString(list));
}

运行程序,输出结果如下:

[{"age":20,"name":"张三0","time":1616919493000},{"age":21,"name":"张三1","time":1616919493000},{"age":22,"name":"张三2","time":1616919493000},{"age":23,"name":"张三3","time":1616919493000},{"age":24,"name":"张三4","time":1616919493000},{"age":25,"name":"张三5","time":1616919493000},{"age":26,"name":"张三6","time":1616919493000},{"age":27,"name":"张三7","time":1616919493000},{"age":28,"name":"张三8","time":1616919493000},{"age":29,"name":"张三9","time":1616919493000}]
3.3、自定义数据结构导出导入

easypoi 同样也支持自定义数据结构导出导入excel。

  • 自定义数据导出 excel
public static void main(String[] args) throws Exception {//封装表头List<ExcelExportEntity> entityList = new ArrayList<ExcelExportEntity>();entityList.add(new ExcelExportEntity("姓名", "name"));entityList.add(new ExcelExportEntity("年龄", "age"));ExcelExportEntity entityTime = new ExcelExportEntity("操作时间", "time");entityTime.setFormat("yyyy-MM-dd HH:mm:ss");entityTime.setWidth(20.0);entityList.add(entityTime);//封装数据体List<Map<String, Object>> dataList = new ArrayList<>();for (int i = 0; i < 10; i++) {Map<String, Object> userEntityMap = new HashMap<>();userEntityMap.put("name", "张三" + i);userEntityMap.put("age", 20 + i);userEntityMap.put("time", new Date(System.currentTimeMillis() + i));dataList.add(userEntityMap);}//生成excel文档Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("学生","用户信息"), entityList, dataList);FileOutputStream fos = new FileOutputStream("/Users/panzhi/Documents/easypoi-user2.xls");workbook.write(fos);fos.close();
}
  • 导入 excel
public static void main(String[] args) {ImportParams params = new ImportParams();params.setTitleRows(1);params.setHeadRows(1);long start = new Date().getTime();List<Map<String, Object>> list = ExcelImportUtil.importExcel(new File("/Users/panzhi/Documents/easypoi-user2.xls"),Map.class, params);System.out.println(new Date().getTime() - start);System.out.println(JSONArray.toJSONString(list));
}

更多的 api 操作可以访问 Easypoi - 接口文档

三、小结

总体来说,easypoi 在读写数据的时候,优先是先将数据写入内存,优点是读写性能非常高,但是当数据量很大的时候,会出现oom,当然它也提供了 sax 模式的读写方式,需要调用特定的方法实现。

四、参考

1、apache poi - 接口文档

2、easypoi - 接口文档

3、easyexcel - 接口文档

写到最后

不会有人刷到这里还想白嫖吧?点赞对我真的非常重要!在线求赞。加个关注我会非常感激!

本文已整理到技术笔记中,此外,笔记内容还涵盖 Spring、Spring Boot/Cloud、Dubbo、JVM、集合、多线程、JPA、MyBatis、MySQL、微服务等技术栈。

需要的小伙伴可以点击 技术笔记 获取!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • QQ频道导航退出
  • CV09_深度学习模块之间的缝合教学(4)--调参
  • 自定义 Java ClassLoader:深入探索
  • 13 IP层协议-网际控制报文协议ICMP
  • 人工智能算法工程师(中级)课程13-神经网络的优化与设计之梯度问题及优化与代码详解
  • 【正点原子i.MX93开发板试用连载体验】录音小程序采集语料
  • C++客户端Qt开发——常用控件(多元素控件)
  • 数据库管理1
  • 【Linux】centos7安装PHP7.4报错:libzip版本过低
  • 计算机网络入门
  • Ubuntu 磁盘扩容
  • PHP全功能微信投票迷你平台系统小程序源码
  • [web]-图片上传、文件包含-图片上传
  • GNSS技术干货(34):天灵灵 地灵灵 不如C/N0灵
  • Python酷库之旅-第三方库Pandas(026)
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • Angular6错误 Service: No provider for Renderer2
  • Angular数据绑定机制
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Invalidate和postInvalidate的区别
  • Theano - 导数
  • Vue2.0 实现互斥
  • 仿天猫超市收藏抛物线动画工具库
  • 前端知识点整理(待续)
  • 数据仓库的几种建模方法
  • 问题之ssh中Host key verification failed的解决
  • 一份游戏开发学习路线
  • Android开发者必备:推荐一款助力开发的开源APP
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​补​充​经​纬​恒​润​一​面​
  • ​浅谈 Linux 中的 core dump 分析方法
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #if 1...#endif
  • (1)(1.13) SiK无线电高级配置(六)
  • (1)Jupyter Notebook 下载及安装
  • (160)时序收敛--->(10)时序收敛十
  • (C语言)共用体union的用法举例
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (Qt) 默认QtWidget应用包含什么?
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (十一)图像的罗伯特梯度锐化
  • (四)Linux Shell编程——输入输出重定向
  • (新)网络工程师考点串讲与真题详解
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)编辑寄语:因为爱心,所以美丽
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .ai域名是什么后缀?
  • .Net Core 中间件验签
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖