SSM框架下实现导入功能
何叫导入?简单说,导入就是把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框架下实现导入功能的更多相关文章
- SSM框架下实现导出功能
导出:将当前页面表格里值传到excel表格中. 一.页面js //下载excel $("#download").click( function() { var param = $( ...
- 关于在SSM框架下使用PageHelper
首先,如果各位在这块配置和代码有什么问题欢迎说出来,我也会尽自己最大的能力帮大家解答 这些代码我都是写在一个小项目里的,项目的github地址为:https://github.com/Albert-B ...
- ssm框架下怎么批量删除数据?
ssm框架下批量删除怎么删除? 1.单击删除按钮选中选项后,跳转到js函数,由函数处理 2. 主要就是前端的操作 js 操作(如何全选?如何把选中的数据传到Controller中) 3.fun()函数 ...
- SSM框架的整合思路&功能实现
这是我第一篇博客,关于SSM框架的整合思路以及简单功能实现. 首先,最近刚刚学习Spring+SpringMVC+Mybatis,在开发时遇到形形色色的问题,周遭人也为我提供了一些思路,我会一点点整理 ...
- Jquery DataTable AJAX跨域请求的解决方法及SSM框架下服务器端返回JSON格式数据的解决方法
如题,用HBuilder开发APP,涉及到用AJAX跨域请求后台数据,刚接触,费了不少时间.幸得高手指点,得以解决. APP需要用TABLE来显示数据,因此采用了JQ 的DataTable. 在实现 ...
- SSM框架下分页的实现(封装page.java和List<?>)
之前写过一篇博客 java分页的实现(后台工具类和前台jsp页面),介绍了分页的原理. 今天整合了Spring和SpringMVC和MyBatis,做了增删改查和分页,之前的逻辑都写在了Servle ...
- ssm框架下实现文件上传
1.由于ssm框架是使用Maven进行管理的,文件上传所需要的jar包利用pom.xml进行添加,如下所示: <properties> <commons-fileupload.v ...
- SSM框架下 Failed to load resource: the server responded with a status of 404 (Not Found)错误
这个错误提示的是js的引用路径有错: 1.检查应用路径是否正确(我的问题是路径是正确的但是去到页面就会提示404错误) 引用路径,最好都使用绝对路径 <script type="tex ...
- SSM框架下的redis缓存
基本SSM框架搭建:http://www.cnblogs.com/fuchuanzhipan1209/p/6274358.html 配置文件部分: 第一步:加入jar包 pom.xml <!-- ...
随机推荐
- bzoj2744 [HEOI2012]朋友圈——二分图匹配
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2744 首先,求一个图的最大团等价于求它的补图的最大独立集,而二分图的最大独立集 = 总点数 ...
- bzoj4561
扫描线 想法挺妙 搞了很长很长时间... http://www.cppblog.com/superlong/archive/2010/08/06/122427.html #include<bit ...
- 【高德地图API】Pivot控件中加载地图并禁止Pivot手势
如题,解决方案,参考[Windows phone应用开发[20]-禁止Pivot手势]http://www.cnblogs.com/chenkai/p/3408658.html. xaml代码清单 ...
- E20170626-gg
occupy vt. 占领; 使用,住在…; 使从事,使忙碌; 任职; stack n. 垛,干草堆; (一排) 烟囱; 层积; 整个的藏书架排列;
- D. Toy Sum(cf)
http://codeforces.com/problemset/problem/405/D 题意:已知集合S={1,2,3......1000000},s=1000000,从集合S中选择n个数,X= ...
- Akka源码分析-Remote-ActorSystem
前面的文章都是基于local模式分析的,现在我们简要分析一下在remote模式下,ActorSystem的创建过程. final val ProviderClass: String = setup.g ...
- 6月来了,Java还是第一!
2019年6月了,话说现在很多小孩子都开始接触幼儿编程了,我也经常看到幼儿编程的广告,编程门槛真的是越来越低. 除此之外,也有大量其他行业的从业者想转软件开发的,编程那么广,语言那么多,那么在这么多编 ...
- Style在Android中的继承关系
Style在Android中的继承关系 Android的Styles(样式)和Themes(主题)非常类似Web开发里的CSS,方便开发者将页面内容和布局呈现分开.Style和Theme在Androi ...
- CentOS7阿里云服务器,python程序requests无法正常post网站(报502)
问题描述: 使用jenkins构建接口自动化测试时,发现新增加的接口case不能访问通,会报502错误(本地可以跑通,在测试服就会502)解决的思路: 缩小调试范围(去掉jenkins db环境,将问 ...
- CAD绘制一个半径标注(com接口VB语言)
主要用到函数说明: _DMxDrawX::DrawDimRadial 绘制一个半径标注.详细说明如下: 参数 说明 DOUBLE dCenterX 被标注的曲线的中点X值 DOUBLE dCenter ...