使用EasyExcel导入导出Excel

在管理一个系统时,总会有许多的数据,为了方便浏览查看数据,系统总会提供「导出Excel」的功能;有导出就有导入,在要向数据库中插入大量的数据时,我们向程序提供准备好的 Excel,然后程序读取表格内容,并将数据添加到数据库中。

实现这个「导入/导出 Excel」的功能也不复杂,我们使用第三方的类库即可实现。

技术选型

能够实现「导入/导出 Excel」的第三方常用类库有 Apache poi、Java Excel(JXL)和阿里巴巴开源的 Easyexcel 等。这么多类库该怎么选呢?在这里我给大家推荐阿里巴巴开源的「Easyexcel」。

  • 性能对比
    poi 和 jxl 对内存的消耗很大,在处理大批量的数据时,容易造成内存溢出。比如处理一个 3M 的 Excel,poi 和 jxl 可能需要上百兆的内存,但 easyexcel 可能只需要几百或几千 KB(内存消耗对比有些夸张)。在性能这一块,Excel 完全是吊打 poi 和 jxl。

  • 学习复杂度对比
    我最开始使用的是 poi。在学习它的时候,理解起来不难,就是操作的时候太特么的难了。因为 poi 需要自己处理数据,还有复杂的表格样式,就光是处理数据这一款就很头疼了。等你写好所有的代码,没有几百行,你是实现不了的。反观 easyexcel。它能自己处理数据,表格格式也简单,即使是小白也很容易上手。在学习复杂的这块也吊打 poi,而 jxl 我没了解,但多半也是被吊打。

项目结构

项目结构

pom.xml

在项目中需要额外添加 EasyExcel 和文件上传的依赖(需要上传 Excel)。需要注意的时,EasyExcel 和 Apache poi 存在冲突,所以需要在项目中去除 poi 的依赖,然而我们并没有在项目引入 poi 的依赖,又怎么会又 poi 呢?这是因为在我们的项目中,有其它包依赖于 poi,而我们就需要将其找出来,并去除其中的 poi 依赖。最简单的方法就是一个个试。

.........
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><!-- 去除 poi --><exclusions><exclusion><groupId>org.apache.poi</groupId><artifactId>poi</artifactId></exclusion></exclusions><version>${org.slf4j-version}</version>
</dependency>
<!-- 文件上传依赖 -->
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>1.3.2</version>
</dependency>
<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.2.1</version>
</dependency>
<!--Alibaba-Excel-->
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>1.1.2-beat1</version>
</dependency>

ExcelListener

使用 EasyExcel,我们需要继承 AnalysisEventListener

public class ExcelListener extends AnalysisEventListener {//可以通过实例获取该值private List<Object> datas = new ArrayList<Object>();public void invoke(Object o, AnalysisContext analysisContext) {datas.add(o);//数据存储到list,供批量处理,或后续自己业务逻辑处理。doSomething(o);//根据自己业务做处理}private void doSomething(Object object) {//1、入库调用接口}public List<Object> getDatas() {return datas;}public void setDatas(List<Object> datas) {this.datas = datas;}public void doAfterAllAnalysed(AnalysisContext analysisContext) {// datas.clear();//解析结束销毁不用的资源}
}

其中, invoke()doAfterAllAnalysed() 是必须实现的方法。

invoke() 中,我们将数据封装到 list 中,再在控制器中,通过 getter() 方法获取数据,这样我们就可以获取到 easyexcel 帮我们解析好的数据,再将数据进行类型转化,这样,我们就可以对数据进行写入操作。

Category

这是一个实体类。我们导出 Excel 时,有时需要表头,如果需要表头,我们就可以在相应的实体类中加入 @ExcelProperty(value = "id", index = 0) 注解,并且继承 BaseRowModel。其中 value 代表在导出 Excel 时,该字段对应的表头名称;index 代表该字段对应的表头位置。

public class Catagory extends BaseRowModel {@ExcelProperty(value = "id", index = 0)private Integer id;@ExcelProperty(value = "name", index = 1)private String name;.........
}

ExcleController

作为程序的控制器,其中包含 导入/导出 Excel 的 @RequestMapping

/expor

这是导出 Excel 的控制器,导出的思路也很简单。

  1. 添加响应头信息;

  2. 添加 ExcelWriter;

  3. 添加 Sheet(表单);

  4. 添加数据;

  5. 输出。

@RequestMapping("/expor")
public String exporExcel(HttpServletResponse response) throws IOException {ExcelWriter writer = null;OutputStream outputStream = response.getOutputStream();try {//添加响应头信息response.setHeader("Content-disposition", "attachment; filename=" + "catagory.xls");response.setContentType("application/msexcel;charset=UTF-8");//设置类型response.setHeader("Pragma", "No-cache");//设置头response.setHeader("Cache-Control", "no-cache");//设置头response.setDateHeader("Expires", 0);//设置日期头//实例化 ExcelWriterwriter = new ExcelWriter(outputStream, ExcelTypeEnum.XLS, true);//实例化表单Sheet sheet = new Sheet(1, 0, Catagory.class);sheet.setSheetName("目录");//获取数据List<Catagory> catagoryList = excleService.findAll();//输出writer.write(catagoryList, sheet);writer.finish();outputStream.flush();} catch (IOException e) {e.printStackTrace();} finally {try {response.getOutputStream().close();} catch (IOException e) {e.printStackTrace();}}return "index";
}

/import

这是导入 Excel 的控制器,实现思路与导入的思路类似,不过这个不需添加响应头信息。

  1. 实例化 ExcelListener;

  2. 实例化 ExcelReader;

  3. 读取表格信息;

  4. 向数据库插入数据。

@RequestMapping("/import")
public String importExcel(@RequestParam("file") MultipartFile file) throws IOException {InputStream inputStream = file.getInputStream();//实例化实现了AnalysisEventListener接口的类ExcelListener listener = new ExcelListener();//传入参数ExcelReader excelReader = new ExcelReader(inputStream, ExcelTypeEnum.XLS, null, listener);//读取信息excelReader.read(new Sheet(1, 1, Catagory.class));//获取数据List<Object> list = listener.getDatas();List<Catagory> catagoryList = new ArrayList<Catagory>();Catagory catagory = new Catagory();//转换数据类型,并插入到数据库for (int i = 0; i < list.size(); i++) {catagory = (Catagory) list.get(i);catagoryMapper.insertCategory(catagory);}return "index";
}

JSP

涉及到文件的上传,所以在 JSP 中,需要注意 formenctype 类型。不然,你在上传文件时会一直报错。

<form action="${pageContext.request.contextPath}/import", method="post", enctype="multipart/form-data"><input type="file" name="file"/><input type="submit">
</form>

写到这里,程序的主要代码也看的差不多了,其它的代码请查看项目源码。

导出 Excel 效果

导出效果

JSP 效果

jsp页面

点击获取项目源码



作者:Xuuuuucong
链接:https://www.jianshu.com/p/78cc1729fbd1
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

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

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

相关文章

EasyExcel导入导出,处理数据

1.导出模块,导出中有中文文件名称&#xff0c;设置格式 /*** 以流方式响应回给客户端&#xff0c;返回值类型设置成void** param response 输出excel表格&#xff0c;让用户下载*/PostMapping("/exportExcel")public void exportExcel(ZqRewardProjectContract zqRew…

QT常用表格导出为Excel以及Excel导入表格

表格导出为Excel 注意&#xff1a;演示所用到的软件为Qt5.14.2&#xff0c;编译器为MinGW 64-bit&#xff0c;电脑必须装有office所用的类为 QAxObject&#xff0c;QAxObject可以实例化为一个空对象&#xff0c;使用它应该封装的COM对象的名称&#xff0c;或者使用一个指向表示…

获取微信的聊天记录导出为Excel

获取微信的聊天记录导出为Excel ios端 1.工具2.步骤 1.工具 iTunes楼月免费iTunes备份管理器DB Browser for SQLitepython 2.步骤 通过iTunes备份ipone中的数据到电脑上&#xff0c; 打开楼月免费iTunes备份管理器选择备份的记录 导出 微信个人信息中的DB文件夹 使用 DB Br…

Excel表格的导入导出——EasyExcel

参考视频 csdn参考地址 一、导入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version> </dependency>二、实体类 方式一&#xff1a;Excel Property&#xff08;&…

Easyexcel导入导出多个sheet

EasyExcel对于导入导出的操作十分简洁&#xff0c;记录一下多个sheet且内容不一致的导入导出。 引入 easyExcel依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.1</version></d…

EasyExcel实现Excel文件多sheet导入导出

一、概述 最近公司需要做一个需求&#xff0c;通过excel上传病例信息&#xff0c;并将病例信息进行归档和整理&#xff1b;该需求可以简化为excel模板下载和excel上传并解析归档。既然知道需求了&#xff0c;找excel的操作工具jar包吧&#xff0c;发现以前常用的poi需要写的代…

导入导出excel表格EasyExcel操作

一、添加依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.3</version> </dependency>二、创建实体类 /*** 创建User类,用于构建向Excel表格中写数据的类型;* ExcelPropert…

EasyExcel的导入导出使用

1、说明 EasyExcel是阿里出的一款基于Java的、快速、简洁、解决大文件内存溢出的处理Excel的开源工具&#xff0c;本文主要是使用这个工具对Excel导入导出进行讲解。 官网&#xff1a; https://easyexcel.opensource.alibaba.com/github&#xff1a; https://github.com/alib…

EasyExcel实现execl导入导出

引言 在实际开发中&#xff0c;处理 Excel 文件是一个常见的需求。EasyExcel 是一个基于 Java 的开源库&#xff0c;提供了简单易用的 API&#xff0c;可以方便地读取和写入 Excel 文件。本文将介绍如何使用 EasyExcel 实现 Excel 导入功能&#xff0c;以及一些相关的技巧和注…

导入Excel---post提交通用版

前端界面 通过点击导入弹出一个文本框下载导入的模板 直接进入代码实现环节: 前端部分添加导入按钮: <a href"javascript:;" class"btn btn-primary radius professional_btn">导入</a> 导入的文本框 //导入 $(".professional_btn&qu…

EasyExcel实现Excel文件导入导出

1 EasyExcel简介 EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 github地址: https://github.com/alibaba/easyexcel 官方文档: https://www.yuque.com/easyexcel/doc/easyexcel B站视频: https://www.bilib…

导出Excel表格(调用后端接口方式)

在开发中我们会遇到导出Excel表格的需求&#xff0c;但是导出分为前端生成和后端生成。 前端生成的方式CSDN其他小伙伴已经做出了很多教程&#xff0c;是依赖 xlsx插件。 但是&#xff0c;今天我讲的是&#xff0c;调用后端接口的方式生成Excel表格。 1.调用后端提供的导出接口…

如何快速构建网站chatgpt插件

在本文中&#xff0c;我们将一步一步地探索并构建一个名为"AI Prompt Testing"的项目。该项目是一个网站插件&#xff0c;旨在帮助网站生成一个ChatGPT提示测试题&#xff0c;以巩固当前网页的内容。 1、抽象提取 这个网站chatgpt插件大概的效果&#xff0c;类比的…

【ChatGPT】ChatGPT 高质量资源列表:3000 多个提示、示例、用例、工具、API、扩展、失败和其他资源的集合。

ChatGPT 高质量资源列表:3000 多个提示、示例、用例、工具、API、扩展、失败和其他资源的集合。 更新了 4 月 25 日,集成自治代理 AI 部分。 图片来源:作者,Midjourney。 目录 ChatGPT 高质量资源列表:3000 多个提示、示例、用例、工具、API、扩展、失败和其他资源的集合。…

伟大的创造不是计划出来的!来自OpenAI科学家的反直觉建议

来源 | 中国企业家杂志 每天几乎从一睁眼&#xff0c;我们的工作与生活都会被大大小小的目标所牵引。 诚然&#xff0c;若只想实现一些普普通通的小愿望&#xff0c;那么目标导向会非常有效。但对于那些与探索创造、创新发明有关的愿望&#xff0c;目标还有效吗&#xff1f; 近…

GitHub放大招!CEO现场挑战18分钟开发小游戏,人还在台上网友已经玩到了

梦晨 明敏 发自 凹非寺量子位 | 公众号 QbitAI GitHub CEO&#xff0c;直播AI写代码&#xff0c;挑战18分钟完成一个小游戏。 结果只用了不到15分钟&#xff0c;直接成功在线部署&#xff0c;这边人还在讲台上&#xff0c;全球网友已经能玩上了。 整个项目从一片空白的新建文件…

字节跳动副总裁谢欣:未来组织的30条思考

上一篇&#xff1a;支付系统就该这么设计&#xff0c;稳的一批&#xff01;&#xff01; 透明、共享是是创造愉悦工作环境、吸引牛人的前提&#xff0c;是弹性组织有效运作的根基&#xff0c;是未来组织的基石。 来源 | 华麓之音 01 组织升级&#xff1a; 员工需要被激发&#…

用ChatGPT实际沟通的结果[有图有真相]

笔者因为没有办法正常注册账号&#xff0c;所以使用的是试用版的chatgpt&#xff0c;语言模型当下试用版的是Chatgpt3.5的模型&#xff0c;而不是商用版的ChatGPT-4的模型。 首先问AI对单词词汇的含义的理解。 回答的很得体&#xff0c; 然后问对职业的区分&#xff0c;这些我都…

CnOpenData·A股上市公司标准数据

一、数据简介 按照《中华人民共和国标准化法》的定义&#xff0c;标准是指农业、工业、服务业以及社会事业等领域需要统一的技术要求。标准作为一种通用性的规范语言&#xff0c;在合理利用国家资源、保障产品质量、提高市场信任度、促进商品流通、维护公平竞争、保障安全等方面…

ChatGPT炒股:批量下载北交所上市公司的招股说明书

打开北京证券交易所官网&#xff0c;点击发行上市&#xff0c;然后点击公开发行信息披露&#xff0c;然后在查询框里面输入关键词&#xff1a;在北京证券交易所上市招股说明书&#xff0c;然后选择时间&#xff0c;点击查询&#xff0c;就可以看到所有北交所上市公司的招股说明…