前言

最近的项目中模块需要用到Excel的导入,在同事的建议下选择了EasyExcel。看了一下EasyExcel的介绍,其是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。那废话不多说,直接上手试试,用代码试试EasyExcel是否真的那么好用。

一.主要实现步骤

1.@ExcelProperty注解

我们需要导入的类的字段需要用到注解@ExcelProperty("列名"),这里特别注意的是一定得跟对应的导入模板里的表头保持一致,不然导入的时候匹配不上。

//导出导入类使用注解
@ExcelProperty("表头对应的中文列名")
private String data;
复制代码

2.导入模板

public void exportTemplate(HttpServletResponse response, HttpServletRequest request) throws UnsupportedEncodingException {DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");String fileName="数据模板";fileName = URLEncoder.encode(fileName, "UTF-8");fileName = new String(fileName.getBytes("utf-8"),"ISO-8859-1");String filePath = new ClassPathResource("docs/other/".concat(fileName).concat(dateFormat.format(new Date())).concat(".xlsx")).getPath();//导出模板表头List<String> headers = Arrays.asList("列名");List list = new ArrayList();PoiUtil.exportTemplateData(filePath,headers,list);//获取文件流返回给客户端DownloadFileUtil.downloadFile(response, request, filePath);
}
复制代码
//构造模板基础数据,比如下拉列表及其校验规则
public static void exportTemplateData(String filePath, List<String> headers, List list) {//证件类型 下拉List<String> certificationTypeAttributeList = new ArrayList<String>();certificationTypeAttributeList.add("身份证");certificationTypeAttributeList.add("户口簿");certificationTypeAttributeList.add("护照");certificationTypeAttributeList.add("其他");// 2.创建Excel// 1)创建workbookHSSFWorkbook hssfWorkBook = new HSSFWorkbook();// 2)创建sheetHSSFSheet mainSheet = hssfWorkBook.createSheet(MAIN_SHEET);// 主sheet// 用于展示//2.1 创建表头,供用户输入initHeaders(hssfWorkBook, mainSheet, headers);//导出数据到主sheetsetMainSheet(mainSheet, list);// attribute 下拉框 sheetHSSFSheet certificationTypeAttributeSheet= hssfWorkBook.createSheet(CERTIFICATIONTYPE_ATTRIBUTE_STATUS);hssfWorkBook.setSheetHidden(hssfWorkBook.getSheetIndex(certificationTypeAttributeSheet), true);// 设置sheet是否隐藏// 3.写入数据writeData(hssfWorkBook, mapSheet, mapOneList, map);//证件类型位writeDropDownData(hssfWorkBook, certificationTypeAttributeSheet, certificationTypeAttributeList, CERTIFICATIONTYPE_ATTRIBUTE_STATUS);// 4.设置数据有效性setDataValid(hssfWorkBook, mainSheet,"boundaryMarking");FileOutputStream os = null;try {String exisname = filePath.substring(0, filePath.lastIndexOf("/"));File f = new File(exisname);if (!f.exists()) {f.mkdirs();//创建目录}// 创建可写入的Excel工作簿File file = new File(filePath);if (!file.exists()) {boolean bool = file.createNewFile();System.out.println(bool);} else {file.delete();file.createNewFile();}os = new FileOutputStream(filePath);hssfWorkBook.write(os);} catch (Exception e) {e.printStackTrace();} finally {IOUtils.closeQuietly(os);}}
复制代码

2.创建导入模板下载类

用于下载后填充数据进行导入操作

public static void downloadFile(HttpServletResponse response, HttpServletRequest request, String filePath) {try {//获取文件File file = new File(filePath);String fileName = file.getName();response.reset();ServletOutputStream out = response.getOutputStream();request.setCharacterEncoding("UTF-8");int BUFFER = 1024 * 10;byte data[] = new byte[BUFFER];BufferedInputStream bis = null;//获取文件输入流InputStream inputStream = new BufferedInputStream(new FileInputStream(filePath));// 以流的形式下载文件。DataInputStream fis = new DataInputStream(inputStream);int read;bis = new BufferedInputStream(fis, BUFFER);response.setContentType("application/OCTET-STREAM");response.setHeader("Content-Disposition", "attachment; filename=" + fileName);while ((read = bis.read(data)) != -1) {out.write(data, 0, read);}fis.close();bis.close();} catch (Exception e) {e.printStackTrace();} finally {File file = new File(filePath);//删除临时文件if (file.exists()) {file.delete();}}
}
复制代码

3.创建导入监听器,监听器负责处理数据

比如数据的校验、转换、业务逻辑处理、数据入库操作。我感觉用监听器比较麻烦直接使用了另外一种做法,对监听器感兴趣的小伙伴可以去看看

//从前端接收传过来的文件
InputStream inputStream = file.getInputStream();
List<DataModel> list = EasyExcel.read(inputStream).head(DataModel.class).sheet().doReadSync();
//对解析到数据进行逻辑操作......
复制代码

二.值得注意的地方

1.下拉列表及单选框

如果需要导入的列名需要用到大量的下拉列表,单选框,在创建导入模板里就需要提前将其需要填充的数据从数据库或者接口里获取到先进行下拉列表或者单选框的数据填充。而且填充的只能是中文,这就涉及到一个问题,在进行导入处理数据时还需要将中文的转换为其对应的编码入库,这时就比较麻烦了。

2.级联操作

遇到到省市区三级联或者四级联时,同样需要提前进行数据填充,还要维护好级联关系。另外就是虽然省市区的变化不会太大,但是出于数据的严谨性需要定期同步最新的省市区数据,废弃掉在此之前的数据模板(模板导出时文件名带当前日期,用日期进行判断),如果业务不需要这么严谨这点可以不用考虑。

三.总结

按业务场景用了一下,感觉挺不错,比之前一步步的操作方便多了,导出导入都很快,而且都是流操作,不会产生额外的临时文件。不过也由于Excel本身的一些限制,在一些业务场景下使用起来就很费劲,比如有大量下拉列表的这种业务场景就不太适用。对这块感兴趣的小伙伴可以一起交流交流。

使用EasyExcel完成导出导入功能相关推荐

  1. niva mysql_CentOS下,MySQL数据库的导出导入功能验证

    导读 正文 问题起源:MysqL创建集群需要maria-galera版本 而现在安装的数据库中已经有了一些数据,不想再重新输入数据. 删除数据库,数据导出导入功能 2.1.1 删除StorOS的数据库 ...

  2. Vue3+XLSX+FileSaver导出导入功能

    一.创建一个VUE项目 项目环境版本: npm 8.5.5 node 16.15.0 vue-cli 4 引入相关的依赖 npm install --save 引入Element-plus和XLSX和 ...

  3. 基于vue 实现 excel导出导入功能

    第一步下包 excel导入导出功能需要我们下载哪些包? 在vue-element-admin中有着详细的文档查看: Excel 导出 Excel 的导入导出都是依赖于js-xlsx来实现的. 在 js ...

  4. SNF软件开发机器人-子系统-导出-导入功能-多人合作时这个功能经常用到

    导出 导出可以将资源表和子系统导出并形成一个json文件. 1.效果展示: 2.使用说明: 点击导出按钮后会弹出一个导出页面.页面的左侧可以选择功能,右侧可以选择资源表,选择功能的同时右侧中功能所需的 ...

  5. 在MS CRM中使用Excel导入/导出的功能对数据进行批量处理

    在MicrosoftDynamics CRM中,如果你需要修改多条数据,比如对联络人的电子邮件进行修改,通常需要打开每一个联络人记录的表单,然后对其进行修改,然后保存并关闭表单.这样做非常的麻烦.我们 ...

  6. VirtualBox虚拟机导出导入实践

    2019独角兽企业重金招聘Python工程师标准>>> 当我们创建好虚拟机后,我们在配置好虚拟机的一些配置信息,然后想多克隆几个,这时我们使用VirtualBox的虚拟机导出导入功能 ...

  7. BCP导出导入大容量数据实践

    前言 SQL SERVER提供多种不同的数据导出导入的工具,也可以编写SQL脚本,使用存储过程,生成所需的数据文件,甚至可以生成包含SQL语句和数据的脚本文 件.各有优缺点,以适用不同的需求.下面介绍 ...

  8. bulk es 删除_es数据导出导入(bulk篇)

    1.bulk是什么? bulk是可以通过API批量执行创建索引,新增数据,更新数据和删除数据到elasticsearch. POST _bulk { "index" : { &qu ...

  9. 【DB宝50】Oracle异构平台迁移之完全可传输导出导入(Full Transportable Export Import)

    文章目录 一.简介 1.1.使用场景 1.2.限制条件 二.完全可传输操作步骤 三.案例演示 3.1.环境 3.2.源库操作 3.2.1.将需要传输的用户表空间设置为RO状态 3.2.2.使用Data ...

最新文章

  1. java导出为excel文件_java导出数据到excel文件
  2. c++的:: . :-的区别
  3. python基础知识练习题
  4. 漫画 | 程序员联名把产品经理告上县衙,并列了 8 大罪状
  5. 洛谷P5273 【模板】多项式幂函数 (加强版)
  6. 运行caffe自带的mnist实例教程
  7. 机器学习的一些很好的博客
  8. 数据结构与算法笔记(四)—— 栈
  9. struts、hibernate、spring、 mybatis、 spring boot 等面试题汇总
  10. Android 同步锁死锁,Android多线程研究(3)——线程同步和互斥及死锁
  11. 《信息通信技术与政策》丨盖国强:中国数据库服务生态与体系
  12. add python3.8 to path_手把手教你安装Python3.8环境
  13. 察看网页源代码全攻略
  14. 扩展类载入器的载入问题
  15. portal认证 php,如何用PHP制作OSSH 免费版华为Portal系统认证前端页面
  16. 20172318 2017-2018-2 《程序设计与数据结构》第11周学习总结
  17. mysql monitor怎么用_MySQL 监控工具 mysql-monitor 详解
  18. 网络之路--【第六章】——ICMP协议
  19. android 表情包
  20. ajax回调的data,。。。Ajax的回调函数function(data)中,data的返回类型。。。

热门文章

  1. 红米Redmi Note10 Pro root 安装magisk秒解锁BL Redmi K40 magisk root
  2. 直角三角形面积Java_利用Eclipse编写第一个简单的Java程序,实现如下功能。 键盘输入:直角三角形两直角边a, b,根据勾股定理计算斜边的平方值。并输出。 例如:运行效果如下...
  3. python输入直角三角形的两直角边,求周长、面积和锐角度数
  4. excel提取文字、字母、符号
  5. 案例:自动复制黏贴bat
  6. 打开或关闭windows功能时,提示“出现错误。并非所有的功能被成功更改” 已解决
  7. Docker系列之五:Docker 三剑客之 Docker Swarm
  8. IP地址这么重要的知识,居然听一个学弟说没用?
  9. 2022最火土味情话文案
  10. 安德斯.埃里克森 的研究