您的位置:首页 > 数据库

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

2013-11-25 16:33 531 查看
项目需求通过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="" onchange="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:
strCe
9eb3
ll = 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的方式导入到数据库。出现错误做出相应的修改就好。错误不可怕,就怕它不报错。

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息