easyExcel 使用指南详解

来源:easyExcel 使用指南详解 - 知乎

easyExcel简介

Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc。

easyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称

64M内存1分钟内读取75M(46W行25列)的Excel(当然还有急速模式能更快,但是内存占用会在100M多一点)

easyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。

下图是easyExcel和POI在解析Excel时的对比图。 

easyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)。

上面简要介绍了easyExcel的特点和原理,关于easyExcel的其他问题可以先参考下这个文章。下面就通过代码来介绍下怎么使用easyExcel。

快速使用指南

文件上传读取Excel

下面通过一个读取用户信息的列子来展示下怎么使用easyExcel。

step1:创建用户信息类

@Data
public class UserInfo extends BaseRowModel {@ExcelProperty(index = 0)private String name;@ExcelProperty(index = 1)private int age;@ExcelProperty(index = 2)private String address;}

step2:创建AnalysisEventListener子类

/*** 每解析一行会回调invoke()方法。* 整个excel解析结束会执行doAfterAllAnalysed()方法*///有个很重要的点   不能被spring管理,要每次读取excel都要new。
//这边就会有一个问题:如果UserInfoDataListener中需要用到Spring中的主键怎么办?
public class UserInfoDataListener extends AnalysisEventListener<UserInfo> {Logger logger = LoggerFactory.getLogger(UserInfoDataListener.class);//每次读取100条数据就进行保存操作private static final int BATCH_COUNT = 100;//由于每次读都是新new UserInfoDataListener的,所以这个list不会存在线程安全问题List<UserInfo> list = new ArrayList<>();//这个组件是Spring中的组件,这边推荐两种方法注入这个组件//第一种就是提供一个UserInfoDataListener的构造方法,这个方法提供一个参数是UserInfoDataListener类型//另外一种方法就是将 UserInfoDataListener 这个类定义成 UserService 实现类的内部类(推荐这种方式)//private UserService userService;@Overridepublic void invoke(UserInfo data, AnalysisContext analysisContext) {logger.info("解析到一条数据:{}", JSON.toJSONString(data));list.add(data);if (list.size() >= BATCH_COUNT) {saveData();// 存储完成清理 listlist.clear();}}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {// 这里也要保存数据,确保最后遗留的数据也存储到数据库saveData();logger.info("所有数据解析完成!");}private void saveData() {logger.info("{}条数据,开始存储数据库!", list.size());//保存数据//userService.save(list);logger.info("存储数据库成功!");}}

step3: 读取excel

public class EasyExcelDemo {public static void main(String[] args) throws Exception {InputStream fis = new FileInputStream("D:\\UserInfo.xlsx");AnalysisEventListener listener = new UserInfoDataListener();ExcelReader excelReader = EasyExcel.read(fis, UserInfo.class, listener).build();ReadSheet readSheet = EasyExcel.readSheet(0).build();ReadSheet readSheet2 = EasyExcel.readSheet(1).build();excelReader.read(readSheet);// 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的excelReader.finish();}}

只需要上面3步就能进行Excel的读取了。

文件下载Excel

public class ExcelUtil {public static OutputStream getOutputStream(String fileName, HttpServletResponse response)throws Exception{try{fileName = URLEncoder.encode(fileName,"utf-8");response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");//此处指定了文件类型为xls,如果是xlsx的,请自行替换修改response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".xls");response.setHeader("Pragma", "public");response.setHeader("Cache-Control", "no-store");response.addHeader("Cache-Control", "max-age=0");return response.getOutputStream();} catch (IOException e){throw new Exception("导出文件失败!");}}public static void writeExcel(HttpServletResponse response, List<? extends BaseRowModel> list, String fileName,String sheetName, Class clazz) throws Exception {ExcelWriter writer = new ExcelWriter(getOutputStream(fileName, response), ExcelTypeEnum.XLS);Sheet sheet = new Sheet(1, 0, clazz);sheet.setSheetName(sheetName);writer.write(list, sheet);writer.finish();}}

在Controller中我们只要像下面这种方式调用就行了。

@RequestMapping(value = "/file/testExcelDownload")public void testExcelDownload(HttpServletRequest request,HttpServletResponse response){//以下信息从数据库中查出List<ExcelInfo> excelInfos = new ArrayList<>();ExcelInfo info1 = new ExcelInfo();ExcelInfo info2 = new ExcelInfo();excelInfos.add(info1);excelInfos.add(info2);info1.setIssuerName("name1");info1.setRiskLevel("level1");info2.setIssuerName("name1");info2.setRiskLevel("level1");try {String fileName = "excelInfo";String sheetName = "sheet1";ExcelUtil.writeExcel(response, excelInfos, fileName, sheetName, ExcelInfo.class);} catch(Exception e){log.error("模板下载失败",e);}}

在导出Excel的部分,easyExcel还提供了自定义样式,插入表格,插入图片等其他功能,还有一个比较有意思的功能就是Excel模板填充的功能。详细的功能信息参考官方文档。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/495719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(转)Web Services使用多态(XmlInclude) ,支持自定义类型

Web Services使用多态(XmlInclude) 在Web Services方法中&#xff0c;往往使用的都是一个具体类型的参数&#xff0c;这个参数一般就是一个数据对象。ASP.NET Web Services通过声明XmlIncludeAttribute可以实现Web Services方法中运用多态。 XmlIncludeAttribute允许XmlSeriali…

激光破解太空通信难题

来源&#xff1a;新浪科技摘要&#xff1a;虽然目前而言无线电天线仍然是太空通信的支柱&#xff0c;但目前未来发展方向是激光通讯系统。在太空中&#xff0c;没有人会听到你的尖叫——因为声音不会在真空中传播&#xff0c;而且你需要某种类型的无线电波中继携载这些信息&…

Docker 原理、学习教程

Docker 官网 &#xff1a;https://www.docker.com/ Docker Hub&#xff1a;https://registry.hub.docker.com/search?qkali Docker 容器超详细讲解&#xff1a;https://www.linuxidc.com/Linux/2018-08/153712.htm Docker Compose&#xff1a;https://www.runoob.com/docker…

从自动驾驶到基因编辑,这15项发明专利改变了世界

来源&#xff1a;资本实验室近期&#xff0c;中兴通讯受美国制裁的事件戳中了国人心中的“痛”&#xff0c;也对我们长期受制于人的芯片核心技术与产业敲响了警钟。我们近乎被动地发现&#xff0c;在科技创新&#xff0c;尤其是技术驱动型创新方面&#xff0c;我们的差距到底有…

org.dom4j.DocumentFactory cannot be cast to org.dom4j.DocumentFactory

引入cryptofront-2.1.6.jar后dom4j执行异常 解决方案&#xff0c;强制在cryptofront-2.1.6.jar加载前&#xff0c;加载dom4j dom4j引入不完整

Cheat Engine 教程( 1 - 9 通关 )

工具包&#xff1a;https://down.52pojie.cn/Tools/Debuggers/ Cheat Engine 官网&#xff1a;https://www.cheatengine.org/ ce 修改器绿色版(cheat engine) v7.4 官方最新版&#xff1a;http://www.downcc.com/soft/21673.html 这个教程全部是来自 Cheat Engine 软件的中的…

人工智能元老痛批IBM:沃森是个骗局,这根本不是认知

作者 Roger Schank李林 编译整理量子位 出品 | 公众号 QbitAI一篇质疑IBM的旧文今天在HackerNews上火了起来&#xff0c;虽已时隔两年&#xff0c;这篇文章还是引起了网友们的强烈共鸣。文章作者Roger Schank是AI领域元老人物&#xff0c;AAAI Fellow&#xff0c;曾任耶鲁大学人…

OllyDBG完美教程(超强入门级)

OllyDBG 视频教程&#xff1a;https://www.bilibili.com/video/av6889190 动态调试工具之OllyDbg(OD)教程&#xff1a;https://www.bilibili.com/video/av70600053 使用 OllyDbg 从零开始 Cracking.chm ( 58章 )&#xff1a;https://pan.baidu.com/s/18iXvF5I_No4-a1DK3jKrbg …

12种Bean转换

来源&#xff1a;再见 BeanUtils&#xff01;性能真拉跨&#xff01; 一、前言 二、性能测试对比 三、12种转换案例 1. get\set 2. json2Json 3. Apache copyProperties 4. Spring copyProperties 5. Bean Mapping 6. Bean Mapping ASM 7. BeanCopier 8. Orika 9. Do…

上海人工智能再出重磅!寒武纪科技发布新一代云端AI芯片,联想、曙光、科大讯飞发布相关应用...

来源&#xff1a;文汇网 作者&#xff1a;许琦敏、郭超豪峰值功耗不超过110瓦&#xff0c;等效理论峰值速度可达每秒166.4万亿次定点运算。寒武纪科技在上海发布了中国第一款云端智能芯片——Cambricon MLU100芯片和板卡产品、寒武纪1M终端智能处理器IP产品。联想、曙光和科大…

OD 快捷键使用大全。非常详细( 游戏逆向分析必看 )+ OD 断点 使用大全

From&#xff1a;https://www.cnblogs.com/YiShen/p/9742872.html OllyDBG 快捷键 OllyDbg 窗口通用快捷键 快捷键    功能      Ctrl F2重启程序&#xff0c;即重新启动被调试程序&#xff08; 重新载入程序 &#xff09;。如果当前没有调试的程序&#xff0c;Oll…

电子发票中数字签名的提取解析

前言 随着电子信息技术的发展与成熟&#xff0c;加上国家的大力推广&#xff0c;电子发票已经开始慢慢取代纸质发票。相比传统的纸质发票&#xff0c;电子发票除了绿色环保&#xff0c;节约成本之外&#xff0c;更重要的是电子发票采取电子签章实现发票签名、电子盖章&#xff…

无人车、超级高铁、智慧城市......这是一份来自未来的出行报告

来源&#xff1a;机器之能 作者&#xff1a;Charles McLellan 编译&#xff1a;王宇欣在新兴技术的驱动下&#xff0c;运输业即将迎来第二春。虽然个中细节还需打磨&#xff0c;但未来的运输系统必然会实现数据驱动、彼此相关联、高度自动化。有关技术与运输业未来的文章比比皆…

在 VC++ 中使用 内联汇编

From&#xff1a;https://blog.csdn.net/root19881111/article/details/8450266 VC内联汇编(MSDN相关内容完整翻译)&#xff1a;http://www.cppblog.com/xingkongyun/archive/2008/12/21/70003.html 调 call 和 偷功能 时&#xff0c;VC中内联汇编容易产生的错误&#xff1a;…

OFD 版式技术解析系列(一):开篇

在版式电子文件领域&#xff0c;大家比较熟悉的就是 PDF(Portable Document Format)格式&#xff0c;该格式由 Adobe 公司在 1992 年发布&#xff0c;迄今已经有 28 个年头&#xff0c;2008 年 7 月 1 日&#xff0c;IS 组织正式发布 PDF 的国际标准&#xff0c;PDF 成为了独立…

无人驾驶急需解决:规划控制和传感器价格高两大问题

来源&#xff1a;AI科技大本营 作者 &#xff1a;Mavis2017 年百度 AI 开发者大会上&#xff0c;现场视频连线了正乘坐无人驾驶汽车行驶在五环上朝会场赶来的李彦宏&#xff0c;他坐在副驾驶上解说&#xff0c;身边司机的双手并没有触碰方向盘&#xff0c;也正是因为这句话&am…

CString 与 LPCWSTR、LPSTR、char*、LPWSTR 等类型的转换

From&#xff1a;https://www.cnblogs.com/leanee/articles/2940088.html char [] 到 LPWSTR转换的一个具体应用&#xff1a;http://www.cppblog.com/lateCpp/articles/153358.html CString详细讲解&#xff1a;https://blog.csdn.net/qq_41786318/article/details/81989217 …

ofd电子文档内容分析工具(分析文档、签章和证书)

前言 ofd是国家文档标准&#xff0c;其对标的文档格式是pdf。ofd文档是容器格式文件&#xff0c;ofd其实就是压缩包。将ofd文件后缀改为.zip&#xff0c;解压后可看到文件包含的内容。 加入QQ交流群&#xff1a;618168615。获取下载程序。 ofd文件解压后&#xff0c;可以看到…

关于信任

[caption id"attachment_349" align"alignnone" width"374" caption"Trust is the most important thing to the team!"][/caption] 偶然间看到一张截图&#xff0c;是杭州小马哥不知何年何月何地做的show&#xff0c;这句话从他嘴里讲…

ES的安装和RestClient的操作

目录 初识elasticsearch 什么是elasticsearch elasticsearch的发展 Lucene的优缺点 elasticsearch的优势 倒排索引 es与mysql的概念对比 文档 索引 概念对比 架构 安装es 安装kibana 安装ik分词器 分词器 安装ik分词器 ik分词器的拓展和停用词典 操作索引库…