JSP上傳excel及excel插入至資料庫的方法_JSP編程

來源:互聯網
上載者:User

本文執行個體講述了JSP上傳excel及excel插入至資料庫的方法。分享給大家供大家參考。具體如下:

此匯入excel是與pojo綁定的,(缺點)excle表頭必須是pojo的欄位值

1. html頁面:

<form id="myform" method="post" enctype="multipart/form-data"><table> <tr>  <td></td>  <td>   <input type="file" name="filepath" id="filepath"    class="easyui-validatebox" required=true    validType="equalLength[4]" missingMessage="檔案!" value="" />  </td> </tr> <tr align="center">  <td colspan="2">   <a id="btn1" class="easyui-linkbutton"    data-options="iconCls:'icon-ok'" style="width: 60px"    onclick="subForm();">OK</a>   <a id="btn2" class="easyui-linkbutton"    data-options="iconCls:'icon-cancel'" style="width: 60px"    onclick="closeDig();">Cancel</a>  </td> </tr></table></form><script type="text/javascript">function subForm(){ if($('#myform').form('validate')){  /**  var filepath = $("#filepath").val();  alert(filepath);  $.ajax({   url: 'excleImport',   typs: "post",   data: {"filepath":filepath},   async: false,    error: function(request) {    $('#dg').datagrid('reload');    closeDig();    $.messager.alert("操作提示", "操作成功!","info");    },    success: function(data) {     alert("success");    }  });  **/  var filepath = $("#filepath").val();  var re = /(\\+)/g;   var filename = filepath.replace(re,"#");   //對路徑字串進行剪下截取   var one = filename.split("#");   //擷取數組中最後一個,即檔案名稱   var two = one[one.length-1];   //再對檔案名稱進行截取,以取得尾碼名   var three = two.split(".");    //擷取截取的最後一個字串,即為尾碼名   var last = three[three.length-1];   //添加需要判斷的尾碼名類型   var tp = "xls,xlsx";   //返回合格尾碼名在字串中的位置   var rs = tp.indexOf(last);   if(rs != -1){    $("#myform").attr("action","excleImport");   $("#myform").submit();  }else{    $.messager.alert("操作提示", "您選擇的上傳檔案不是有效xls或者xlsx檔案!","error");   return false;   }  } else {  $.messager.alert("操作提示", "請選擇上傳檔案!","error"); }}</script>

2. java代碼:

@RequestMapping("/excleImport") public void excleImport(HttpServletRequest request) throws IOException, Exception {  request.setCharacterEncoding("utf-8"); //設定編碼   //獲得磁碟檔案條目工廠   DiskFileItemFactory factory = new DiskFileItemFactory();   //擷取檔案需要上傳到的路徑   String path = request.getRealPath("/upload/kaku");   File uploadDir = new File(path);  if (!uploadDir.exists()) {   uploadDir.mkdirs();  }  factory.setRepository(uploadDir);   //設定 緩衝的大小,當上傳檔案的容量超過該緩衝時,直接放到 暫時儲存室   factory.setSizeThreshold(1024*1024) ;   //高水平的API檔案上傳處理   ServletFileUpload upload = new ServletFileUpload(factory);   //可以上傳多個檔案   List<FileItem> list = (List<FileItem>)upload.parseRequest(request);   for(FileItem item : list)   {    //擷取表單的屬性名稱字    String name = item.getFieldName();    //如果擷取的 表單資訊是普通的 文本 資訊    if(item.isFormField())    {          //擷取使用者具體輸入的字串 ,名字起得挺好,因為表單提交過來的是 字串類型的     String value = item.getString() ;     request.setAttribute(name, value);    }    //對傳入的非 簡單的字串進行處理 ,比如說二進位的 圖片,電影這些    else    {     /**      * 以下三步,主要擷取 上傳檔案的名字      */     //擷取路徑名     String value = item.getName() ;     //索引到最後一個反斜線     int start = value.lastIndexOf("\\");     //截取 上傳檔案的 字串名字,加1是 去掉反斜線,     String filename = value.substring(start+1);     //檔案尾碼名    String prefix = filename.substring(filename.lastIndexOf(".") + 1);    CardCenter cardCenter = new CardCenter();    request.setAttribute(name, filename);     //真正寫到磁碟上     //它拋出的異常 用exception 捕捉     //item.write( new File(path,filename) );//第三方提供的     //手動寫的     //OutputStream out = new FileOutputStream(new File(path,filename));     InputStream in = item.getInputStream() ;     List<CardCenter> listFromExcel = (List<CardCenter>)ExelUtil.exportListFromExcel(in, prefix, cardCenter);    this.cardCenterService.excleImport(listFromExcel);    /*int length = 0 ;     byte [] buf = new byte[1024] ;     System.out.println("擷取上傳檔案的總共的容量:"+item.getSize());     // in.read(buf) 每次讀到的資料存放在 buf 數組中     while( (length = in.read(buf) ) != -1)     {      //在 buf 數組中 取出資料 寫到 (輸出資料流)磁碟上      out.write(buf, 0, length);     } */    in.close();     //out.close();    }   } }

3. java代碼:

public class ExelUtil {  //第一列開始 private static int start = 0; //最後一列序號 private static int end =0; public static String getSubString(String str){  return str.substring(0,str.lastIndexOf(".")); } /**   * 方法描述:由Excel檔案的Sheet匯出至List  * @param file  * @param sheetNum  * @return  * @throws IOException  * @author   * @date 2013-3-25 下午10:44:26  * @comment  */ public static List<?> exportListFromExcel(File file, String fileFormat,Object dtoobj)    throws IOException {   return exportListFromExcel(new FileInputStream(file), fileFormat,dtoobj);  }  /**   * 方法描述:由Excel流的Sheet匯出至List   * @param is  * @param extensionName  * @param sheetNum  * @return  * @throws IOException  * @author   * @date 2013-3-25 下午10:44:03  * @comment  */ public static List<?> exportListFromExcel(InputStream is,String fileFormat,Object dtoobj) throws IOException {   Workbook workbook = null;   if (fileFormat.equals(BizConstant.XLS)) {    workbook = new HSSFWorkbook(is);   } else if (fileFormat.equals(BizConstant.XLSX)) {    workbook = new XSSFWorkbook(is);   }   return exportListFromExcel(workbook,dtoobj);  }  /**  * 方法描述:由指定的Sheet匯出至List  * @param workbook  * @param sheetNum  * @return  * @author   * @date 2013-3-25 下午10:43:46  * @comment  */ private static List<Object> exportListFromExcel(Workbook workbook ,Object dtoobj) {  List<Object> list = new ArrayList<Object>();  String[] model = null;  Sheet sheet = workbook.getSheetAt(0);   // 解析公式結果   FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();   int minRowIx = sheet.getFirstRowNum();   int maxRowIx = sheet.getLastRowNum();   for (int rowIx = minRowIx; rowIx <= maxRowIx; rowIx++) {    Object obj = null;   if(rowIx==minRowIx){    start = sheet.getRow(rowIx).getFirstCellNum();    end = sheet.getRow(rowIx).getLastCellNum();   }   Row row = sheet.getRow(rowIx);    StringBuilder sb = new StringBuilder();     for (int i = start; i < end; i++) {     Cell cell = row.getCell(new Integer(i));     CellValue cellValue = evaluator.evaluate(cell);     if (cellValue == null) {      sb.append(BizConstant.SEPARATOR+null);     continue;     }     // 經過公式解析,最後只存在Boolean、Numeric和String三種資料類型,此外就是Error了     // 其餘資料類型,根據官方文檔,完全可以忽略     switch (cellValue.getCellType()) {     case Cell.CELL_TYPE_BOOLEAN:      sb.append(BizConstant.SEPARATOR + cellValue.getBooleanValue());      break;     case Cell.CELL_TYPE_NUMERIC:      // 這裡的日期類型會被轉換為數字類型,需要判別後區分處理      if (DateUtil.isCellDateFormatted(cell)) {       sb.append(BizConstant.SEPARATOR + cell.getDateCellValue());      } else {       sb.append(BizConstant.SEPARATOR + cellValue.getNumberValue());      }      break;     case Cell.CELL_TYPE_STRING:      sb.append(BizConstant.SEPARATOR + cellValue.getStringValue());      break;     case Cell.CELL_TYPE_FORMULA:      break;     case Cell.CELL_TYPE_BLANK:      break;     case Cell.CELL_TYPE_ERROR:      break;     default:      break;     }    }    if(rowIx==minRowIx){    String index = String.valueOf(sb);    String realmodel =index.substring(1, index.length());    model =realmodel.split(",");   }else{    String index = String.valueOf(sb);    String realvalue =index.substring(1, index.length());    String[] value =realvalue.split(",");    //欄位對應    try {     dtoobj =dtoobj.getClass().newInstance();    } catch (InstantiationException e) {     e.printStackTrace();    } catch (IllegalAccessException e) {     e.printStackTrace();    }    obj = reflectUtil(dtoobj,model,value);    list.add(obj);   }  }   return list;  }  /**  * 方法描述:欄位對應賦值  * @param objOne  * @param listName  * @param listVales  * @return  * @author   * @date 2013-3-25 下午10:53:43  * @comment  */ @SuppressWarnings("deprecation") private static Object reflectUtil(Object objOne, String[] listName,   String[] listVales) {  Field[] fields = objOne.getClass().getDeclaredFields();  for (int i = 0; i < fields.length; i++) {   fields[i].setAccessible(true);   for (int j = 0; j < listName.length; j++) {    if (listName[j].equals(fields[i].getName())) {     try {      if (fields[i].getType().getName().equals(java.lang.String.class.getName())) {        // String type       if(listVales[j]!=null){        fields[i].set(objOne, listVales[j]);       }else{        fields[i].set(objOne, "");       }      } else if (fields[i].getType().getName().equals(java.lang.Integer.class.getName())        || fields[i].getType().getName().equals("int")) {        // Integer type        if(listVales[j]!=null){        fields[i].set(objOne, (int)Double.parseDouble(listVales[j]));        }else{        fields[i].set(objOne, -1);        }      }else if(fields[i].getType().getName().equals("Date")){       //date type       if(listVales[j]!=null){        fields[i].set(objOne, Date.parse(listVales[j]));       }       }else if(fields[i].getType().getName().equals("Double")        ||fields[i].getType().getName().equals("float")){       //double       if(listVales[j]!=null){        fields[i].set(objOne, Double.parseDouble(listVales[j]));        }else{        fields[i].set(objOne, 0.0);        }      }     } catch (IllegalArgumentException e) {      e.printStackTrace();     } catch (IllegalAccessException e) {      e.printStackTrace();     }     break;    }   }  }  return objOne; }}

希望本文所述對大家的JSP程式設計有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.