1. 程式人生 > >把EXCEL用程式匯入到ORACLE中(SpringMVC+MyBatis)

把EXCEL用程式匯入到ORACLE中(SpringMVC+MyBatis)

前提:專案中需要把EXCEL資料批量匯入oracle中兩張表中。如是用到了poi技術。分別匯入poi-3.11-beta2.jar和poi-ooxml-schemas-3.9.jar這兩個包。EXCEL資料如下

第一步:修改spring框架配置檔案。 springmvc-servlet.xml加上:

 <!-- 檔案上傳 -->
       <bean id="multipartResolver"   class="org.springframework.web.multipart.commons.CommonsMultipartResolver"  p:defaultEncoding="utf-8" /> 

第一步:新增頁面jsp。view_user_batchadd.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<%  
String importMsg="";  
if(request.getSession().getAttribute("msg")!=null){  
importMsg=request.getSession().getAttribute("msg").toString();  
}  
request.getSession().setAttribute("msg", "");  
%>
<head>
    <title>批量匯入使用者</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
   <script type="text/javascript" src="<%=request.getContextPath()%>/view/js/jquery.js"></script>
<body>
    <form action="<%=request.getContextPath()%>/manager/index/batchimport" method="post" enctype="multipart/form-data" name="batchAdd" onsubmit="return check();">
        <div style="margin: 30px;"><input id="excel_file" type="file" name="filename" accept="xls" size="50"/>
        <div><input id="excel_file" type="file" name="filename"  size="50"/>
        <input id="excel_button" type="submit" value="匯入Excel"/></div>
        <font id="importMsg" color="red"><%=importMsg%></font><input type="hidden"/>  
    </form>
</body>
<script type="text/javascript">
    function check() {  
     var excel_file = $("#excel_file").val();  
     if (excel_file == "" || excel_file.length == 0) {  
         alert("請選擇檔案路徑!");  
         return false;  
     } else {  
        return true;  
    }  
}
    
    $(document).ready(function () {  
          var msg="";  
          if($("#importMsg").text()!=null){  
                
              msg=$("#importMsg").text();  
          }  
          if(msg!=""){  
              alert(msg);  
          }  
        });  
</script>
</html>

第三步:填寫控制器:UserLoginController.java

/**
 * 2014-8-30 下午2:52:49
 * TODO  使用者登入 Controller
 *
 */
@Controller
@RequestMapping("/index")
public class UserLoginController  {
    private Log log = LogFactory.getLog(UserLoginController.class);
    
    @Autowired
    private UserLoginService userLoginService;
    
    @Autowired
    private UserInfoService userInfoService;
    
    @RequestMapping(value = "/batchimport", method = RequestMethod.POST)
    public ModelAndView batchimport(@RequestParam("filename") MultipartFile file,HttpServletRequest request,HttpServletResponse response) throws Exception{
        log.info("UserLoginController ..batchimport() start");
        //判斷檔名是否為空
        if(file==null) return null;
        
        //獲取檔名
        String name=file.getOriginalFilename();
        
        //判斷檔案大小、即名稱
        long size=file.getSize();
        if(name==null || ("").equals(name) && size==0) return null;
        
        try {
            //把檔案轉換成位元組流形式
            InputStream in = file.getInputStream();
            int i=userLoginService.batchImport
(name,file);
            int j=userInfoService.batchImport(name,file);
            if(i>0 && j>0){
                 String Msg ="批量匯入EXCEL成功!";
                 request.getSession().setAttribute("msg",Msg);    
            }else{
                 String Msg ="批量匯入EXCEL失敗!";
                 request.getSession().setAttribute("msg",Msg);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    
}

注:我這個Controller的方法裡面處理了兩個介面實現類。我這裡就寫一個

第三步:實現類:UserLoginServiceImpl.java

public int batchImport(String name,MultipartFile file) throws Exception {

        //處理EXCEL
        ReadExcel readExcel=new ReadExcel();
        //獲得解析excel方法
        List<User> userList=readExcel.getExcelInfo(name,file);
        
        //把excel資訊新增到資料庫中
        List<UserLogin> LoginList=new ArrayList<UserLogin>();
        
        for(User user:userList){
            LoginList.add(user.getUserLogin());
        }
        return userLoginDao.saveBatch(LoginList);//新增登入資訊
    }

第四步:處理EXCEL類:ReadExcel.java

public class ReadExcel {
    
      //總行數
      private int totalRows = 0;  
    
      //總條數
      private int totalCells = 0;
      
      //錯誤資訊接收器
      private String errorMsg;
            
      //構造方法
      public ReadExcel(){}
      
      //得到總行數
      public int getTotalRows()  { return totalRows;}
      
      //得到總列數
      public int getTotalCells() {  return totalCells;}
      
      public String getErrorInfo() { return errorMsg; }  
      
    /**
     * 描述:驗證EXCEL檔案
     * @param filePath
     * @return
     */
    public boolean validateExcel(String filePath){
          if (filePath == null || !(WDWUtil.isExcel2003(filePath) || WDWUtil.isExcel2007(filePath))){  
              errorMsg = "檔名不是excel格式";  
              return false;  
          }  
          return true;
    }
      
    
    /**描述 :讀EXCEL檔案
     * @param fielName
     * @return
     */
    public List<User> getExcelInfo(String fileName,MultipartFile Mfile){
        
        //把spring檔案上傳的MultipartFile轉換成File
         CommonsMultipartFile cf= (CommonsMultipartFile)Mfile;
         DiskFileItem fi = (DiskFileItem)cf.getFileItem();
         File file = fi.getStoreLocation();
        
        List<User> userList=new ArrayList<User>();
        InputStream is = null;  
        try{
            //驗證檔名是否合格
            if(!validateExcel(fileName)){
                return null;
            }
            //判斷檔案時2003版本還是2007版本
            boolean isExcel2003 = true;
            if(WDWUtil.isExcel2007(fileName)){
                isExcel2003 = false;  
            }
            is = new FileInputStream(file);
            userList=getExcelInfo(is, isExcel2003);
            is.close();
        }catch(Exception e){
            e.printStackTrace();
        }
        finally{
            if(is !=null)
            {
                try{
                    is.close();
                }catch(IOException e){
                    is = null;    
                    e.printStackTrace();  
                }
            }
        }
        return userList;
    }
    /**
     * 此方法兩個引數InputStream是位元組流。isExcel2003是excel是2003還是2007版本
     * @param is
     * @param isExcel2003
     * @return
     * @throws IOException
     */
    public  List<User> getExcelInfo(InputStream is,boolean isExcel2003){
        
         List<User> userList=null;
         try{
             /** 根據版本選擇建立Workbook的方式 */
             Workbook wb = null;
             //當excel是2003時
             if(isExcel2003){
                 wb = new HSSFWorkbook(is);
             }
             else{
                 wb = new XSSFWorkbook(is);
             }
             userList=readExcelValue(wb);
         }
         catch (IOException e)  {  
             e.printStackTrace();  
         }  
         return userList;
    }
    /**
     * 讀取Excel裡面的資訊
     * @param wb
     * @return
     */
    private List<User> readExcelValue(Workbook wb){
         //得到第一個shell  
         Sheet sheet=wb.getSheetAt(0);
        
         //得到Excel的行數
         this.totalRows=sheet.getPhysicalNumberOfRows();
        
         //得到Excel的列數(前提是有行數)
         if(totalRows>=1 && sheet.getRow(0) != null){
              this.totalCells=sheet.getRow(0).getPhysicalNumberOfCells();
         }
        
         List<User> userList=new ArrayList<User>();
         User user;            //使用者bean(組成:UserInfo+UserLogin)
         UserInfo userInfo; //使用者基本資訊bean
         UserLogin userLogin;    //使用者登入bean
        
         //迴圈Excel行數,從第二行開始。標題不入庫
         for(int r=1;r<totalRows;r++)
         {
             Row row = sheet.getRow(r);
             if (row == null) continue;
            
             user=new User();
             userInfo=new UserInfo();
             userLogin=new UserLogin();
            
             //迴圈Excel的列
             for(int c = 0; c <this.totalCells; c++)
             {    
                 Cell cell = row.getCell(c);
                 if (null != cell)  
                 {
                     //第一列
                     if(c==0){
                         //獲得第一列<使用者名稱>,放到到使用者基本資訊bean中。
                        userInfo.setUserName(cell.getStringCellValue());
                     }
                     //獲得第二列<手機號>,放到到使用者登入bean中。作為登入賬號及密碼
                     else if(c==1){
                         /**
                          * 處理:使用POI讀excel檔案,當遇到特殊格式的字串,比如“13612345678”,等等,
                          * 這樣的本來是一個字串,但是POI在讀的時候總是以數值型識別,由此,這樣的電話號碼讀出來後總是1.3XXX+E4

                          */
                        DecimalFormat df = new DecimalFormat("#");
                        String cellValue=df.format(cell.getNumericCellValue());
                         userLogin.setAccount(cellValue);
                         userLogin.setPwd(cellValue);
                    
                         
                     }
                     //第三列目前不入庫,只是展示即可

                     //第四列<使用者地址>,放到到使用者基本資訊bean中。
                     else if(c==3){
                        userInfo.setCompanyAdd(cell.getStringCellValue());
                     }
                 }
             }
             //新增其他值,入庫時需要
             userLogin.setUserId(Utils.getzId());//存放使用者ID
             userLogin.setInsertTime(Utils.getshortDate());//註冊時間
             userLogin.setUserRole("2"); //預設匯入的使用者都為供應商級別
            
             userInfo.setUserInfoid(Utils.getzId());//存放使用者ID
             userInfo.setUserId(userLogin.getUserId());//基本資訊的使用者ID
            
             user.setUserInfo(userInfo);
             user.setUserLogin(userLogin);
            
             userList.add(user);
         }
         return userList;
    }
}
/**  
 * @描述:工具類
 * 檢驗是否是EXCEL檔案
 */   
class WDWUtil  
{  
     // @描述:是否是2003的excel,返回true是2003
    public static boolean isExcel2003(String filePath)  {  
        return filePath.matches("^.+\\.(?i)(xls)$");  
    }  
 
     //@描述:是否是2007的excel,返回true是2007
    public static boolean isExcel2007(String filePath)  {  
        return filePath.matches("^.+\\.(?i)(xlsx)$");  
    }  
}