目录

  • 一、效果展示
    • 1、初始状态
    • 2、导入的Excel文件
    • 3、导入后状态
    • 4、文件信息过滤更新
  • 二、实现
    • 1、文件传递
    • 2、Controller层
    • 3、Service层
    • 4、ServiceImplements
      • (1)下载并导入poi
      • (2)判断文件类型并读取信息
      • (3)将信息存储为键值并传递至数据库
    • 5、Mybatis:数据库信息更新

一、效果展示

1、初始状态

导入前的页面显示:

此时对应的数据库表:

2、导入的Excel文件

3、导入后状态

导入后的页面显示:


导入后的数据库表:

4、文件信息过滤更新

  倘若原始数据库中已存在 A 机构(将“结算代码”作为该机构的唯一标识),而我们新上传的文件中也包含了 A 机构的信息,则系统会检测出并直接更新该机构信息。

初始状态:

传入具有相同结算代码(意味着这两家其实为同一家机构)的数据:


上传后的页面数据:


  可以看到新上传文件中的“new机构一号”与原始数据中的“机构三号”结算代码相同,因此判断出这两家实则为同一家机构,故而对“机构三号”信息进行更新(如:机构名称、地址等)。

二、实现

1、文件传递

  由于项目的前端采用的是Layui框架,因此Excel在前端的接收将以该框架为例,也可以采用其它方式/框架接收文件,比如:

<input type="file">

以Layui为例:

<div class="layui-inline" style="float: right"><button type="button" id="uploadExcel" class="layui-btn layui-btn-sm layui-btn-normal"  ><i class="layui-icon layui-icon-upload-drag"></i>&nbsp上传文件</button>
</div>

前端接收上传的文件:

    <script type="text/javascript">layui.use('upload', function(){var $ = layui.jquery,upload = layui.upload;upload.render({elem: '#uploadExcel'  //先前定义的事件id,url: '/department/InputExcel' //改成您自己的上传接口,accept: 'file' //普通文件,exts: 'xls|xlsx' //上传的文件类型,done: function(res){console.log(res);if(res.msg=="ok"){layer.msg("文件导入成功",{icon: 1, time: 1500},function(){location.reload();});}else{layer.msg("文件导入失败",{icon: 2, time: 1500},function(){location.reload();});}},error:function(){layer.msg("文件导入失败",{icon: 2, time: 1500},function(){location.reload();});}});})</script>

2、Controller层

@RequestMapping(value = "/InputExcel")@ResponseBodypublic String InputExcel(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws Exception {String flag = "02";// 上传标志System.out.println("进入controller层 导入excel");System.out.println("file文件:"+file);if (!file.isEmpty()) {try {String originalFilename = file.getOriginalFilename();// 原文件名字System.out.println("文件名:" + originalFilename);InputStream fileStream= file.getInputStream();// 获取输入流flag = departmentService.InputExcel(fileStream, originalFilename);System.out.println("controller层:上传成功,flag= "+flag);return "{\"msg\":\"ok\"}";} catch (Exception e) {flag = "03";// 上传出错e.printStackTrace();System.out.println("controller层:上传失败,flag= "+flag);}}return "{\"msg\":\"error\"}";}

3、Service层

 String InputExcel(InputStream fileStream, String originalFilename);

4、ServiceImplements

(1)下载并导入poi

  Java中常见的用来操作 Excel 的方式有2种:JXL和POI。JXL只能对 Excel进行操作,且只支持到 Excel 95-2000的版本。Apache POI 是用Java编写的免费开源的跨平台的 Java API,其提供对Microsoft Office格式档案读和写的功能,支持处理Excel、Word、PPT等文件。借助POI,可以方便地完成生成数据报表,数据批量上传,数据备份等工作。
  因此,需要先导入poi的jar包。

Apache POI下载官方网址: https://poi.apache.org/
POI使用相关讲解可参考博客:java Poi基础(一)

  其次,需要编写一个ExcelUtil的工具类文件,使用poi中的函数来定义自己所需要实现的Excel的功能,以方便后续方法中进行调用。

可以参考博客:
1、java使用poi读取excel
2、Java之按行、列读excel笔记

(2)判断文件类型并读取信息

  在获取到文件信息后,首先需要判断文件后缀是.xls还是.xlsx类型,并采用不同的方式读取字节流。由于在我们的ExcelUtil文件中定义的ReadExcel方法返回的是ArrayList<ArrayList>类型,因此在此处需要使用相同类型的变量进行接收。

       ArrayList<ArrayList<Object>> list;if (originalFilename.endsWith(".xls")) {System.out.println("service层:是2003版的excel");list = Excel.readExcel2003(fileStream);System.out.println("list:"+list);} else {System.out.println("service层:是2007版的excel");list = Excel.readExcel2007(fileStream);System.out.println("list:"+list);}

  下图可见ReadExcel的返回类型为ArrayList<ArrayList>,里面的arraylist用于存储每一行的信息,外面的arraylist将每一行组成了一个新的数组。


  此时,若对 list 中的内容进行调试输出,可以得到如下图所示的结果。

此处顺便附上java中 List 和 ArrayList 之间的区别:
1、Java中List和ArrayList的区别(加入了个人见解)
2、 java List与ArrayList区别

(3)将信息存储为键值并传递至数据库

 //  导入excel//建立Map<String,Map<String,Object>>Map<String,Map<String,Object>> oneRowInputInfos= new HashMap<String,Map<String,Object>>();Map<String,Object> oneRow= new HashMap<String,Object>();//     遍历Excel表中的每一行for (int i=0,j=list.size();i<(j-1);i++){List<Object> row = list.get(i);          //获取当前行的数据//          将当前行数据存储进oneRow
//          row.get(1).toString():当前行第二列的数据oneRow.put("department_name", row.get(1).toString());oneRow.put("department_phone_number", row.get(2).toString());oneRow.put("department_address", row.get(3).toString());// .......此处省略部分变量oneRow.put("department_settlement_code", row.get(8).toString());// .......此处省略部分变量oneRow.put("depart_id", row.get(13).toString());//          将当前行数据存储进oneRowinputInfosoneRowInputInfos.put("keys", oneRow);  departmentDao.InputExcel(param);System.out.println("service层:inputExcel成功");}return "01";}

下图为某一行输出的oneRowInputInfos信息:


传入Dao层:

 void InputExcel(Map<String, Map<String, Object>> param);

5、Mybatis:数据库信息更新

附上Mybatis中foreach语法的使用讲解:mybatis foreach标签的使用

    <!--excel导入--><insert id="InputExcel" parameterType="hashmap" useGeneratedKeys="true">insert into db_chx_department<foreach collection="keys" index="key" item="value"  open="(" close=")" separator=",">${key}</foreach>values<foreach collection="keys" item="value1" open="(" close=")" separator=",">#{value1}</foreach></insert>

  至次即可完成文件的导入。

  但如果要添加文件信息的过滤更新功能,则要增加一条语句,如下。该条语句是防止新增时有重复数据而重复插入,如果设置的字段出现了重复的数据,就会更新那条重复的数据而不是新增一条。

    ON DUPLICATE key update

  如此处就将选中参数(结算代码)设置为了唯一索引,因此如果出现重复的结算代码,当前数据只会被更新,而不会被重复增加。


SQL完整代码:

    <!--excel导入--><insert id="InputExcel" parameterType="hashmap" useGeneratedKeys="true">insert into db_chx_department<foreach collection="keys" index="key" item="value"  open="(" close=")" separator=",">${key}</foreach>values<foreach collection="keys" item="value1" open="(" close=")" separator=",">#{value1}</foreach>ON DUPLICATE key updatedepartment_settlement_code=values(department_settlement_code),department_name=values(department_name),department_phone_number=values(department_phone_number),department_address=values(department_address),department_settlement_scope=values(department_settlement_scope),depart_id=values(depart_id)</insert>

阿巴阿巴阿巴...小萌新报道...如有错误,欢迎指正...


JavaWeb开发:Excel文件上传、解析、过滤,并存入数据库(基于SSM框架)相关推荐

  1. java实现excel文件上传并解析内容保存到数据库中

    基于struts框架的web项目中excel文件的上传导入到数据库中的java代码 原理:将要上传的文件已流的形式传到服务器,服务器中接收到文件数据流并生成文件到服务器指定位置,java解析服务器生成 ...

  2. JavaWeb学习总结——文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  3. tomcat temp 大量 upload 文件_问题:JavaWeb中实现文件上传的方式有哪些?

    问题:JavaWeb中实现文件上传的方式有哪些? 上回我们说了下文件下载的方式有哪些,这次我们从不同的环境下简单来说说文件上传的方式有哪些. 文件上传的方式 Servlet2.5 方式 Servlet ...

  4. 微信小程序开发之文件上传下载应用场景(附Demo源码)

    微信小程序开发之文件上传下载应用场景(附Demo源码),Demo为小相册应用,源码在附件中,本示例需要腾讯云支持. http://www.henkuai.com/forum.php?mod=viewt ...

  5. Springboot+thymeleaf实现excel文件上传+后台数据搜索

    废话不多说,直接上代码 先说excel文件上传 用的是poi框架 先贴maven配置 <!-- poi导入excel文件--><dependency><groupId&g ...

  6. 记一次对DZ的渗透.(一句话木马与图片,文件上传解析漏洞)

    一.举例:St0rs Team 指剑碎星河分享 前言0X01 某日某帅正在使用着啊D 入侵百度的时候, 突然某位好友发来一条消息. "滴滴上车" 打开消息一看,说是要某帅帮忙日一个 ...

  7. java中excel文件上传

    java文件上传 excel文件上传的两种方式 1.使用ExcelsUtils上传文件 2.把文件转换成流上传(支持多sheet) 代码实现 第一种方式 ExcelsUtils.ReadMultipa ...

  8. SSM项目的excel文件上传并添加到数据库

    SSM项目的excel文件上传并添加到数据库(新手,不足之处请多多指教) 基于学校的课设,要用到excel文件的上传和数据库导入,在网上找了好多demo,最后找到一篇使用poi的,经过修改后,可以正常 ...

  9. java实现excel文件上传_java相关:SpringMVC下实现Excel文件上传下载

    java相关:SpringMVC下实现Excel文件上传下载 发布于 2020-6-21| 复制链接 摘记: 在实际应用中,经常会遇到上传Excel或者下载Excel的情况,比如导入数据.下载统计数据 ...

  10. 文本文件、Excel文件上传下传

    1.读取客户端Txt.Excel文件到内表:TEXT_CONVERT_XLS_TO_SAP TEXT_CONVERT_XLS_TO_SAP函数可以将本地的文本文件(列与列之间默认使用TAB键分开,但也 ...

最新文章

  1. 《数据竞赛白皮书》发布:竞赛核心价值及促进人才数字化转型
  2. AI超算“攒机”时代到来:为降低算力成本,这家公司牵头开放硬件标准
  3. linux sed错误sed: -e expression #1, unknown option to `s'解决办法
  4. 视频:PNAS报道纤维化扩展中“旁张力信号”介导的细胞间机械通讯
  5. MQTT 遗嘱消息(Will Message)的使用
  6. /usr/include/sys/types.h基本系统数据类型
  7. pandas 学习(四)—— 数据处理(清洗)、缺失值的处理
  8. win10卸载软件_WIN10系统如何关闭/卸载自带杀毒软件
  9. 忽忽,抢楼机完成……
  10. 用前端框架开发一款APP要多少钱
  11. 哈希---平方探测法
  12. VUE读取Vcard文件,并获取/筛选想要的内容
  13. 通过挑土豆—我学会了如何区分JS数组的遍历方法
  14. QGIS数据可视化学习笔记00——为什么用QGIS以及QGIS设置中文界面
  15. 2022年湖南医院三基考试泌尿外科综合模拟题及答案
  16. 菜鸟之路---2,简单的勒索病毒分析
  17. TeamViewer未知原因错误
  18. cad审图软件lisp_CAD审图标记软件下载_CAD审图标记 7.0 免费版_极速下载站_软件下载...
  19. P5535 【XR-3】小道消息
  20. python爬虫壁纸网站(有源码)

热门文章

  1. 基于uinput 实现远程键鼠
  2. 图灵Python图书一览表
  3. 使用HTML5的canvas元素和js实现一个超简单的随机骰子
  4. Kali使用VMware安装方法。
  5. 蓝牙血压计的android实现思路,基于蓝牙4.0的示波法电子血压计的设计与实现
  6. Python pip更新教程(两种方式)
  7. C++数值与字符串相互转换的那些事(一)字符串转数值(转载请注明)
  8. [转]windchill部分表说明
  9. rpart 决策树中的 Cp(complexity parameter)参数
  10. 51nod 1836 战忽局的手段(期望+矩阵快速幂)