Java--导入Excel

上一篇说到导出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;
						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]); // 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。

结果:



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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值