SpringMVC导入Excel文件到MySQL
转载自 https://blog.csdn.net/wdehxiang/article/details/77619677
使用SpringMVC导入Excel文件到MySQL时,由于是第一次做,所以走了比较多弯路,希望这篇文章能够给和我一样新学的童鞋,一点启发~做这个的时候,参考了比较多的文章,特别是最后两个文件上传类和解析类的,然后根据自己的项目需要进行修改。现在找不到之前看的帖子了,所以未能贴上参考网址,如果有知道的童鞋也可以告诉我一下哈~
(关于前台上传部分,可以参考这里)
SpringMVC的配置文件,需要增加文件上传配置:
(我就是一开始没配置,一直上传不了,纠结了一个多小时)
<!-- 支持文件上传 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 默认编码 --><property name="defaultEncoding" value="utf-8" /><!-- 文件大小最大值 --><property name="maxUploadSize" value="10485760000" /><!-- 内存中的最大值 --><property name="maxInMemorySize" value="40960" /></bean>
pom导入相关包:
<!-- 文件上传 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency></dependencies>
controller层部分代码。
接收前台上传的文件用MultipartFile,返回用map,所以前台用json类型接收
@ResponseBody@RequestMapping(value="/analyzeXml", method = RequestMethod.POST) public Map<String,Object> analyzeXml(@RequestParam("excelFile") MultipartFile excelFile,HttpServletRequest request,HttpServletResponse response) { //上传xml文件 InputStream inputs; boolean result=false;//导入标志Map<String,Object> map=new HashMap<String, Object>();try { //上传inputs = excelFile.getInputStream(); String fileName = excelFile.getOriginalFilename(); String filePath=request.getSession().getServletContext().getRealPath("uploadFile");String uploadFileName = FileUtil.uploadFile(inputs, fileName, filePath); System.out.println(filePath+"/"+uploadFileName);//解析Excel,导入MySQLresult=bbuService.addBbu(filePath+"/"+uploadFileName);} catch (IOException e) { e.printStackTrace(); } if(result){map.put("message", "成功");}else{map.put("message", "失败");}return map;}
service层代码
这里主要是将解析后的信息转化为相关对象
public boolean addBbu(String filePath) {int result=0;//解析xml文件ReadExcel readExcel=new ReadExcel();List<List<String>> lList =readExcel.getExcelInfo(filePath);Bbu bbu=null;List<Bbu> bbuList=new ArrayList<Bbu>();for(List<String> list : lList){bbu=new Bbu();bbu.setBranch(list.get(0));bbu.setCity(list.get(1));bbu.setGrid_no(list.get(2));bbu.setBusiness_department_name(list.get(3));bbu.setEngineering_station_no(list.get(4));bbu.setSystem_type(list.get(5));bbu.setBbu_name(list.get(6));bbu.setAddress(list.get(7));bbu.setLongitude(list.get(8));bbu.setLatitude(list.get(9));bbu.setBuilding_type(list.get(10));bbu.setCover_type(list.get(11));bbu.setIndoor_coverage_area(list.get(12));bbu.setOutdoor_cover_building_num(list.get(13));bbuList.add(bbu);}result=bbuMapper.addBbu(bbuList);if(result>0){return true;}return false;}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
Dao层代码
这里记得要加上@Param注解
/*** 插入数据* @param bbuList*/public int addBbu(@Param("list")List<Bbu> bbuList);持久层用的是mybatis,写在mapper文件里的代码。因为要批量上传,所以使用了foreach语句,将list中的每一个对象逐条读取。
<insert id="addBbu" parameterType="java.util.List" >insert into bbu(branch,city,grid_no,business_department_name,engineering_station_no,system_type,bbu_name,address,longitude,latitude,building_type,cover_type,indoor_coverage_area,outdoor_cover_building_num)values<foreach collection="list" item="item" index="index" separator=","> (#{item.branch},#{item.city},#{item.grid_no},#{item.business_department_name},#{item.engineering_station_no},#{item.system_type},#{item.bbu_name},#{item.address},#{item.longitude},#{item.latitude},#{item.building_type},#{item.cover_type},#{item.indoor_coverage_area},#{item.outdoor_cover_building_num}) </foreach> </insert>
最后是两个关键类
文件上传类:
package com.shenofusc.utils;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;
public class FileUtil {/**** <pre>uploadFile(springMVC文件上传 传inputStream) * 修改备注: * @param inputs* @param fileName* @param folderPath* @return</pre>*/public static String uploadFile(InputStream inputs, String fileName, String folderPath) {// 上传物理文件到服务器硬盘BufferedInputStream bis = null;FileOutputStream fos = null;BufferedOutputStream bos = null;String uploadFileName = null;try {// 构建输入缓冲区,提高读取文件的速度bis = new BufferedInputStream(inputs);// 自动建立文件夹File folder = new File(folderPath);if (!folder.exists()) {folder.mkdirs();}// 为了保证上传文件的唯一性,可以通过uuid来解决// 为了避免中文乱码问题则新生成的文件名由uuid+原来文件名的后缀组成uploadFileName = UUID.randomUUID().toString()+getSuffix(fileName);// 构建写文件的流即输出流fos = new FileOutputStream(new File(folderPath+"/"+uploadFileName));// 构建输出缓冲区,提高写文件的性能bos = new BufferedOutputStream(fos);// 通过输入流读取数据并将数据通过输出流写到硬盘文件夹byte[] buffer = new byte[4096];// 构建4k的缓冲区int s = 0;while ((s=bis.read(buffer)) != -1) {bos.write(buffer, 0, s);bos.flush();}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {if (bos != null) {try {bos.close();bos = null;} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if (fos != null) {try {fos.close();fos = null;} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if (bis != null) {try {bis.close();bis = null;} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if (inputs != null) {try {inputs.close();inputs = null;} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}return uploadFileName;}
/*** 后缀名的获取* @param fileName* @return*/
private static String getSuffix(String fileName) {int index = fileName.lastIndexOf(".");String suffix = fileName.substring(index);return suffix;
}
}
解析Excel
主要思路是首先判断是2007还是2003的Excel文件,然后将表格进行每一行每个单元格读取,每一行的每一个单元格存入list中,而将这些行再存入list中,最后再service层进行赋值转成bean。这里的缺点是表格文件的列必须是固定好的,不够灵活。但是想用反射来做,通过实体类的setXXX方法,来截取每个方法的XXX字段名,与表格中的标题比较,但无奈表格是中文的。如果再弄个map相对应英文名,太麻烦了,所以就没弄了。
package com.shenofusc.utils;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ReadExcel {private int totalRows = 0;//总行数private int totalCells = 0;//构造方法public ReadExcel(){}public int getTotalRows() { return totalRows;}public int getTotalCells() { return totalCells;}/*** 读EXCEL文件,获取集合* @param fielName* @return*/public List<List<String>> getExcelInfo(String filePath){//初始化集合 List<List<String>> lList=new ArrayList<List<String>>();//初始化输入流InputStream is = null;try{//根据文件名判断文件是2003版本还是2007版本boolean isExcel2003 = true;if(filePath.matches("^.+\\.(?i)(xlsx)$")){isExcel2003 = false;}//根据新建的文件实例化输入流is = new FileInputStream(filePath);Workbook wb = null;//根据excel里面的内容读取客户信息if(isExcel2003){//当excel是2003时wb = new HSSFWorkbook(is);}else{//当excel是2007时wb = new XSSFWorkbook(is);}//读取Excel里面客户的信息lList=readExcelValue(wb);is.close();}catch(Exception e){e.printStackTrace();} finally{if(is !=null){try{is.close();}catch(IOException e){is = null; e.printStackTrace();}}}return lList;}/*** 读取Excel里面客户的信息* @param wb* @return*/private List<List<String>> readExcelValue(Workbook wb){//得到第一个shellSheet sheet=wb.getSheetAt(0);//得到Excel的行数this.totalRows=sheet.getPhysicalNumberOfRows();//得到Excel的列数(前提是有行数)if(totalRows>=1 && sheet.getRow(0) != null){this.totalCells=sheet.getRow(0).getPhysicalNumberOfCells();}List<List<String>> lList=new ArrayList<List<String>>();//循环Excel行数,从第二行开始。标题不入库for(int r=1;r<totalRows;r++){Row row = sheet.getRow(r);if (row == null) continue;List<String> sList=new ArrayList<String>();//循环Excel的列for(int c = 0; c <this.totalCells; c++){ Cell cell = row.getCell(c);if (null != cell){cell.setCellType(Cell.CELL_TYPE_STRING);sList.add(cell.getStringCellValue());}}//添加客户lList.add(sList);}return lList;}
}
SpringMVC导入Excel文件到MySQL相关推荐
- ExcelToMySQL-批量导入Excel文件到MySQL数据库的自动化工具
ExcelToMySQL:批量导入Excel文件到MySQL数据库的自动化工具 简介 ExcelToMySQL 是一个可以批量导入excel到数据库(mysql/oracle/sqlserver)的自 ...
- php mysql导入excel_如何从PHP导入Excel文件到mysql数据库
让我们说, 我想从 PHP导入/上传excel文件到mysql 我的HTML如下 File Upload Only Excel/CSV File Import. Upload PHP代码如下 if(i ...
- ExcelToDatabase:批量导入Excel文件到MySQL/Oracle/SQL Server数据库的自动化工具
ExcelToDatabase:批量导入Excel到MySQL/Oracle/SQL Server数据库的自动化工具 简介 ExcelToDatabase 是一个可以批量导入excel到mysql/o ...
- MYSQL中导入Excel文件
本文阐述了一般情况下怎么在mysql中导入excel文件,作者借助工具sqlyog,也可以直接在mysql中操作. 主要步骤: 第一步:首先将excel文件打开另存为csv文件 再将其用Notepad ...
- mysql数据库 导入excel_如何在MySQL数据库中导入excel文件内的数据 详细始末
在开发项目的时候通常需要使用数据库,数据库Database是用来存储和管理数据的仓库.下面,我们以MySQL数据库为例来看看如何在数据库中导入excel文件内的数据吧. 操作方法 01 MySQL 打 ...
- wxwidgets mysql_wxWidgets导入Excel文件详细教程
开始写教师端程序,首先要实现导入EXCEL文件,读取数据后再添加到mysql数据库.wxWidgets提供了wxAutomationObject类,用来调用OLE automation的方法.网上找到 ...
- csv导入mysql phpmyadmin_【转】从phpMyAdmin批量导入Excel内容到MySQL(亲测非常简洁有效)...
今天做项目遇到需要用phpMyAdmin批量导入Excel内容到MySQL数据库.分析了我的踏坑经历并且总结一最便捷的一套导入数据的方法,非常实用简洁: 1.修改Excel表的数据,使得Excel中的 ...
- navicat导入excel文件的步骤以及可能碰到的问题
navicat导入excel文件的步骤以及可能碰到的问题 1 navicat导入excel文件的步骤 1.1 创建数据库 1.2 在数据库的表上,点击右键,选择导入向导. 1.3 根据实际情况选择对应 ...
- python导入excel数据到mysql
python导入excel数据到mysql 使用多线程,目前大概一分钟写入1w条 环境介绍 windows10-x64 python3.6.5-x64 Excel2016 MySql5.7.18 需要 ...
最新文章
- pg 主键系统信息_神仙打架:PG 和 MySQL 到底哪个更好用?
- 【小朋友才做选择题】跟着团队一起学习人工智能,先人一步掌握最前沿知识
- NodeManager启动流程与服务
- 020 ceph作openstack的后端存储
- 带孩子们做环球旅行的读后感_阜南七小教师风采之乔娜:做孩子们成长的记录者...
- 1月16日学习内容整理:爬虫框架:Scrapy
- Rust 与服务端编程的碎碎念
- php7新特性的理解和比较
- 【CNN】很细的讲解什么以及为什么是卷积(Convolution)!
- 服务器向客户端发送数据自动中断
- 英语数字听力训练精灵
- 分享:世界机场代码(ICAO)[带经纬度]
- 十月美剧精听总结 - 权力的游戏「Game of Throne」 黑袍纠察队「The boys」 老无所依「No Country for the old men」
- Neo4j Desktop(Neo4j 桌面)安装插件
- 是谁扼杀了你的梦想?
- 安卓11客制需求-去除设置-无障碍-放大功能
- MySQL 查询历史sql记录
- linux状态栏显示命令,Ubuntu状态栏显示网速CPU
- 开关稳压器详解(七)-Buck降压型开关稳压器RC Snubber设计
- vim 命令集合-去除背景颜色高亮
热门文章
- 【cf】Codeforces 题解等汇总
- c语言高级算法bc,老调重弹篇:有关BC/C++语言程序编程学习的:10大基础算法科普帖...
- 【历史上的今天】7 月 7 日:C# 发布;Chrome OS 问世;《仙剑奇侠传》发行
- 第十二届蓝桥杯大赛软件赛省赛C/C++ B组真题解析
- 华为董事会名单大曝光:孙亚芳任正非等13名董事
- 圣劳伦斯散热器举行北交所IPO上市辅导签约仪式
- android ksoap用法
- 新世代高端旅行六大偏好:Bleisure、场景感、体验感成趋势
- 软件测试需要具备的基本职业素养
- 毕业三年,听到我的年薪只是表弟的月薪,我心态崩了。。。