Excel批量导入(导出同理)
- 在做JavaWeb中添加数据使我们在所难免会遇到的,在大数据的环境下批量添加和批量删除是必须的,而批量删除只需要获取到我们需要删除的ID就可以了,在批量添加中我们就会遇到问题,问题是得到批量的数据,这就涉及到了poi技术中的Excel导入导出
- 在前端中我们使用的Dropzone上传技术,在BootStrap中使用模态框显示Dropzone界面
<div class="ibox-content">
<form id="my-awesome-dropzone" class="dropzone"
action="${pageContext.request.contextPath}/change/assistantUpload.action">
<div class="dropzone-previews"></div>
<button type="submit" class="btn btn-primary pull-right">提交</button>
</form>
</div>Dropzone技术特点就是可以将温江拖拽到画面里面,然后开始js工作在form表单提交之后开始到后台收取数据
- 在后台的函数上面加上如下标记 就可以保证范文到制定的函数了
- 然后我们需要制定上传的编码格式为UTF-8
下面就是后台数据处理的部分
`try {
// 上传得请求对象
MultipartHttpServletRequest req = (MultipartHttpServletRequest) request;
// 获取上传的文件
CommonsMultipartFile multipartFile = (CommonsMultipartFile) req
.getFile(“upload”);
// 获取文件的名称 xxx.jpg xxx_1000101897.jp
String fileName = multipartFile.getOriginalFilename();
String suffix = fileName.substring(fileName.lastIndexOf(“.”));
// 声明excel文件对象
Workbook wb = null;
// 获取文件上传输入流对象
InputStream is = multipartFile.getInputStream();
// 判断文件的后缀名称
if (“.xls”.equalsIgnoreCase(suffix)) {
wb = new HSSFWorkbook(is);
} else if (“.xlsx”.equalsIgnoreCase(suffix)) {
wb = new XSSFWorkbook(is);
}// 存储的班级名称
List<String> clazzNames = new ArrayList<String>();
// 存储的学号
List<String> studnos = new ArrayList<String>();
// 判断是否为null
if (wb != null) {
// 读取内容
Sheet sheet = wb.getSheetAt(0);
List<StudentCustom> students = new ArrayList<StudentCustom>();
// 读取行数
int rowNumber = sheet.getPhysicalNumberOfRows();
// 遍历行数
for (int row = 1; row < rowNumber; row++) {
StudentCustom student = new StudentCustom();
// 获取一行记录对象
HSSFRow entity = (HSSFRow) sheet.getRow(row);
// 获取列数
int colNumber = entity.getPhysicalNumberOfCells();
// 遍历列数
for (int col = 0; col < colNumber; col++) {
// 获取指定列
HSSFCell cell = entity.getCell(col);
// 声明当前列的值
String value = "";
Date date = null;
// 判断是否为null
if (cell != null) {
// 判断单元格类型
switch (cell.getCellType()) {
// 数字类型
case Cell.CELL_TYPE_NUMERIC:
// 判断是否是日期类型
if (HSSFDateUtil.isCellDateFormatted(cell)) { // 日期类型
SimpleDateFormat sdf = new SimpleDateFormat(
"yyyy-MM-dd");
date = HSSFDateUtil.getJavaDate(cell
.getNumericCellValue()); } else {
// 获取数字
Integer data = (int) cell
.getNumericCellValue();
if (col == 1) {
HSSFCellStyle cellStyle = cell
.getCellStyle();
String format = cellStyle
.getDataFormatString();
DecimalFormat f = new DecimalFormat(
format);
value = f.format(data);
} else {
value = data.toString();
}
}
break;
// 判断是否是字符型
case Cell.CELL_TYPE_STRING:
value = cell.getStringCellValue();
break;
// 判断是否是boolean型
case Cell.CELL_TYPE_BOOLEAN:
Boolean data = cell.getBooleanCellValue();
value = data.toString();
break;
// 错误类型
case Cell.CELL_TYPE_ERROR:
// System.out.println("单元格内容出现错误");
value = "error";
break;
// 判断是否是公式类型
case Cell.CELL_TYPE_FORMULA:
value = String.valueOf(cell
.getNumericCellValue());
if (value.equals("NaN")) {// 如果获取的数据值非法,就将其装换为对应的字符串
value = cell.getStringCellValue()
.toString();
}
break;
case Cell.CELL_TYPE_BLANK:
// System.out.println("单元格内容 为空值 ");
value = null;
break;
default:
value = cell.getStringCellValue().toString();
break;
} //System.out.println(value); if (col == 1) {
studnos.add(value);
student.setStudno(value);
// 默认密码
student.setPass(value);
} else if (col == 2) {
student.setName(value);
} else if (col == 3) {
student.setSex(value);
} else if (col == 4) {
student.setEnrol(date);
} else if (col == 5) {
student.setEmail(value);
} else if (col == 6) {
if (!clazzNames.contains(value)) {
clazzNames.add(value);
}
// 查询设置班级的id值
Clazz clazz = new Clazz();
clazz.setName(value);
student.setClazz(clazz);
}
} }
// 行结束
students.add(student);
} // 第一步检测班级是否存在
// 查询出该用户管理的班级
List<Clazz> clazzs = clazzService.selectByAssistanUserId(user
.getId());
// 班级的名称集合
List<String> names = new ArrayList<String>();
// 遍历班级
for (Clazz clz : clazzs) {
// 把班级名称加入到集合中
names.add(clz.getName());
}
// 遍历excel中存在的班级
for (String clazzName : clazzNames) {
//System.out.println(clazzName);
// 判断excel中的班级是否 存在班级集合中
if (!names.contains(clazzName)) {
throw new ClazzExitException("该用户不负责班级,或者班级不存在");
}
} // 第二步检测学号是否存在
QueryVo vo = new QueryVo();
int count = studentService.selectAdminStudentsCount(vo);
vo.setStartSize(0);
vo.setPageSize(count);
// 查询出所有学生信息
List<StudentCustom> stus = studentService.selectAdminStudents(vo); List<String> nos = new ArrayList<String>();
// 遍历studnos学号,
for (StudentCustom stu : stus) {
// 把班级名称加入到集合中
nos.add(stu.getStudno());
}
// 1.1如果excel中有重复的学号,也不可以插入 扩展
for(int i =0;i<studnos.size();i++){
for(int j=i+1;j<studnos.size();j++){
if(studnos.get(i)==studnos.get(j)){
throw new ExcelStuNoExitException(studnos.get(i)+"该学号在Excel存在重复");
}
}
}
// 检测查询的学号中是否含有该班级,如果含有 就跑出异常
for (String no : nos) {
System.out.println(no);
// 判断excel中的班级是否 存在班级集合中
if (studnos.contains(no)) {
System.out.println(no);
throw new StuNoExitException(no+"学号已存在");
}
} // excel解析结束
// 按班级分好类
Map<Clazz, List<StudentCustom>> map = new HashMap<Clazz, List<StudentCustom>>();
// 批量保存学生信息 for (String clazzName : clazzNames) {
List<StudentCustom> s = new ArrayList<StudentCustom>();
Clazz clazz = clazzService.selectClazzName(clazzName);
for(int i=0;i<students.size();i++){
if(students.get(i).getClazz().getName()==clazzName)
{
students.get(i).setClazzId(clazz.getId());
s.add(students.get(i));
}
}
map.put(clazz, s);
}
transactionService.insertStudentsCustomFromExcel(map);
// 同步更新班级的人数 } out.print("{\"msg\":\"success\"}");
} catch (ClazzExitException ce) {
out.print("{\"msg\":\""+ce+"\"}");
} catch (ExcelStuNoExitException ce) {
out.print("{\"msg\":\""+ce+"\"}");
} catch (StuNoExitException ce) {
out.print("{\"msg\":\""+ce+"\"}");
} catch (Exception ex) {
out.print("{\"msg\":\""+ex+"\"}");
} finally {
out.flush();
out.close();
- 另外值得一提的是在前端我们的需要因要到一段js来设置传送的接口
`function initUploadOptions(){
Dropzone.options.myAwesomeDropzone = {
method : ‘post’,
paramName : ‘upload’,
autoProcessQueue : false,
uploadMultiple : false,
maxFiles : 1,
init : function() {
var myDropzone = this;
this.element.querySelector(“button[type=submit]”)
.addEventListener(“click”, function(e) {
e.preventDefault();
e.stopPropagation();
myDropzone.processQueue()
});
this.on(“sending”, function() {
alert(“发送过程中”);
});
this.on(“success”, function(file, response) {
alert(file + “成功” + response);
var obj=eval(“(“+response+”)”);
file.previewTemplate.appendChild(document
.createTextNode(obj.msg));
window.location.reload(true);
});
this.on(“error”, function(file, response) {
alert(file + “失败” + response);
})
}
}};`
- 在这里我们需要制定参数的名称为upload 这样我们在controller中渠道upload这个上传的对象 整个过程就可以将Excel中的数据拿到了,至于怎么存取就看个人了,你可以用list去接收这些数据
- 上面这些就是为了实现功能,读者可以自行在此基础上进行分装方法放在自己的项目上就可以使用了
- 在此之前我还有一种方法是封装在Util工具类中的 至于这点我就不多说了我放在下载里 有需要的朋友自己下载吧
- http://download.csdn.net/detail/u013132051/9561129
Excel批量导入(导出同理)的更多相关文章
- PowerShell 批量导入/导出Active Directory
PowerShell 批量导入/导出Active Directory 近期由于公司要求,须要导入20个供应商.20个客户到AD域中,刚開始手动添�了2个供应商,2个客户.可是感觉费时费 ...
- 关于excel的导入导出
目前为方便操作,很多系统都增加了批量导入导出的功能.文件导入导出一般的格式都是excel,现将常用设计用例总结如下: 批量导入 一.模板检查检测:一般excel导入,都会提供模板下载功能 1.模板 ...
- excel的导入导出的实现
1.创建Book类,并编写set方法和get方法 package com.bean; public class Book { private int id; private String name; ...
- 订餐系统之Excel批量导入
批量导入现在基本已经成为各类系统的标配了,当前,我们订餐系统也不例外,什么商家呀.商品呀.优惠码之类的,都少不了.毕竟嘛,对非开发人员来说,看到Excel肯定比看到很多管理系统还是要亲切很多的.这里, ...
- c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出
c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出 using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using S ...
- OpenXml Excel数据导入导出(含图片的导入导出)
声明:里面的很多东西是基于前人的基础上实现的,具体是哪些人 俺忘了,我做了一些整合和加工 这个项目居于openxml做Excel的导入导出,可以用OpenXml读取Excel中的图片 和OpenXml ...
- java实现excel的导入导出(poi详解)[转]
java实现excel的导入导出(poi详解) 博客分类: java技术 excel导出poijava 经过两天的研究,现在对excel导出有点心得了.我们使用的excel导出的jar包是poi这个 ...
- NodeJs之EXCEL文件导入导出MongoDB数据库数据
NodeJs之EXCEL文件导入导出MongoDB数据库数据 一,介绍与需求 1.1,介绍 (1),node-xlsx : 基于Node.js解析excel文件数据及生成excel文件. (2),ex ...
- java 中Excel的导入导出
部分转发原作者https://www.cnblogs.com/qdhxhz/p/8137282.html雨点的名字 的内容 java代码中的导入导出 首先在d盘创建一个xlsx文件,然后再进行一系列 ...
随机推荐
- Kubernetes1.15 部署 coredns
coredns.yaml文件如下所示 # __MACHINE_GENERATED_WARNING__ apiVersion: v1 kind: ServiceAccount metadata: nam ...
- 【带着canvas去流浪(12)】用Three.js制作简易的MARVEL片头动画(上)
目录 一. 大作业说明 二.基本思路 三.视频纹理表面修复--UV映射 3.1 问题描述 3.2 纹理贴图的基本原理-UV映射 3.3 关键示例代码 四.小结 示例代码托管在:http://www.g ...
- vs2010 安装项目完成桌面快捷方式无法定位程序文件夹 解决方法
本文转载自http://www.cnblogs.com/jasonxuvip/archive/2012/07/13/2589952.html 软件打包工具有很多种,让人不知道选那个方便自己使用,Tig ...
- kali换源
在/tec/apt/sources.list加入以下内容 #中科大更新源 deb https://mirrors.ustc.edu.cn/kali kali-rolling main non-free ...
- 跟着大彬读源码 - Redis 5 - 对象和数据类型(上)
相信很多人应该都知道 Redis 有五种数据类型:字符串.列表.哈希.集合和有序集合.但这五种数据类型是什么含义?Redis 的数据又是怎样存储的?今天我们一起来认识下 Redis 这五种数据结构的含 ...
- javaee+tomcat新特性,乱码问题
Tomcat版本问题,servlet乱码问题 我在学习的时候,老师用的是Tomcat1.7版本,在jsp发送get请求的时候,Servlet中还要对get请求传递过来的参数进行解码编码,因为tomca ...
- Appium+python自动化(二十二)- 三个臭皮匠顶个诸葛亮-控件坐标获取(超详解)
简介 有些小伙伴或者是童鞋可能会好奇会问上一篇中的那个monkey脚本里的坐标点是如何获取的,不是自己随便蒙的猜的,或者是自己用目光或者是尺子量出来的吧,答案当然是:NO.获取控件坐标点的方式这里宏哥 ...
- C#4.0新增功能03 泛型中的协变和逆变
连载目录 [已更新最新开发文章,点击查看详细] 协变和逆变都是术语,前者指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类型,后者指能够使用比原始指定的派生类型的派生程度更小(不太具体 ...
- 什么是WebP以及如何在WordPress中使用WebP图像
图像通常是缓慢加载网页的最大原因之一.它们不仅减慢了加载时间,而且还可以占用服务器上的大量空间和资源.仔细选择文件类型并压缩它们有助于降低加载速度,但它们只能在图像质量受损之前进行优化.另一种选择是使 ...
- kaptcha谷歌验证码工具
Kaptcha 简介 Kaptcha 是一个可高度配置的实用验证码生成工具,可自由配置的选项如: 验证码的字体 验证码字体的大小 验证码字体的字体颜色 验证码内容的范围(数字,字母,中文汉字!) 验证 ...