项目需求通过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的方式导入到数据库。出现错误做出相应的修改就好。错误不可怕,就怕它不报错。