poi 上传Excel(2003|2007)到服务器导入数据库

项目需求通过Excel把数据导入数据库,一开始用的jxl,简单完成。后来发下远程下不能导入,报错路径找不到。因为服务器上面没有你路径所说的文件。更改程序思路:先把Excel上传到服务器,在服务器上读取Excel再把数据导入数据库。

上传用到的jar:1.commons-fileupload-1.2.1.jar

                        2.commons-io.jar

.jsp文件:

<form name="formPost1" enctype="multipart/form-data" action="" method="post"> 
			Excel上传:<input type="file"  style=" width: 0 " id="file_id" name="file_name" value="" οnchange="fileLeading();" >
</form>

 注意:1、form加上enctype="multipart/form-data"属性后才能上传文件。但是加上这个属性后文件会以二进制的数据传输。就是说form提交的信息都是二进制的。不能通过简单的document.xx.value的方式传值,获取的会为null。我用的是URL传参的方法把File控件的值传过去的。

js文件:

function fileLeading_drug(){
	var a = document.formPost2.file_name2.value;
	a = a.substr(a.lastIndexOf("\\") + 1);
	document.formPost2.action = "<%=request.getContextPath()%>/LeadingData/LeadingMain.jsp?file_name2="+a+"  ";
	document.formPost2.submit();
}

这样在java后台就能获取到getParameter();

java文件:
可以用截取字符串的方式判断文件类型

if(!(file_name2.substring(file_name2.length()-4)).equals(".xls")  &&!(file_name2.substring(file_name2.length()-5)).equals(".xlsx")){
			out.println("<script>alert('选择文件格式不正确,请重新选择。');window.location.href('LeadingMain.jsp');</script>");
		}else{
			/*上传开始*/
			String Filepath = "";
			try{
				DiskFileItemFactory factory = new DiskFileItemFactory();
				// 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
				factory.setRepository(new File("C:\\"));
				/**创建一个新的文件上传操作*/
				ServletFileUpload upload = new ServletFileUpload(factory);
				/**设置能上传的最大文件的大小*/
				upload.setSizeMax(10*1024*1024*1024);
				//开始读取上传信息
				Iterator<FileItem> iter = upload.parseRequest(request).iterator();
				// 依次处理每个上传的控件				while(iter.hasNext()) {
					FileItem item = (FileItem) iter.next();
				// 忽略其他不是文件域的所有表单信息
				if (!item.isFormField()) {
					if (item.getSize() > 0)
					{
						String name = item.getName();
						String endName = name.substring(name.lastIndexOf(".") + 1);
						try{
		 					item.write(new File(request.getRealPath("\\"+file_name2)));
		 					Filepath = request.getRealPath("\\"+file_name2);
							}catch(Exception e){
								e.printStackTrace();
								System.out.println("上传失败……………………");
							}
					}
					}
				}
			}catch(Exception e){
				e.printStackTrace();
			}
			/*上传结束*/

接着就是在服务器上读取Excel把内容导入到数据库,读取Excel用的是POI支持2003和2007。

poi用到的jar:1、dom4j-1.6.1.jar

                       2、poi-3.7-20101029.jar

                       3、poi-examples-3.7-20101029.jar

                       4、poi-ooxml-3.7-20101029.jar

                       5、poi-ooxml-schemas-3.7-20101029.jar

                       6、poi-scratchpad-3.7-20101029.jar

                       7、xmlbeans-2.3.0.jar

 

Workbook wb = null;
			if(Filepath.matches("^.+\\.(?i)(xls)$")){//2003
				wb = new HSSFWorkbook(new FileInputStream(Filepath));
			}
			if(Filepath.matches("^.+\\.(?i)(xlsx)$")){//2007
				wb = new XSSFWorkbook(new FileInputStream(Filepath)); 
			}
			Sheet sheet = wb.getSheetAt(0);
			if(!(sheet.getRow(0).getCell(1).getStringCellValue().toLowerCase()).equals("drug_name")){
					out.println("<script>alert('导入文件数据不正确。');window.location.href('LeadingMain.jsp');</script>");
				}else{
					for(int i=1;i<=sheet.getLastRowNum();i++){
						max_mapid_sql2 = "select max(DRUG_MAP_ID)  from drug_map";
						TCommonRecord max_mapid2 = (TCommonRecord)query.queryForObject(max_mapid_sql2,new CommonMapper());
						int a = max_mapid2.getInt("max(DRUG_MAP_ID)")+1;
							map_sql2 = "insert into DRUG_MAP (DRUG_MAP_ID,DRUG_NO_LOCAL,DRUG_NAME_LOCAL,DRUG_SPEC,UNITS,DRUG_FORM,TOXI_PROPERTY,DOSE_PER_UNIT,DOSE_UNITS,DRUG_INDICATOR,INPUT_CODE,CLIENT_NAME) values "+
	 					"('"+a+"'," 						+
	 					"'"+getCell_Value(sheet.getRow(i).getCell(0))+"',"			+
	 					"'"+getCell_Value(sheet.getRow(i).getCell(1))+"',"			+
	 					"'"+getCell_Value(sheet.getRow(i).getCell(2))+"',"			+
	 					"'"+getCell_Value(sheet.getRow(i).getCell(3))+"',"			+
	 					"'"+getCell_Value(sheet.getRow(i).getCell(4))+"',"			+
	 					"'"+getCell_Value(sheet.getRow(i).getCell(5))+"',"			+
	 					"'"+getCell_Value(sheet.getRow(i).getCell(6))+"',"			+
	 					"'"+getCell_Value(sheet.getRow(i).getCell(7))+"',"			+
	 					"'"+getCell_Value(sheet.getRow(i).getCell(8))+"',"			+
	 					"'"+getCell_Value(sheet.getRow(i).getCell(9))+"',"	+
	 					"'"+crUser.get("OWNER_HOSPITAL")+"')";
						query.update(map_sql2);
					}
						out.println("<script>alert('导入HIS数据成功。');window.location.href('LeadingMain.jsp');</script>");
				}

其中的getCell_Value方法是用来判断读到的单元格内容类型的,再做相应的转换。

 

String getCell_Value (Cell cell) //判断单元格cell的类型并且做出相应的转换
{
	String strCell = "";
	if(cell!=null){
		switch(cell.getCellType()){
		case Cell.CELL_TYPE_STRING:
			strCell = cell.getStringCellValue();
			break;
		case Cell.CELL_TYPE_NUMERIC:
			strCell = String.valueOf(cell.getNumericCellValue());
			break;
		case Cell.CELL_TYPE_BLANK:
			strCell = "";
			break;
		case Cell.CELL_TYPE_BOOLEAN:
			strCell = String.valueOf(cell.getBooleanCellValue());
			break;
		default:
		    strCell = "";
	        break;
		}
	}
return strCell;
}


这样就可以把数据用Excel的方式导入到数据库。出现错误做出相应的修改就好。错误不可怕,就怕它不报错。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值