Java--导入Excel

来源:互联网 发布:seo招聘 编辑:程序博客网 时间:2024/05/05 17:41

上一篇说到导出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="" onclick="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)) {// 转换成多部分requestMultipartHttpServletRequest 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);}//构造实体listList<CourseInfo> courseinfolist = new ArrayList<CourseInfo>();List<TraningProgramNow> trainingprogramlist = new ArrayList<TraningProgramNow>();/*//查出来的是专业类型,比如"专业选修课"之类的--韩林--2016年9月23日20:19:21List<CourseType> coursetypeAbtlist = editTrainingProgramBean.queryAllCoursesType(dataBaseName);// 查询nodelevel表中pId为null的学校id,然后根据这个学校id查询pId为这个id的学院类型idString academyId = editTrainingProgramBean.findAcademyTypeid(dataBaseName);// 根据学院类型id查询专业类型idString inistutionId = editTrainingProgramBean.findInisutionTypeid(academyId,  dataBaseName);//查询所有二级学院--韩林--2016年9月23日20:20:27List<Institution> academyList = editTrainingProgramBean.queryAllacademy(academyId, dataBaseName);//显示八个学期--韩林--2016年9月23日20:22:15List<DictionaryNow> tremList = editTrainingProgramBean.queryTremList("学期", dataBaseName);//显示两个考核形式,考查还是考试--2016年9月23日20:22:45--韩林List<DictionaryNow> examList = editTrainingProgramBean.queryTremList("考核形式",  dataBaseName);//查询所有专业--韩林--2016年9月23日20:23:26List<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;logger.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]); // CourseTypeNamecoursetype = 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]); // CourseInfoNamecourseinfo.setClassHour(str[3]); // classHourcourseinfo.setClassPoint(str[4]); // classPointcourseinfo.setCourseTypeId(coursetype.getId()); // CourseTypeIDcourseinfo.setTheoryClassHour(str[5]); // TheoryClassHourcourseinfo.setPracticeClassHour(str[6]); // PracticeClassHourcourseinfo.setCourseNatureId(courseNatureId);courseinfo.setInstitutionId(academy.getId()); // institutionIdcourseinfo.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。

结果:



一句话点评:前天看到家族群里分享的一篇文章,其中有句话:在你越艰难的时候,就是你收获最大的时候。

0 0
原创粉丝点击