【笔记】Spring整合EasyExcel
EasyExcel
EasyExcel 由五部分组成,分别是配置读取类(EasyExcelHalper)、导出Excel类(EasyExcelExportUtil)、导入Excel类(EasyExcelImportUtil)、导入Excel返回结果类(EasyExcelImportResult)和xml配置文件。
应用环境:
单线程、不牵扯到并发操作。同一时间只有一人做导入操作,或只有管理员有导入权限。(受限于程序中的唯一性校验)
导入数据,列不超过26(受限于英文26个字母,不合法数据的定位),数量不大(受限于程序中数据校验,不合法数据的定位,所谓越详细就越复杂),支持常用的数据类型。
优点:
可以控制任意字段的类型、是否可以为空及某个字段的唯一性,避免重复导入。
精确返回某一条不合法数据的某个字段的位置,方便用户根据提示修改Excel数据。例如:B3
有严格的数据校验,避免导入的数据不能转成目标类型(数据库字段类型)。
可以冻结标题行。
缺点:
既要不合法数据精确定位,又要数据校验,导致控制程序逻辑较多,以性能换取数据质量。
避免重复导入功能要求不能并发操作。
数据量不能超过一个sheet页,且数据尽量少。
需要准确在xml里配置标签、字段、字段数据类型、是否可以为空、是否唯一。
快速入门:
- 添加Maven依赖
<dependency><groupId>commons-configuration</groupId><artifactId>commons-configuration</artifactId><version>1.10</version>
</dependency><dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>3.2.2</version>
</dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.9</version>
</dependency>
- xml配置
默认文件名【easyExcel-config.xml】,当然如果你觉得不爽,可以在EasyExcelHalper类中修改。
默认文件放到src/main/resources根目录下。
无需spring加载该配置文件,EasyExcelHalper类自动去默认位置加载easyExcel-config.xml。
可以配置多个sheet页,在程序中传参选择使用哪个数据模板。
xml的基本结构
<excel><sheets><sheet><title>图书</title><freeze>true</freeze><columns><column><name>书名</name><type>java.lang.String</type><notNull>true</notNull><unique>true</unique></column><!-- column... --></columns></sheet><!-- sheet... --></sheets>
</excel>
其中,excel、sheets、sheet、title、columns、column、name、type节点是必有的。
3.jsp
<body><a href="book/exportExcel">导出Excel</a><form action="book/importExcel" method="post" enctype="multipart/form-data"><input type="file" value="导入Excel" name="bookExcel"><input type="submit" value="导入Excel" > </form>
</body>
4.Controller
import javax.servlet.http.HttpServletResponse;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;import com.sep6th.service.BookSrvImpl;
import com.sep6th.util.EasyExcelImportResult;/** * The Apache License 2.0* Copyright (c) 2018 sep6th*/@Controller
@RequestMapping("/book")
public class BookController {@Autowiredprivate BookSrvImpl bookSrv;/*** 导出*/@RequestMapping("/exportExcel")public void exportExcel(HttpServletResponse response) throws Exception {String fileName = "书籍清单";bookSrv.exportExcel(response,fileName);}/*** 导入* 返回的json格式:* {"dataCount":3,"errDataCount":0,"importDataCount":3,"xyOfNullList":[],"xyOfTypeNoMatchList":[],"xyOfRepList":[]}*/@RequestMapping("/importExcel")@ResponseBodypublic EasyExcelImportResult importExcel(Model model, MultipartFile bookExcel){return bookSrv.importExcel(bookExcel);}}
- Service
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import com.sep6th.util.EasyExcelExportUtil;
import com.sep6th.util.EasyExcelImportResult;
import com.sep6th.util.EasyExcelImportUtil;/** * The Apache License 2.0* Copyright (c) 2018 sep6th*/@Service
public class BookSrvImpl {/*** 导出模板或数据*/public void exportExcel(HttpServletResponse response, String fileName) {Map<Integer,List<Object[]>> map = new HashMap<Integer,List<Object[]>>();map.put(0, null);try {EasyExcelExportUtil.export(fileName, map, response);} catch (Exception e) {e.printStackTrace();}}/*** 导入数据* @param bookExcel */public EasyExcelImportResult importExcel(MultipartFile bookExcel) {List<List<Object>> dataList = new ArrayList<List<Object>>();// 模拟数据库查出的唯一标识列Set<String> uniqueIdSet = new HashSet<String>();uniqueIdSet.add("11");uniqueIdSet.add("22");uniqueIdSet.add("33");EasyExcelImportResult result= EasyExcelImportUtil.readExcel(bookExcel, 0, dataList, uniqueIdSet);if(result.getErrDataCount()==0){System.out.println("模拟取数据,向数据库添加数据中...");for (List<Object> list: dataList){for (int i = 0; i < list.size(); i++) {System.out.print(list.get(i)+" ");}System.out.println();}result.setImportDataCount((long) dataList.size());}return result;}}
【笔记】Spring整合EasyExcel相关推荐
- Redis工作笔记-spring整合jedis
目录 概念 代码与实例 概念 这里,一般都是用jedis去搞项目,而不是用spring自带的. 主要是xml: <?xml version="1.0" encoding=&q ...
- 文件用户Apache shiro学习笔记+ spring整合shiro (一)
改章节朋友在青岛游玩的时候突然想到的...这两天就有想写几篇关于文件用户的博客,所以回家到之后就奋笔疾书的写出来发表了 Apache Shiro官网:http://shiro.apache.org/ ...
- spring学习笔记06-spring整合junit(出现的问题,解决的思路)
spring学习笔记06-spring整合junit(出现的问题,解决的思路) 文章目录 spring学习笔记06-spring整合junit(出现的问题,解决的思路) 3.1测试类中的问题和解决思路 ...
- Spring Boot整合EasyExcel(完整版包含上传解析excel和下载模板)
Spring Boot整合EasyExcel(完整版包含上传解析excel和下载模板) 1. 加入依赖 2. 对读取excel内容(批量添加) 3. 模板下载: 1. 加入依赖 <depende ...
- Struts2学习笔记——Struts2与Spring整合
Struts2与Spring整合后,可以使用Spring的配置文件applicationContext.xml来描述依赖关系,在Struts2的配置文件struts.xml来使用Spring创建的be ...
- Spring学习笔记:Spring整合Mybatis(mybatis-spring.jar)(二:mybatis整合spring)
http://blog.csdn.net/qq598535550/article/details/51703190 二.Spring整合mybatis其实是在mybatis的基础上实现Spring框架 ...
- 【编程不良人】快速入门Spring学习笔记08---事务属性、Spring整合Structs2框架(SM)、Spring整合Mybatis+Struts2(SSM)、Spring注解、SSM注解式开发
1. 事务属性 1.1 事务传播属性 配套视频:[编程不良人]快速入门Spring,SpringBoot.SpringCloud学不好完全是因为Spring没有掌握!_哔哩哔哩_bilibili # ...
- Activiti学习笔记:Activiti和Spring整合、Activiti和SpringBoot整合之Gradle版
环境 activiti:7+ Java:11 本机环境:window MySQL:5.7 gradlew:6+ Activiti和Spring整合 大体流程: 先创建项目,并导入依赖 添加activi ...
- 【Java从0到架构师】Spring - 整合 MyBatis
整合 MyBatis 整合 MyBatis - 依赖 整合 MyBatis - 数据源 整合 MyBatis - SqlSessionFactoryBean 整合 MyBatis - MapperSc ...
最新文章
- linux 读取大量图片 内存,10 张图帮你搞定 TensorFlow 数据读取机制
- 20165101刘天野 2018-2019-2《网络对抗技术》第1周 Kali的安装
- python开发桌面软件-python适合windows的桌面应用程序开发吗?
- KlayGE中的FXAA已经完成
- 2-1 什么是人工智能|人工智能框架TensorFlow应用实践
- vant组件搜索并选择_借助PARTsolutions 选型助手,轻松快速地找到组件。
- 面试进阶之字符串常量池
- Linux与C++11多线程编程(学习笔记)
- linux wheel用户组,Linux的用户和组之详解用户和组的分类
- 正确评估SQL数据库性能,你必须知道的原理和方法!
- 二叉树的实现(Java语言描述)
- EXPLAIN查看SQL执行计划
- 0x800700b7 linux,0x800700b7解决方法
- 一个疫情期间的实习生经历
- 抖音开屏广告和信息流广告相比较哪一种效果更好?
- DOS简介及常用命令
- forward和redirect的区别是什么?
- 逃避追债?贾跃亭把法拉第未来股权转给了外甥,但他还有5套豪宅! | 焦点
- 软件行业的QA与QC的区别
- Wxpython pannel切换
热门文章
- 解决URL传参中文乱码
- Javascript 设计模式 js设计模式 应用级讲解
- PERT II型管简介
- Java如何获取客户端主机真实IP地址
- 一键解决adb 5037端口被占用
- 青少年信息学(计算机)奥林匹克,全国青少年信息学(计算机)奥林匹克竞赛及分区联赛说明...
- Hbuilder android 在线更新功能 后端获取最新版本号和增量更新wgt包 (稀缺资源) 2018全网仅有
- JAVA毕设项目小王防疫副食品配送商城(java+VUE+Mybatis+Maven+Mysql)
- AIoT这一年:从五家公司窥AIoT五大领域发展 | AIoT势力榜
- 大数系列——大数加法