何叫导入?简单说,导入就是把excel表格里的数据插入到数据库里。我这里做的是支持.xls和.xlsx格式。

因为是自己做案例记录,那些jar包什么的就不细说了,主要讲实现和步骤,看代码:

先在你的项目文件中创建一个excel表格模板,方便用户知晓导入的格式和文件内容:

一、页面中导入按钮

二、点击按钮跳转到导入页面,这里直接用的标签跳转,<%@ include file="importHarness.jsp"%>

三、点确认时先做下验证,文件格式、类型什么的

$('#importHarnessForm')为form表单id,(".hp_form_error")为确认按钮上方一个隐藏的DIV的class,显示提示信息用的。

四、点击确认按钮  传值  后台代码:

Controller类:

@RequestMapping(value = "/import" , method = RequestMethod.POST)
@ResponseBody
public String xlsImport(@RequestParam("xlsfile") MultipartFile file){
// 返回string类型为解决ie9兼容性
ResponseBase responseBase = new ResponseBase();
if (file.isEmpty()) {
responseBase.setMessage("'文件内容不能为空'");
responseBase.setStatus(DATA_VALIDATION_ERROR);
return responseBase.toString();
}
//文件名
String fileName = file.getOriginalFilename();
if (fileName == null || (!fileName.endsWith(".xls") && !fileName.endsWith(".xlsx"))) {
responseBase.setMessage("'文件格式不正确'");
responseBase.setStatus(DATA_VALIDATION_ERROR);
return responseBase.toString();
}
InputStream inputStream = null;
try{
inputStream = file.getInputStream();
Workbook wb = null;
if (fileName.endsWith(".xlsx")) {
wb = new XSSFWorkbook(inputStream);
}else {
wb = new HSSFWorkbook(inputStream);
}
//获取第一个工作表对象
Sheet sheet = wb.getSheetAt(0);
//行号
int rowNum = sheet.getLastRowNum();
//最大导入数
if (sheet.getLastRowNum() > 1000) {
responseBase.setMessage("'数据最多可导入1000条");
responseBase.setStatus(DATA_VALIDATION_ERROR);
return responseBase.toString();
}
Subject currentUser = SecurityUtils.getSubject();
Session session = currentUser.getSession();
Integer uid = (Integer) session.getAttribute("userId");
List<HarnessDTO> hpList = new ArrayList<HarnessDTO>();
int count = 0; //成功条数
int ercount = 0; //失败条数
for (int i = 1; i <= rowNum; i++) {

HarnessDTO hp = new HarnessDTO();
Row row = sheet.getRow(i);
String brandId = FileOperateUtil.getCellValue(row.getCell(0));
String seriesId = FileOperateUtil.getCellValue(row.getCell(1));
String modelId = FileOperateUtil.getCellValue(row.getCell(2));
String harnessInfo = FileOperateUtil.getCellValue(row.getCell(3));

if(StringUtils.isNotBlank(brandId) && StringUtils.isNotBlank(seriesId) && StringUtils.isNotBlank(harnessInfo)){
int rowCount = harnessPositionService.selectCount(brandId, seriesId, modelId);
if(rowCount >= 0){
hp.setBrandId( brandId );
hp.setSeriesId( seriesId) ;
hp.setModelId("".equals(modelId) ? "-1" : modelId);
hp.setHarnessInfo(harnessInfo);
hp.setStatus("1");
hp.setEditUser(String.valueOf(uid));
hpList.add(hp);
count ++;
}else{
ercount++;
}
}else{
responseBase.setMessage("'车辆品牌、型号和线束管理不能为空,导入失败,请重新导入'");
responseBase.setStatus(DATA_VALIDATION_ERROR);
return responseBase.toString();
}
}
harnessPositionService.insertCount(hpList);
if (count == 0) {
responseBase.setStatus(DATA_VALIDATION_ERROR);
}
responseBase.setMessage("'已成功导入" + count + "条,失败" + ercount + "条'");
}catch(Exception e){
logger.error("文件格式不符合要求,导入失败,请重新导入 ", e);
responseBase.setMessage("'文件格式不符合要求,导入失败,请重新导入'");
responseBase.setStatus(DATA_VALIDATION_ERROR);
return responseBase.toString();
}finally{
try {
if (inputStream != null) {
inputStream.close();
inputStream = null;
}
} catch (IOException e) {
logger.error("关闭文件流失败", e);
responseBase.setMessage("'关闭文件流失败'");
responseBase.setStatus(DATA_VALIDATION_ERROR);
return responseBase.toString();
}
}
return responseBase.toString();
}

Service类:

实现类:

DAO层:

SQL:

这是实现的全部代码,值得注意的是Controller类获取行数的时候,int rowNum = sheet.getLastRowNum();  往往会出现如下情况:

获取到的行数要大于实际表格中(有数据)的行数,自己解决办法:

1.在循环中,自己再嵌入一层循环,判断获取到的行数是否为空,为空跳出循环执行下一次循环(continue)

2.偷懒的方法,创建的模板,手动把模板下面的行和列删除、清空内容一次,选多点行数,几千行随你选,这样导入的时候就不会出现那种情况啦(只是针对导入模板的用户  选此方法吧)

SSM框架下实现导入功能的更多相关文章

  1. SSM框架下实现导出功能

    导出:将当前页面表格里值传到excel表格中. 一.页面js //下载excel $("#download").click( function() { var param = $( ...

  2. 关于在SSM框架下使用PageHelper

    首先,如果各位在这块配置和代码有什么问题欢迎说出来,我也会尽自己最大的能力帮大家解答 这些代码我都是写在一个小项目里的,项目的github地址为:https://github.com/Albert-B ...

  3. ssm框架下怎么批量删除数据?

    ssm框架下批量删除怎么删除? 1.单击删除按钮选中选项后,跳转到js函数,由函数处理 2. 主要就是前端的操作 js 操作(如何全选?如何把选中的数据传到Controller中) 3.fun()函数 ...

  4. SSM框架的整合思路&功能实现

    这是我第一篇博客,关于SSM框架的整合思路以及简单功能实现. 首先,最近刚刚学习Spring+SpringMVC+Mybatis,在开发时遇到形形色色的问题,周遭人也为我提供了一些思路,我会一点点整理 ...

  5. Jquery DataTable AJAX跨域请求的解决方法及SSM框架下服务器端返回JSON格式数据的解决方法

    如题,用HBuilder开发APP,涉及到用AJAX跨域请求后台数据,刚接触,费了不少时间.幸得高手指点,得以解决. APP需要用TABLE来显示数据,因此采用了JQ 的DataTable.  在实现 ...

  6. SSM框架下分页的实现(封装page.java和List<?>)

    之前写过一篇博客  java分页的实现(后台工具类和前台jsp页面),介绍了分页的原理. 今天整合了Spring和SpringMVC和MyBatis,做了增删改查和分页,之前的逻辑都写在了Servle ...

  7. ssm框架下实现文件上传

      1.由于ssm框架是使用Maven进行管理的,文件上传所需要的jar包利用pom.xml进行添加,如下所示: <properties> <commons-fileupload.v ...

  8. SSM框架下 Failed to load resource: the server responded with a status of 404 (Not Found)错误

    这个错误提示的是js的引用路径有错: 1.检查应用路径是否正确(我的问题是路径是正确的但是去到页面就会提示404错误) 引用路径,最好都使用绝对路径 <script type="tex ...

  9. SSM框架下的redis缓存

    基本SSM框架搭建:http://www.cnblogs.com/fuchuanzhipan1209/p/6274358.html 配置文件部分: 第一步:加入jar包 pom.xml <!-- ...

随机推荐

  1. poj1201 Intervals——差分约束

    题目:http://poj.org/problem?id=1201 差分约束裸题: 设 s[i] 表示到 i 选了数的个数前缀和: 根据题意,可以建立以下三个限制关系: s[bi] >= s[a ...

  2. Euclid(几何)

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2831 题意:已知A,B,C,D,E,F的坐标, ...

  3. php自动加载的两个函数__autoload和__sql_autoload_register

    一.__autoload 这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数.看下面例子: printit.class.php //文件 <?php class P ...

  4. Akka源码分析-Persistence-AtLeastOnceDelivery

    使用过akka的应该都知道,默认情况下,消息是按照最多一次发送的,也就是tell函数会尽量把消息发送出去,如果发送失败,不会重发.但有些业务场景,消息的发送需要满足最少一次,也就是至少要成功发送一次. ...

  5. Android高级开发-布局渲染流程与优化

    CPU(中央处理器)与GPU(图像处理器) 主要是设计目标不同,针对不同的应用场景.多缓存多分支,适用于复杂的逻辑运算,主要负责Measure,Layout,Record,Execute的计算操作. ...

  6. scrapy框架简介和基础应用(python爬虫)

    一.什么是scrapy? scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍,所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,持久化等)的具有 ...

  7. flask中路由系统

    flask中的路由我们并不陌生,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST"]) 1 ...

  8. 在vSphere Client上安装虚拟机工具VMware Tools

    一.什么是虚拟机工具 VMware Tools是一套安装在虚拟机操作系统中的实用程序.VMware Tools可提高虚拟机的性能,并在 VMware产品中实现多个易于使用的功能. 尽管客户机操作系统在 ...

  9. Oracle 递归的写法(start with) 以及where条件作用域

    先转一个讲Oracle递归讲得非常透彻的文章: http://blog.csdn.net/weiwenhp/article/details/8218091 前言:嗯,这也是一个前人挖坑,后人来填的故事 ...

  10. jQuery文档就绪

    很多jQuery代码都有如下片段: $(document).ready(function(){ //代码 }) 作用就是等文档结构加载完成后再去执行function中的代码,功能类似于window.o ...