上一篇说到导出Excel,如果数据填充没有问题,就可以将文件导入到系统中了。
导入Excel调试通以前有很多坑,通了以后就觉得没什么了。
废话不多,直接上代码
JSP
<div style="margin-top: 60px; margin-left: 30px;">
<input id="excelFile" name="excelFile" class="easyui-filebox" style="width: 60%" data-options="prompt:'选择Excel文件...'">
<a href="#" class="easyui-linkbutton" style="" οnclick="uploadExcel()">导入</a>
</div>
JS
function uploadExcel() {
// 得到上传文件的全路径
var fileName = $('#excelFile').filebox('getValue')
// 进行基本校验
if (fileName == "") {
alert("请选择上传文件!");
} else {
// 对文件格式进行校验
var d1 = /\.[^\.]+$/.exec(fileName);
if (d1 == ".xls") {
$('#Manage').form('submit', {
url : 'trainingPrograms/import',
onSubmit : function() {
return $(this).form('validate');
},
success : function(result) {
// var result = eval('(' + result +
// ')');"${pageContext.request.contextPath}/trainingPrograms/import"
var result = eval('(' + result + ')');
if (result == "error") {
$.messager.alert("提示", "导入失败!", "info");
$('#trainingProgramsImport').dialog('close'); // close
// the
// dialog
$('#dg').datagrid('reload'); // reload the Teacher
// data
} else if(result == "success") {
$.messager.alert("提示", "导入成功!", "info");
$('#trainingProgramsImport').dialog('close'); // close
// the
// dialog
$('#dg').datagrid('reload'); // reload the Teacher
// data
}else if (result == "chongfu"){
$.messager.alert("提示", "导入失败,Excel中的数据已部分或全部导入!", "info");
$('#trainingProgramsImport').dialog('close');
$('#dg').datagrid('reload');
}
}
});
} else {
alert("请选择xls格式文件!");
$('#uploadExcel').filebox('setValue', '');
}
}
}
从页面被调用控制器
controller
@RequestMapping(value = "/trainingPrograms/import", method = RequestMethod.POST)
public void importTrainingProgram(HttpServletResponse response,
HttpServletRequest request) throws Exception {
String dataBaseName=(String) request.getSession().getAttribute (CloudContext.DatabaseName)+"_basic";
// 创建一个通用的多部分解析器
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
request.getSession().getServletContext());
InputStream inExcelFile = null;
// 判断 request 是否有文件上传,即多部分请求
if (multipartResolver.isMultipart(request)) {
// 转换成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
// 取得request中的所有文件名
Iterator<String> iter = multiRequest.getFileNames();
while (iter.hasNext()) {
// 记录上传过程起始时的时间,用来计算上传时间
int pre = (int) System.currentTimeMillis();
// 取得上传文件
MultipartFile file = multiRequest.getFile(iter.next());
inExcelFile = file.getInputStream();
}
}
// 创建一个list 用来存储excel文件中的内容
List list = new ArrayList();
Workbook rwb = null;
Cell cell = null;
String result = "error";
// 获取Excel文件对象
rwb = Workbook.getWorkbook(inExcelFile);
// 获取文件的指定工作表 默认的第一个
Sheet sheet = rwb.getSheet(0);
// 行数(表头的目录不需要,从1开始)
for (int i = 0; i < sheet.getRows(); i++) {
// 创建一个数组 用来存储每一列的值
String[] str = new String[sheet.getColumns()];
// 列数
for (int j = 0; j < sheet.getColumns(); j++) {
// 获取第i行,第j列的值
cell = sheet.getCell(j, i);
str[j] = cell.getContents();
}
list.add(str);
}
//构造实体list
List<CourseInfo> courseinfolist = new ArrayList<CourseInfo>();
List<TraningProgramNow> trainingprogramlist = new ArrayList<TraningProgramNow>();
/*
//查出来的是专业类型,比如"专业选修课"之类的----2016年9月23日20:19:21
List<CourseType> coursetypeAbtlist = editTrainingProgramBean
.queryAllCoursesType(dataBaseName);
// 查询nodelevel表中pId为null的学校id,然后根据这个学校id查询pId为这个id的学院类型id
String academyId = editTrainingProgramBean
.findAcademyTypeid(dataBaseName);
// 根据学院类型id查询专业类型id
String inistutionId = editTrainingProgramBean.findInisutionTypeid(
academyId, dataBaseName);
//查询所有二级学院----2016年9月23日20:20:27
List<Institution> academyList = editTrainingProgramBean
.queryAllacademy(academyId, dataBaseName);
//显示八个学期----2016年9月23日20:22:15
List<DictionaryNow> tremList = editTrainingProgramBean
.queryTremList("学期", dataBaseName);
//显示两个考核形式,考查还是考试--2016年9月23日20:22:45--
List<DictionaryNow> examList = editTrainingProgramBean
.queryTremList("考核形式", dataBaseName);
//查询所有专业----2016年9月23日20:23:26
List<Institution> institutionList = editTrainingProgramBean
.queryAllacademy(inistutionId, dataBaseName);
//查询数据库中已有的全部课程--2016年9月23日20:25:02--
List<CourseInfo> courselist = editTrainingProgramBean
.queryAllCourseInfo(dataBaseName);
*/
a: //用于跳出循环
if (list.size() > 0 && list != null) {
b: //用于跳出循环
//循环list中的每条数据,也就是excel中的每条数据
for (int i = 1; i < list.size(); i++) {
String[] str = (String[]) list.get(i); //将List (Excel) 中的第一条记录存入String数组
if (list.get(i) != null) {
//在导入之前,先判断是否是重复导入,也就是说,判断是否之前已经导入过相同的数据----2016年9月23日16:51:29
//如果有重复数据,则提示给用户
//1.查询数据库中已有的数据
//返回的list有三个值:课程id,学期名,专业名
/*List listDB = new ArrayList();
listDB = editTrainingProgramBean.selectTrainingPrograms(dataBaseName);
//2.一条条遍历将要导入数据库的list,和数据库中的每条数据做比较
c:
for (int j = 0; j < listDB.size(); j++) {
Object[] strDB = (Object[]) listDB.get(j);
//比较课程编码、开课学期、培养计划所属专业
//3.拿list中的一条数据和数据库中的每条数据listDB做对比
if(strDB[0].toString().equals(str[1]) &&
strDB[1].toString().equals(str[9]) &&
strDB[2].toString().equals(str[11])){
result=INFO;
("Excel中有重复数据,导入失败");
break a;
}
}*/
//构造实体对象
Institution academy = new Institution();
Institution institution = new Institution();
DictionaryNow trem = new DictionaryNow();
DictionaryNow exam = new DictionaryNow();
CourseType coursetype = new CourseType();
CourseInfo courseinfo = new CourseInfo();
TraningProgramNow trainingprogram = new TraningProgramNow();
// 课程类型
coursetype.setCourseTypeName(str[0]); // CourseTypeName
coursetype = findremoveDuplicateAbtCourseType(coursetype,
coursetypeAbtlist);
// 学校,是哪所大学,比如清华、北大、北理工……
academy.setInstitutionName(str[7]);
academy = findremoveDuplicateAbtInstitution(academy,
academyList);
// 专业,比如 生物技术,食品工程,商务英语……
institution.setInstitutionName(str[11]);
institution = findremoveDuplicateAbtInstitution(institution,
institutionList);
// 学期
trem.setContent(str[9]);
trem.setType("学期");
trem = findremoveDuplicateAbtDictionaryNow(trem, tremList);
// 考核形式
exam.setContent(str[8]);
exam.setType("考核形式");
exam = findremoveDuplicateAbtDictionaryNow(exam, examList);
// 课程
//查询公选的课程性质id (str[16]的值是 "自然科学" 或 "人文社科" 或 "社会体育")
String courseNatureId = editTrainingProgramBean.queryCourseNatureId(dataBaseName, str[16]);
courseinfo.setCourseCode(str[1]);
courseinfo.setCourseName(str[2]); // CourseInfoName
courseinfo.setClassHour(str[3]); // classHour
courseinfo.setClassPoint(str[4]); // classPoint
courseinfo.setCourseTypeId(coursetype.getId()); // CourseTypeID
courseinfo.setTheoryClassHour(str[5]); // TheoryClassHour
courseinfo.setPracticeClassHour(str[6]); // PracticeClassHour
courseinfo.setCourseNatureId(courseNatureId);
courseinfo.setInstitutionId(academy.getId()); // institutionId
courseinfo.setDataBaseName(dataBaseName);
courseinfo = findremoveDuplicateAbtCourseInfo(courseinfo,
courselist);
// 培养计划
String uuid = UUID.randomUUID().toString();
trainingprogram.setId(uuid);
trainingprogram.setCourseId(courseinfo.getId());
trainingprogram.setCourseTypeID(coursetype.getId());
trainingprogram.setPeriodId(trem.getId());
trainingprogram.setExamOrNot(exam.getId());
trainingprogram.setInstitutionId(institution.getId());
trainingprogram.setWeekClass(str[10]);
trainingprogram.setBeginweek(str[13]);
trainingprogram.setEndweek(str[14]);
trainingprogram.setOddWeekOrNot(str[15]);
trainingprogram.setRemark(str[17]);
trainingprogram.setDataBaseName(dataBaseName);
//将excel中的每条记录都保存到对应的实体list中
courseinfolist.add(courseinfo);
trainingprogramlist.add(trainingprogram);
}
}
// 给courseinfo去重
courseinfolist = queryremoveDuplicateCourseInfo(courseinfolist);
Boolean it = editTrainingProgramBean.AddTrainProgramDetaillist(
dataBaseName,courseinfolist,trainingprogramlist);
if (it) {
result = SUCCESS;
}
}
JacksonJsonUntil jacksonJsonUntil = new JacksonJsonUntil();
jacksonJsonUntil.beanToJson(response, result);
}
这样调用就可以验证Excel数据是否重复,并且经过循环,将其中数据循环存入list传到后端,存储进数据库。
补充:
在部署的时候,需要在jboss中引入两个用于上传的jar包:commons-fileupload-1.3.1.jar和commons-io-2.2.jar。
结果:
一句话点评:前天看到家族群里分享的一篇文章,其中有句话:在你越艰难的时候,就是你收获最大的时候。