Excel实现上传 导入 解析Excel 页面展示Excel数据

前台采用freemarker,后台Java,利用poi插件完成的Excel上传,解析,到存储到数据库。

<#include "/commons/banner.ftl" encoding="UTF-8">


  <#--合同编号-->
   <#assign contractNos = "">
    <#if contractnoCommands?size!=0>
	<#list contractnoCommands as contractnoCommand>
	 <#list contractnoCommand ? keys as key>
	   <#assign contractNos = contractNos +  '|' +contractnoCommand[key] >
	 
	
   
   <#if contractNos?exists  && contractNos?length gt 0>
    <#assign contractNos = '^(' + contractNos?substring(1) + ')$'>
   
   


 ${moduleName}

<#if textmessage??>
流程:下载模板 - 填写数据 - 上传 - 确认导入
说明:下载模板后,请不要修改模板格式。一次最多导入100条。上传后会显示数据,可以通过“选择”或“全选”要上传的数据。确认无误后请点击“确认导入”。
${textmessage!''}
o  上传文件
上传文件:
o  材料供应信息导入
<#--全选操作--> <#-- 序号 --> <#-- 列表标签 --> <#if !rowList?exists || rowList?size==0> <#else> <#--隐藏域 获取表头titleMaps--> <#list rowList as command> <#list rowList[command_index] as cell> <#--<#if cell_index == titleMap["其它产品名称"] > <#else>-->
序号合同编号 产品类型 产品名称 其它产品名称 品种牌号 规格型号 生产批次 材料发货时间 供应数量 计量单位
  数据为空
${command_index+1} ${cell}
<#if rowList?exists && rowList?size!=0>
<#include "/commons/bottom.ftl" encoding="UTF-8">

Java代码

/**
	 * 执行上传操作
	 * @param access
	 * @param request
	 * @param response
	 * @return
	 * @throws Wrong
	 */
	
	public ModelAndView upload(Access access, HttpServletRequest request,
			HttpServletResponse response) throws Wrong {

		ModelAndView view = new ModelAndView(
				"/interface/supplyinfo/supplyinfo_excel");
		// 页面显示提示
		String textmessage = "";
		
		// 总行数
		int ROWSUM = 104; // 106;
		// 总列数
		int CELLSUM = 11;

		// 数据开始行
		int DATACOUNT = 5;

		// 日期格式
		DateFormat mat = new SimpleDateFormat("yyyy-MM-dd");

		// 存放excel所有数据
		List> rowList = new ArrayList>(20);

		// 存放excel所有标题位置 key标题名字 value是列位置(从0算起)
		Map titleMap = new HashMap(33);

		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;

		CommonsMultipartFile file = (CommonsMultipartFile) multipartRequest
				.getFile("uploadfile");

		if (file.getSize() != 0) {
			// 获得文件名:
			String realFileName = file.getOriginalFilename();
			InputStream fileis = null;
			try {
				// 存放路径
				StringBuffer upLoadFilePath = new StringBuffer();
				upLoadFilePath
						.append(getServletContext().getRealPath("/document"))
						.append(File.separator).append("supplyupload")
						.append(File.separator);

				// 创建路径目录
				File tempFilePath = new File(upLoadFilePath.toString());
				if (!tempFilePath.exists()) {
					tempFilePath.mkdir();
				}

				Date date = new Date();
				String time = mat.format(date);

				// 保存 文件名= 路径 + 当前时间 + 上传文件的后缀名(防止路径中有多个. 获取数组最后一个)
				File upLoadFile = new File(
						upLoadFilePath.toString()
								+ time
								+ "_"
								+ System.currentTimeMillis()
								+ "."
								+ realFileName.split("\\.")[realFileName
										.split("\\.").length - 1]);
				FileCopyUtils.copy(file.getBytes(), upLoadFile);

				// 重新获得文件流
				fileis = new FileInputStream(upLoadFile);

				Workbook wb = new HSSFWorkbook(fileis);
				Sheet sheet = wb.getSheetAt(0);

				// 遍历行数
				for (int rowCount = 1; rowCount <= sheet.getLastRowNum(); rowCount++) {
					// 获得行 从0行开始
					Row row = sheet.getRow(rowCount - 1);
					
					if(row.getRowNum()  == 1){
						//判断row=1时 材料供应信息表
						Cell titlecell = row.getCell(0);
						if(!"材料供应信息表".equals(titlecell.getRichStringCellValue()
								.toString())){
							//判断表头是否为[材料供应信息表]
							textmessage = "模板不正确。请重新下载模板";
							break;
						}
					}
					
					
					// 是数据行
					if (rowCount >= DATACOUNT && rowCount <= ROWSUM) {
						// 保存列数据
						List cellList = new ArrayList(11);

						// 遍历列数 不超过CELLSUM最大列
						for (int cellCount = 1; cellCount <= sheet
								.getLastRowNum() && cellCount <= CELLSUM; cellCount++) {
							// 获得列 从0行开始
							Cell cell = row.getCell(cellCount - 1);

							if (cellCount == 1 || cell == null)
								continue;

							switch (cell.getCellType()) {

							case Cell.CELL_TYPE_NUMERIC:
								// 先看是否是日期格式
								if (DateUtil.isCellDateFormatted(cell)) {
									// 读取日期格式
									String celldate = mat.format(
											cell.getDateCellValue()).trim();
									cellList.add(celldate);
								} else {
									// 读取数字
									cellList.add(String.valueOf(
											cell.getNumericCellValue()).trim());
								}

								break;

							case Cell.CELL_TYPE_STRING:
								// 读取String
								cellList.add(cell.getRichStringCellValue()
										.toString().trim());
								break;

							case Cell.CELL_TYPE_BLANK:
								cellList.add("");
								break;

							}

						}

						// 如果cellList不是空 且内容不都是""
						if (!cellList.isEmpty()) {
							for (String value : cellList) {
								if (!"".equals(value)) {
									// 保存到行集合
									rowList.add(cellList);

									break;
								}
							}
						}

					} else if(rowCount == 3 && titleMap.size() < CELLSUM - 1){
						// 添加列标题 如果titleMap没有添加过的话
						for (int cellCount = 1; cellCount <= sheet.getLastRowNum() && cellCount <= CELLSUM; cellCount++){
							// 获得列 从0行开始
							Cell cell = row.getCell(cellCount - 1);

							if (cellCount == 1 || cell == null)
								continue;
							// 以标题名为key 位置为value(从0开始)
							titleMap.put(cell.getRichStringCellValue().toString(), cellCount - 2);
						}
					}

				}
				
				Map enterpriseInfo =  this.getEnterpriseInfo(access, request, response);
				
				//获取企业id
				Integer enterpriseId = 0 ;
				
				if(enterpriseInfo!=null &&enterpriseInfo.size()>0){
					enterpriseId = (Integer)enterpriseInfo.get("enterpriseId");
				}
				
				//获取合同编号
				List> contractnoCommands = access.query(new Declare("contractInfo.select_contractno").AND("enterprise_id = ?", enterpriseId));
				
				view.addObject("textmessage", textmessage);
				view.addObject("contractnoCommands",contractnoCommands);
				view.addObject("titleMap",titleMap);
				view.addObject("titleMaps",titleMap.toString());
				view.addObject("rowList", rowList);
				view.addObject("CELLSUM", CELLSUM);
			}catch (Exception e) {
				
				e.printStackTrace();
			
			}finally{
				try{
					fileis.close();
				}
				catch (Exception e){
					e.printStackTrace();
				}
			
			}

		}

		return view;
	}

/**
	 * 执行导入Excel操作
	 * */
	
	public ModelAndView importExcel(Access access, HttpServletRequest request,
			HttpServletResponse response) throws Wrong {

		ModelAndView view = new ModelAndView("commons/reload");

		String actionmessage = "导入成功";

		try {
			
			String titleMaps = Web.value(request, "titleMaps");

			Map  titleMap = (Map )JSONObject.toBean(JSONObject.fromObject(titleMaps),HashMap.class);
			
			//获取登录用户类型
			Integer userType= Web.auth(request).getType();

			//获取登录人id
			Integer userId= Web.auth(request).getId();
			
			//企业组织机构代码
			String unitOrgan = "";
			
			if(userType == 10 ){//企业分帐号
				//根据企业分账号查询主企业的组织机构代码

				//获取主企业信息
				Map mainUnitInfo = access.info3(new Declare("contractInfo.select_mainunit_info").value(userId));
				
				if(mainUnitInfo!=null && mainUnitInfo.size()>0 ){
					
					//获取组织机构代码
					unitOrgan =(String) mainUnitInfo.get("com_id");
					
				}
			}else{//主企业登录 该功能只有企业才有添加功能

				//获取当前用户企业组织机构代码
				unitOrgan = Web.auth(request).getAccount();
			}
			
			//根据企业组织机构代码企业id
			Integer enterpriseId= access.first(new Declare("contractInfo.select_enterprise_id").value(unitOrgan));
			//获取当前人id
			Integer operateOp = Web.auth(request).getId();
			
			//当前操作人name
			String operateName =Web.auth(request).getName();
			
			// 存放所有字段 key是中文名 value是数据库字段名
			Map filedsMap = Alert.map("合同编号:contract_no,产品类别:product_category,产品名称:product_name,其它产品名称:other_product_name,品种(牌号):variety,产品的规格型号:product_standard,生产批次:product_batch,材料发货时间:approach_date,供应数量:supply_number,计量单位:product_unit");
			
			//产品类别从配置文件combox.properties读取
			Map productTypeMap = new HashMap();
			Map tempMap = Mix.get().value("productTypeMap", Symbol.Combox);
			for (String key : tempMap.keySet())
			{
				productTypeMap.put(tempMap.get(key), key);
			}
			
			// Excel 中需要导入导入的行
			String[] check = Web.values(request, "sca");

			// 拦截所有异常 任何异常导入失败
			try {
				for (String row : check) {
					
					StringBuffer sqlfileds = new StringBuffer("");
					StringBuffer sqlvalues = new StringBuffer("");
					Integer contractId = 0 ;
					
					if (titleMap!=null && titleMap.keySet().size() == 0) {
						throw new Exception("读取表格列失败");
					}

					for (String title : titleMap.keySet()) {
						// 获得列位置
						int cell = titleMap.get(title);

						// 行+列 是input的name
						String name = row + "_" + cell;
						// 获取值
						String value = request.getParameter(name);

						if (value != null && !"".equals(value)) {

							// 添加第cell个字段
							sqlfileds.append(filedsMap.get(title)).append(",");

							// 日期类型
							if (cell == titleMap.get("材料发货时间")) {
								sqlvalues.append("to_date('").append(value)
										.append("','yyyy-mm-dd'),");
							}
							// 数字类型
							else if (cell == titleMap.get("供应数量")) {
								sqlvalues.append(Double.valueOf(value)).append(
										",");
							}
							// 产品类别存储对应的key
							else if (cell == titleMap.get("产品类别")) {
								sqlvalues
										.append(Alert.number(productTypeMap
												.get(value))).append(",");
							}else if(cell == titleMap.get("合同编号")){
								
								sqlvalues.append("'").append(value).append("',");
								
								//根据合同编号查询合同表id
								contractId =access.first(new Declare("contractInfo.select_contractid").value(value));
								
							}else {
								sqlvalues.append("'").append(value).append("',");
							}
							
						}

					}
					//每条进行进行保存
					if(sqlfileds!=null && sqlfileds.length()>0 && sqlvalues!=null && sqlvalues.length()>0){
						
						Serializable id = access.append(new Declare("supplyInfo.import_supplyinfo")
														  .attr("titles", sqlfileds.substring(0,sqlfileds.length()-1))
														  .attr("values", sqlvalues.substring(0,sqlvalues.length()-1))
																.values(enterpriseId,contractId, operateOp, operateName)
														);
						
						//-----------计入历史记录表---------|
						
						//定义存储历史表字段
						String tableName = this.getEntity().tableName().toUpperCase();//表名
						
						int type = 4;//[1:添加,2:修改,3:删除,4:Excel导入]
						
						//插入历史数据
						Bemms.history(access, id, Web.auth(request), tableName, type);
						
						//-----------计入历史记录表---------|
					}
					
				}

			} catch (Exception e) {
				actionmessage = "导入失败,请检查您填写的数据后再重试";
				
				e.printStackTrace();
				//事务回滚
				access.rollback();
			}
		} catch (Throwable e) {
			throw this.undoErrorMimic(e, this.getMethodLableName("save"));
		}
		view.addObject("actionmessage",actionmessage);
		view.addObject("reload", "/supplyinfo/supplyinfo.action?action=excel&actionmessage="+actionmessage);
		return view;
	}

展示效果:

Excel模版:(Excel的操作行列是从B5到K104)

Excel实现上传 导入 解析Excel 页面展示Excel数据_第1张图片

Excel实现上传 导入 解析Excel 页面展示Excel数据_第2张图片

进入导入页面:

Excel实现上传 导入 解析Excel 页面展示Excel数据_第3张图片

选择一个正确的文件,点击上传,执行的方法(upload),显示数据,确认导入执行的方法是(importExcel)

Excel实现上传 导入 解析Excel 页面展示Excel数据_第4张图片

你可能感兴趣的:(JAVA基础)