<>SSM项目的excel文件上传并添加到数据库(新手,不足之处请多多指教)

基于学校的课设,要用到excel文件的上传和数据库导入,在网上找了好多demo,最后找到一篇使用poi的,经过修改后,可以正常使用。特意写篇博客记录下来,以便日后使用。
说一下大体思路:

* 前台将excel文件传入到后台
* 使用excel工具类将excel文件中的数据读取成list集合
* 将list集合中的数据通过for-each取出,插入到数据库中。
* 返回信息到前台,插入成功。
首先是要用到的jar包(我这个项目使用的是Gradle)
compile 'org.apache.poi:poi:3.17' compile 'org.apache.poi:poi-ooxml:3.17'
compile 'org.apache.poi:poi-ooxml-schemas:3.17' compile
'org.apache.xmlbeans:xmlbeans:3.1.0' compile group: 'commons-fileupload', name:
'commons-fileupload', version: '1.3.1' compile group: 'commons-io', name:
'commons-io', version: '2.2'
Spring-MVC配置文件(差点忘了。。)
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"></property> <property
name="maxUploadSize" value="10485760000"></property> <property
name="maxInMemorySize" value="40960"></property> </bean>
贴出代码
1.jsp代码(我这里使用的是easyui的filebox,也可以直接使用file输入框,使用正常的表单提交)
<div style="margin:50px;width:150px"> <form id="form_excel" name="form_excel"
method="post" enctype="multipart/form-data"> <tr> <td>请选择Excel文件:</td> <td>
<input class="easyui-filebox" id="file_excel" style="width:200%"
buttonText="选择文件" accept="application/vnd.ms-excel" name="file_excel" /> </td>
</tr> <tr> <td colspan="2" align="right"> <a id="submit" href="#"
class="easyui-linkbutton" data-options="iconCls:'icon-ok'">添加</a> </td> </tr>
</form> </div> <script type="text/javascript"> $(function(){ //登录表单提交
$("#submit").click(function(){ $('#form_excel').form('submit', {
url:'${pageContext.request.contextPath}/manage/DoExcel', onSubmit: function(){
}, success:function(data){ if(data=="1"){ alert("添加成功!");
location.href="${pageContext.request.contextPath}/manage/main"; }else
if(data=="2"){ alert("添加失败!");
location.href="${pageContext.request.contextPath}/manage/main"; } } }); }) })
</script>
2.Excel工具类(将Excel文件中数据转换为list集合)
package com.niqi.Utils; import java.io.IOException; import
java.io.InputStream; import java.math.BigDecimal; import java.util.ArrayList;
import java.util.List; import org.apache.poi.hssf.usermodel.HSSFCell; 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; import
org.springframework.web.multipart.MultipartFile; import com.niqi.pojo.User; /**
* 读取excel文件中的数据 * @author niqi * */ public class ReadExcel { //总行数 private int
totalRows = 0; //总条数 private int totalCells = 0; //错误信息接收器 private String
errorMsg; //构造方法 public ReadExcel(){} //获取总行数 public int getTotalRows() {
return totalRows;} //获取总列数 public int getTotalCells() { return totalCells;}
//获取错误信息 public String getErrorInfo() { return errorMsg; } /** *
读EXCEL文件,获取信息集合 * @param fielName * @return */ public List<User>
getExcelInfo(MultipartFile mFile) { String fileName =
mFile.getOriginalFilename();//获取文件名 System.out.println("文件名"+fileName);
List<User> stuList = null; try { if (!validateExcel(fileName)) {// 验证文件名是否合格
return null; } boolean isExcel2003 = true;// 根据文件名判断文件是2003版本还是2007版本 if
(isExcel2007(fileName)) { isExcel2003 = false; } stuList =
createExcel(mFile.getInputStream(), isExcel2003); } catch (Exception e) {
e.printStackTrace(); } return stuList; } /** * 根据excel里面的内容读取客户信息 * @param is
输入流 * @param isExcel2003 excel是2003还是2007版本 * @return * @throws IOException */
public List<User> createExcel(InputStream is, boolean isExcel2003) { List<User>
stuList = null; try{ Workbook wb = null; if (isExcel2003) {//
当excel是2003时,创建excel2003 wb = new HSSFWorkbook(is); } else {//
当excel是2007时,创建excel2007 wb = new XSSFWorkbook(is); } stuList =
readExcelValue(wb);// 读取Excel里面客户的信息 } catch (IOException e) {
e.printStackTrace(); } return stuList; } /** * 读取Excel里面客户的信息 * @param wb *
@return */ private List<User> readExcelValue(Workbook wb) { // 得到第一个shell Sheet
sheet = wb.getSheetAt(0); System.out.println("gaolei dayin============"
+sheet); // 得到Excel的行数 this.totalRows = sheet.getPhysicalNumberOfRows();
System.out.println("行数======="+this.totalRows); // 得到Excel的列数(前提是有行数) if
(totalRows > 1 && sheet.getRow(0) != null) { this.totalCells =
sheet.getRow(0).getPhysicalNumberOfCells();
System.out.println("总列数=========="+this.totalCells); } List<User> userList =
new ArrayList<User>(); // 循环Excel行数 for (int r = 1; r < totalRows; r++) { Row
row = sheet.getRow(r); if (row == null){ continue; } User user = new User(); //
循环Excel的列(这里根据表字段不同,自行更换) for (int c = 0; c < this.totalCells; c++) { Cell cell
= row.getCell(c); if (null != cell) { // if (c == 0) { // if(cell.getCellType()
== HSSFCell.CELL_TYPE_NUMERIC){ // try { // user.setId(Integer.valueOf((int)
cell.getNumericCellValue())); // } catch (NumberFormatException e) { // // TODO
Auto-generated catch block // e.printStackTrace(); // System.out.println("if
false"); // } // }else{ // try { //
user.setId(Integer.valueOf(cell.getStringCellValue())); // } catch (Exception
e) { // // TODO Auto-generated catch block // e.printStackTrace(); //
System.out.println("类型不匹配"); // } // } // } else if (c == 1) {
if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){
//当导入数字大于8位时,会使用科学计数法,这里使用 BigDecimal BigDecimal bd = new
BigDecimal(cell.getNumericCellValue()); String accountid = bd.toPlainString();
user.setAccountid(accountid);//账号 }else{
user.setAccountid(cell.getStringCellValue()); } } else if (c == 2){
if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){ String password =
String.valueOf(cell.getNumericCellValue());
//如果是纯数字,比如你写的是25,cell.getNumericCellValue()获得是25.0,通过截取字符串去掉.0获得25 String pwd
=password.substring(0, password.length()-2>0?password.length()-2:1);
user.setPassword(pwd); }else{ user.setPassword(cell.getStringCellValue()); } }
else if (c == 3){ if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){ int sid
= Integer.valueOf((int) cell.getNumericCellValue()); user.setSid(sid); }else{
user.setSid(Integer.valueOf((int) cell.getNumericCellValue())); } } } } //
添加到list userList.add(user); } return userList; } /** * 验证EXCEL文件 * * @param
filePath * @return */ public boolean validateExcel(String filePath) { if
(filePath == null || !(isExcel2003(filePath) || isExcel2007(filePath))) {
errorMsg = "文件名不是excel格式"; return false; } return true; } //
@描述:是否是2003的excel,返回true是2003 public static boolean isExcel2003(String
filePath) { return filePath.matches("^.+\\.(?i)(xls)$"); }
//@描述:是否是2007的excel,返回true是2007 public static boolean isExcel2007(String
filePath) { return filePath.matches("^.+\\.(?i)(xlsx)$"); } }
3.ServiceImpl(这里主要执行数据库插入操作)
package com.niqi.service.impl; import java.util.List; import
org.springframework.beans.factory.annotation.Autowired; import
org.springframework.stereotype.Service; import
org.springframework.web.multipart.MultipartFile; import
com.niqi.Utils.ReadExcel; import com.niqi.dao.UserDao; import
com.niqi.pojo.User; import com.niqi.service.HelpThreeDoExcelService; /** *
excel数据库插入业务实现层 * @author niqi * */ @Service("helpThreeDoExcelService") public
class HelpThreeDoExcelServiceImpl implements HelpThreeDoExcelService {
@Autowired private UserDao userdao; @Override public String
readExcelFile(MultipartFile file) { //创建处理EXCEL的类 ReadExcel readExcel=new
ReadExcel(); //解析excel,获取上传的事件单 List<User> userList = null; int insertResult =
0; String insertMsg = ""; try { userList = readExcel.getExcelInfo(file);
//至此已经将excel中的数据转换到list里面了,接下来就可以操作list,可以进行保存到数据库,或者其他操作, //和你具体业务有关,这里不做具体的示范
//数据库插入 for(User s :userList) { if(userdao.select(s)==null) { insertResult +=
userdao.insertSelective(s); } System.out.println(s.toString()); }
if(insertResult ==0) { insertMsg = "All insert false"; }else if(insertResult ==
userList.size()){ insertMsg = "All insert success"; }else { insertMsg = "Part
insert success"; } } catch (Exception e) { e.printStackTrace();
System.err.println("接受excel表格中的数据失败!!!"); } for(User s : userList) {
System.out.println("打印excel中的数据"+s.toString()); } return insertMsg; } }
4.Controller层(与前台交互)
//添加账号的方法 excel 相关的操作 能够将数据插入到数据库 @RequestMapping(value="DoExcel",method=
{RequestMethod.POST}) @ResponseBody public String
DoExcel(@RequestParam(value="file_excel") MultipartFile file,HttpServletRequest
request) { String readResult =null; try { readResult =
helpThreeDoExcelService.readExcelFile(file); System.out.println("canshu
:"+readResult); } catch (Exception e) { e.printStackTrace();
System.out.println("upload failture"); } if (readResult=="All insert false") {
return "2"; } System.out.println("插入结果="+readResult); return "1"; }
5.UserMapper.xml(我也一并贴出来了,就是正常的插入语句)
<!-- 插入账号 --> <insert id="insertSelective" parameterType="com.niqi.pojo.User">
insert into user(accountid,password,sid)
values(#{accountid},#{password},#{sid}) </insert>
最后贴一下运行图吧
Jsp页面

添加失败图(哈哈)

最后谢谢各位的阅读,祝各位早日(秃头)变强!!!

技术
©2019-2020 Toolsou All rights reserved,
css中上下左右居中的几种实现方法[CISCN 2019 初赛]Love Mathc/c++语言实现登陆界面Unity3D 人称设置(第一人称视角、第三人称视角)Fastadmin框架自定义搜索操作流程2021最新Python自动化软件测试笔试题(含答案)黑客帝国装逼的代码雨mysql数据库设置字符集配置修改my.ini文件(windows)python之panda模块1Python学习笔记:基础+进阶10道练习题