1. 程式人生 > >POI實現excel匯入

POI實現excel匯入

  • 在很多地方,我們需要將資料多條資料新增到資料庫,那麼這個時候,如果實現了excel資料匯入到資料庫,我們的工作將會輕鬆很多,接下來我就給大家提供一個簡單的POI匯入excel資料到資料庫,並且判斷匯入的資料是否存在於資料庫,存在匯入失敗,否則,成功;
    上傳檔案的視窗設計
  • 上傳之前先對資料進行處理
$('#btnSub').click(function(){
    //會計科目這個是easyuitree設計,所以獲得當前的id寫法不同;
    var kjkm =$('#newkjkmTree').tree('getSelected');
    if(kjkm){
        kjkm = $('#newkjkmTree'
).tree('getSelected').id; }else{ alert("請選擇會計科目"); return false; } var unit = $('#getUnit').val(); if(unit ==""){ alert("請選擇計量單位"); return false; } var fileDir = $("#uploadExcel").val(); var suffix = fileDir.substr(fileDir.lastIndexOf("."
)); if("" == fileDir){ alert("選擇需要匯入的Excel檔案!"); return false; } if( ".xlsx" != suffix ){ alert("選擇.xlsx格式的檔案匯入!"); return false; } $("#importForm").submit(); })
  • 驗證檔案並上傳後,這時候需要後臺對接收到是excel資料進行處理:
public class ImportExcelUtil
{
private final static String excel2003L =".xls"; //2003- 版本的excel private final static String excel2007U =".xlsx"; //2007+ 版本的excel /** * 描述:獲取IO流中的資料,組裝成List<List<Object>>物件 * @param in,fileName * @return * @throws IOException */ public List<List<Object>> getBankListByExcel(InputStream in,String fileName) throws Exception{ List<List<Object>> list = null; //建立Excel工作薄 Workbook work = this.getWorkbook(in,fileName); if(null == work){ throw new Exception("建立Excel工作薄為空!"); } Sheet sheet = null; Row row = null; Cell cell = null; list = new ArrayList<List<Object>>(); //遍歷Excel中所有的sheet for (int i = 0; i < work.getNumberOfSheets(); i++) { sheet = work.getSheetAt(i); if(sheet==null){continue;} //遍歷當前sheet中的所有行 for (int j = sheet.getFirstRowNum(); j < sheet.getLastRowNum(); j++) { row = sheet.getRow(j); if(row==null||row.getFirstCellNum()==j){continue;} //遍歷所有的列 List<Object> li = new ArrayList<Object>(); for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) { cell = row.getCell(y); li.add(this.getCellValue(cell)); } list.add(li); } } return list; } /** * 描述:根據檔案字尾,自適應上傳檔案的版本 * @param inStr,fileName * @return * @throws Exception */ public Workbook getWorkbook(InputStream inStr,String fileName) throws Exception{ Workbook wb = null; String fileType = fileName.substring(fileName.lastIndexOf(".")); if(excel2003L.equals(fileType)){ wb = new HSSFWorkbook(inStr); //2003- }else if(excel2007U.equals(fileType)){ wb = new XSSFWorkbook(inStr); //2007+ }else{ throw new Exception("解析的檔案格式有誤!"); } return wb; } /** * 描述:對錶格中數值進行格式化 * @param cell * @return */ @SuppressWarnings("unused") public Object getCellValue(Cell cell){ String strCell = ""; switch (cell.getCellType()) { case XSSFCell.CELL_TYPE_STRING: strCell = cell.getStringCellValue(); break; case XSSFCell.CELL_TYPE_NUMERIC: if (XSSFDateUtil.isCellDateFormatted(cell)) { // 如果是date型別則 ,獲取該cell的date值 strCell = new SimpleDateFormat("yyyy-MM-dd").format(XSSFDateUtil.getJavaDate(cell.getNumericCellValue())); } else { // 純數字 strCell = String.valueOf(cell.getNumericCellValue()); DecimalFormat df = new DecimalFormat("#.#########"); strCell=df.format(Double.valueOf(strCell)); } break; case XSSFCell.CELL_TYPE_BOOLEAN: strCell = String.valueOf(cell.getBooleanCellValue()); break; case XSSFCell.CELL_TYPE_BLANK: strCell = ""; break; case XSSFCell.CELL_TYPE_FORMULA: strCell = String.valueOf(cell.getNumericCellValue()); DecimalFormat df = new DecimalFormat("#.#########"); strCell=df.format(Double.valueOf(strCell)); break; default: strCell = ""; break; } if (strCell.equals("") || strCell == null) { return ""; } if (cell == null) { return ""; } return strCell; } public static class XSSFDateUtil extends DateUtil { protected static int absoluteDay(Calendar cal, boolean use1904windowing) { return DateUtil.absoluteDay(cal, use1904windowing); } } }
  • 以上就是處理excel資料的工具類,接下來我們需要在控制層對資料進行處理:
@RequestMapping("importEcxel.do")
    public ModelAndView importExcel(HttpServletRequest request,HttpServletResponse response,HttpSession session,
            String kjkm,Model model,Integer unit) throws Exception{
        MultipartHttpServletRequest multRequest = (MultipartHttpServletRequest) request;    
         MultipartFile file = multRequest.getFile("uploadExcel");  //獲得上傳的excel檔案;
        if(file.isEmpty()){  
            throw new Exception("檔案不存在!");  
        }  
        InputStream in =null;  //建立輸入流;
        List<List<Object>> listob = null;  
        in = file.getInputStream();  
        listob = new ImportExcelUtil().getBankListByExcel(in,file.getOriginalFilename());  //這個時候將獲得的excel檔案進行處理;
        in.close();  
        List<WyFeePlanPO> list = new ArrayList<WyFeePlanPO>();
        String kjkmName = planService.findWyFeePlanPOByKJKM(kjkm);//這裡是將獲得的中文描述轉化為資料庫中對應的字串;
        int number = 0;
         //此處開始對資料進行遍歷,並新增的list中;
        for (int i = 0; i < listob.size(); i++) {
                List<Object> lo = listob.get(i);  
                WyFeePlanPO planPo = new WyFeePlanPO();
                if (kjkmName!=null) {
                    if (lo.get(0).equals("")) {
                        break;//當獲得的資料第一格為空的時候跳出當前迴圈,結束遍歷;
                    } else {
                        planPo.setOwner_name(String.valueOf(lo.get(0)));
                    }
                    if (!lo.get(1).equals("")) {
                        if(StringUtil.isNotEmpty(String.valueOf(lo.get(1)))){
                            planPo.setResidence_code(RoomCodeDATAUtils.getInRoomNum(String.valueOf(lo.get(1)))); //此處對資源號進行處理,根據各自上傳的excel欄位需求來進行遍歷;
                        }
                    }else {
                        planPo.setResidence_code("");
                    }
                    if (!lo.get(2).equals("")) {
                        String startUnit = String.valueOf(lo.get(2));
                        int start = Integer.parseInt(startUnit);
                        planPo.setStart_dosage(start);
                    } else {
                        planPo.setStart_dosage(0);
                    }
                    if (!lo.get(3).equals("")) {
                        String endUnit = String.valueOf(lo.get(3));
                        int end = Integer.parseInt(endUnit);
                        planPo.setEnd_dosage(end);
                    } else {
                        planPo.setEnd_dosage(0);
                    }
                    if (!lo.get(4).equals("")) {
                        String sjyl = String.valueOf(lo.get(4));
                        int SJ = Integer.parseInt(sjyl);
                        planPo.setActual_dosage(SJ);
                    } else {
                        planPo.setActual_dosage(0);
                    }
                    if (!lo.get(5).equals("")) {
                        planPo.setPay_company(String.valueOf(lo.get(5)));
                    }else {
                        planPo.setPay_company("");
                    }

                    Date recordDate = null;
                    if (!lo.get(6).equals("")) {
                        SimpleDateFormat sdf = new SimpleDateFormat(
                                "yyyy-MM-dd");
                        String recordTime = String.valueOf(lo.get(6));
                        recordDate = sdf.parse(recordTime);
                        planPo.setRecordTime(recordDate);
                    }else {
                        planPo.setRecordTime(new Date());
                    }
                    if (!lo.get(7).equals("")) {
                        String write_persion = String.valueOf(lo.get(7));
                        planPo.setWrite_persion(write_persion);
                    }else {
                        planPo.setWrite_persion("");
                    }
                    planPo.setKjkm(kjkm);
                    planPo.setUnit(unit);
                    String residence_code = String.valueOf(lo.get(1));
                    costDetailService.calculateWyFeePlanPO(planPo);//此處是呼叫方法計算費用;需求不同,則不需要;
                    if(StringUtil.isNotEmpty(residence_code)){
                        planPo.setResidence_code(RoomCodeDATAUtils.getInRoomNum(residence_code));
                    }
                    int residenceCodeCount = planService.findCodeCountByCodition(planPo.getResidence_code());//此處是查詢業主列表中是否存在該房號;根據需求做處理;
                    if (residenceCodeCount>0) {
                        String owner_name = planPo.getOwner_name();
                        int sjyl = planPo.getActual_dosage();
                        unit = planPo.getUnit();
                        Double collection_fee = planPo.getAmount();
                        String pay_company = planPo.getPay_company();
                        int count = planService.findPlanCountByCodition(
                                owner_name, sjyl, collection_fee,
                                pay_company, residence_code, recordDate);
                        if (count > 0) {
                            planPo.setState(1);
                            planPo.setKjkm_name(kjkmName);
                            planPo.setUnit(unit);
                        } else {
                            planPo.setState(0);
                            planPo.setKjkm_name(kjkmName);
                            planPo.setUnit(unit);
                        }
                    }else {
                        planPo.setState(1);
                        planPo.setRemark("資源號不存在,請重新輸入");
                    }
                    number +=1;
                }
                        list.add(planPo);
                }
        Map<String, Object> map = new HashMap<String, Object>();
        User user = currentUser(request);
        Integer role = user.getRoleId();
        WyFeePlanPO planPonum = new WyFeePlanPO();
        planPonum.setNumber(number);
        session.setAttribute("list", list);
        model.addAttribute("planPonum", planPonum);
        map.put("role",role);
        return new ModelAndView( "crm/wyfee/wyfeeplancheck",map);
    }//將資料處理好之後,將放到新的頁面進行預覽;
  • 這時候我們將處理後的資料拿到顯示到頁面上;
@RequestMapping("importShow.do")
    public void importShow(HttpServletRequest request,HttpServletResponse response) throws Exception{
            @SuppressWarnings("unchecked")
            List<WyFeePlanPO> list = (List<WyFeePlanPO>) request.getSession().getAttribute("list");
            List<WyFeePlanVO> wyFeePlan = planService.showPlanPOsVo(list); 
            ResponseUtil.responseJson(response, wyFeePlan);
    }

這裡寫圖片描述

  • 圖書已經看到了資料的處理,接下來就是需要將其匯入到資料庫了
@RequestMapping("importToServer.do")
    public void importToServer(HttpServletRequest request,HttpServletResponse response,Model model){
        @SuppressWarnings("unchecked")
        List<WyFeePlanPO> list = (List<WyFeePlanPO>) request.getSession().getAttribute("list");
        String userPin =  cookieUtil.getCookieValueByName(request, CookieConstants.SYS_USER_PIN);
        int amount = 0;
        for (WyFeePlanPO wyFeePlanPO : list) {
                if (wyFeePlanPO.getRemark()!=null) {
                    wyFeePlanPO.setState(1);
                    wyFeePlanPO.setRemark(wyFeePlanPO.getRemark());
                }else {
                    int count = planService.findPlanCountByCodition(wyFeePlanPO.getOwner_name(), wyFeePlanPO.getActual_dosage(),
                            wyFeePlanPO.getAmount(),wyFeePlanPO.getPay_company(),wyFeePlanPO.getResidence_code(),
                            wyFeePlanPO.getRecordTime());
//此處又是對資料進行查重處理;
                    if (count > 0) {
                        wyFeePlanPO.setState(1);
                        String remark = "匯入失敗,資料已存在";
                        wyFeePlanPO.setRemark(remark);
                    } else {
                        String remark = "匯入成功";
                        wyFeePlanPO.setState(0);
                        wyFeePlanPO.setRemark(remark);
                        //獲取訂單編號
                        SnowflakeIdWorker snowfalake=SnowflakeIdWorker.getInstance();
                        long order_no=snowfalake.nextId();
                        wyFeePlanPO.setOrder_no(String.valueOf(order_no));
                        wyFeePlanPO.setCreateBy(userPin);
                        wyFeePlanPO.setModifyBy(userPin);
                        planService.handlewyfeePlanPo(wyFeePlanPO);
                        amount+=1;//這裡是對匯入成功的資料做一個記錄數
                    }
                }
        }
        WyFeePlanPO wyFeePlanPO = new WyFeePlanPO();
        wyFeePlanPO.setNumber(amount);
        ResponseUtil.responseJson(response, wyFeePlanPO);
    }
  • 那麼到以上部分,POI對excel的匯入基本上就完成了,此處又涉及到多資料判斷的sql的書寫格式也一併附上:
<select id="findPlanCountByCodition" parameterType="com.bckj.crm.wyfee.domain.po.WyFeePlanPO"
        resultType="java.lang.Integer">
        select count(*) from crm_wy_fee_plan where owner_name=#{0} and actual_dosage=#{1} and
        amount=#{2}
        and pay_company=#{3} and residence_code=#{4} and recordTime=#{5}

    </select>
  • 以上就是對POI匯入excel的全部描述,不管是匯入還是匯出,我都做了詳細的程式碼演示,希望對大家有所幫助;當然藥品那個POI做匯入匯出還是需要這些jar包:poi-3.9.jar ; poi-ooxml-3.9.jar ; poi-ooxml-schemas-3.9.jar ; xmlbeans-2.6.0jar ; dom4j-1.6.1jar ;具體哪些是匯入需要的 ,哪些的匯出需要的,記不清了,那就都一起把,反正都需要用。