本文實例講述了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程序設計有所幫助。