zoukankan      html  css  js  c++  java
  • 基于Spring MVC的Excel文件上传

    JSP

    <a href="javascript:void(0);"  onclick="inPage()" class="pt_btn btn_blue" id="inport" style="100px;">上传文件</a>
    
    <!--导入客户资源弹框 -->
    <div id="mask_box_im_from" class="mask_box" style="overflow:auto;">
      <div class="shade_box">
      </div>
      <div class="mask_main" style="text-align: left;height: 200;">
        <a href="javascript:;" class="mask_colse"></a>
        <div class="mainTitle">
          <span id="mainImTitleSpan" style="margin-left: 36px;"></span>
        </div>
        <div class="rmsCon">
        <form id="file_form" action="${ctx}/inten/importSource" enctype="multipart/form-data" method="post">
          <ul class="content">
            <li>
            &nbsp;&nbsp;&nbsp;&nbsp;<input type="file" name="Mfile" id="file_input"/> 
            </li>
            <div>
              <input type="submit" value="确定" id="import_cust_pt_btn" class="pt_btn btn_blue" style="margin-left: 90px;  80px;"/>
              <a href="javascript:void(0);" onclick="$('.mask_box').fadeOut();" class="btn_grayline ml_18">取消</a>
            </div>
          </ul>
        </form>
        </div>
      </div>
    </div>

    JS

    function inPage(){
      $("#file_form")[0].reset();
      $(".errInfo").html('');
      $("#mainImTitleSpan").html('文件上传');
      $("#mask_box_im_from").fadeIn();
    }
    $("#import_cust_pt_btn").click(function(){
      $("#file_form").submit(
      function() {
        //首先验证文件格式
      var fileName = $('#file_input').val();
      if (fileName === '') {
        alert('请选择文件');
        return false;
      }
      var fileType = (fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length)).toLowerCase();
      if (fileType !== 'xls' && fileType !== 'xlsx') {
        alert('文件格式不正确,excel文件!');
        return false;
      }
    
      $("#file_form").ajaxSubmit({
        dataType : "json",
        success : function(data, textStatus) {
        if (data.list == null){
          $('.mask_box').fadeOut();
          alert('上传文件成功');
        } else {
          $('.mask_box').fadeOut();
          alert(data.list);
        }
        return false;
        }
      });
      return false;
      });
    });

     

    Controller

    import org.apache.poi.hssf.usermodel.HSSFDateUtil;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.DateUtil;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    
    @RequestMapping("/importSource")
    @ResponseBody
    public ResultVo importSource(MultipartFile Mfile,HttpServletRequest request, HttpServletResponse response) throws Exception{
      ResultVo rv=new ResultVo();
      List<String> msgList= new ArrayList();
      //判断文件是否为空
      if(Mfile==null) return rv;
      //获取文件名
      String name=Mfile.getOriginalFilename();
      //进一步判断文件是否为空(即判断其大小是否为0或其名称是否为null)
      long size=Mfile.getSize();
      if(name==null || ("").equals(name) && size==0) return rv;
    
      // 将客户端上传文件存储在服务器本地
      CommonsMultipartFile cf = (CommonsMultipartFile) Mfile; // 把spring文件上传的MultipartFile转换成CommonsMultipartFile类型
      String directory = "D:\fileupload";
      File file = new File(directory);
      // 创建一个目录 (它的路径名由当前 File 对象指定,包括任一必须的父路径。)
      if (!file.exists())
      file.mkdirs();
      // 根据文件名判断文件是2003版本还是2007版本,然后在服务器本地创建相应的文件
      File file1 = null;
      if (isExcel2007(name)) {
        file1 = new File(directory, new Date().getTime() + ".xlsx");
      }else{
        file1 = new File(directory, new Date().getTime() + ".xls");
      }
      // 将上传的文件写入新建的文件中
      try {
        cf.getFileItem().write(file1);
      } catch (Exception e) {
        msgList.add("文件保存本地出现异常");
        rv.setList(msgList);
        return rv;
      }    
    
      //开始处理文件
      try{
        //查出所有启用的未删除的且状态是有效的BD
        List<Staff> bds = UcHelper.getStaffsByLevelCode("L1001003");
        rv = userIntenService.execute(name,file1,rv,bds);
      }catch(Exception e){
        e.printStackTrace();
      }
      return rv;
    }
    View Code
    上传文件
        /**
         * 上传文件
         * @param fileName
         * @param Mfile
         * @return
         * @throws Exception 
         */
        @Override
        public ResultVo execute(String fileName, File file1,ResultVo rv,List<Staff> bds) throws Exception{
            // 初始化输入流
            InputStream is = null;
            List<String> msgList= new ArrayList<String>();
            try {
                // 验证文件名是否合格
                if (!validateExcel(fileName)) {
                    msgList.add(errorMsg);
                    rv.setList(msgList);  
                    return rv;
                }
                // 根据文件名判断文件是2003版本还是2007版本
                boolean isExcel2003 = true;    
                if (isExcel2007(fileName)) {
                    isExcel2003 = false;
                }
                // 根据新建的文件实例化输入流
                is = new FileInputStream(file1);
                // 根据版本选择创建Workbook的方式
                Workbook wb = null;
                try{
                    wb = createWorkbook(is, isExcel2003);
                }catch(Exception e){
                    errorMsg="文件格式不对";
                    msgList.add(errorMsg);
                    rv.setList(msgList);
                    return rv;
                }
                // 读取Excel里面客户的信息
                rv = readExcelValue(wb,rv,bds);
                is.close();
            } finally {
                if (is != null) {
                    try {
                        is.close();
                    } catch (IOException e) {
                        is = null;
                        e.printStackTrace();
                    }
                }
            }
            return rv;
        }

     

     验证EXCEL文件

    /**
    * 验证EXCEL文件
    * 
    * @param filePath
    * @return
    */
    public boolean validateExcel(String filePath) {
      if (filePath == null || !(isExcel2003(filePath) || isExcel2007(filePath))) {
        errorMsg = "文件名不是excel格式";
        return false;
      }
      return true;
    }

     

    是否是2007的excel,返回true是2007 

    /**
    * 是否是2007的excel,返回true是2007
    * @param filePath
    * @return
    */
    public boolean isExcel2007(String filePath) {
      return filePath.matches("^.+\.(?i)(xlsx)$");
    }

     

     根据版本选择创建Workbook的方式

    /**
    * 根据版本选择创建Workbook的方式
    */
    private Workbook createWorkbook(InputStream is, boolean isExcel2003) throws IOException {
      Workbook wb = null;
      // 当excel是2003时
      if (isExcel2003) {
        wb = new HSSFWorkbook(is);
      } else {// 当excel是2007时
        wb = new XSSFWorkbook(is);
      }
      return wb;
    }

     

    /***
         * 这种方法支持03,和07版本的excel读取 但是对于合并的单元格,除了第一行第一列之外,其他部分读取的值为空
         * 
         * @param is
         * @throws ParseException 
         */
        @SuppressWarnings({ "unchecked", "rawtypes"})
        public ResultVo readExcelValue(Workbook wb,ResultVo rv,List<Staff> bds) throws ParseException {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String msg = "";
            List<String> msgList= new ArrayList();
            rv.setSuccess(false);
            
            //获取当前所有的BD的 id 和 姓名
            HashMap bdMap = new HashMap();
            String BDName = "";
            Long BDid = null;
            for (Staff staff : bds) {
                BDid = staff.getId();
                BDName = staff.getName();
                bdMap.put(BDName,BDid);
            }
            
            for (int i = 0, len = wb.getNumberOfSheets(); i < len; i++) {
                Sheet sheet = wb.getSheetAt(i);
                if (sheet == null) {
                    msg = "第" + i + "个sheet为空!";
                    msgList.add(msg);
                    rv.setList(msgList);
                    return rv;
                }
                for (int j = 0; j <= sheet.getLastRowNum(); j++) {
                    Row row = sheet.getRow(j);
                    if (row == null) {
                        msg = "第" + i + "个sheet, 第" + j + "行,存在空白行!";
                        msgList.add(msg);
                        rv.setList(msgList);
                        return rv;
                    }
                    UserInten userInten = new UserInten();
                    userInten.setUserSource("04");// 客户来源-表格导入
                    userInten.setStatus("01");//已分配
                    userInten.setUserStatus("00");//默认值:未注册
                    userInten.setBdDate(sdf.parse(sdf.format(new Date())));//分配时间设置为导入时间
                    // 读取每一个单元格
                    for (int k = 0; k < row.getLastCellNum(); k++) {
                        Cell cell = row.getCell(k);
                        //校验表格字段名称是否为空
                        if(j==0  && cell==null){
                            msg="表格字段名称不可为空";
                            msgList.add(msg);
                            rv.setList(msgList);
                            break;
                        }
                        // 校验联系方式是否为空
                        if (j > 0 && k == 0 && null ==cell) {
                            msg = "第" + i + "个sheet,第" + j
                                    + "行,第" + k + "列,联系方式为空;";
                            msgList.add(msg);
                            rv.setList(msgList);
                            break;
                        }
                        String cellValue = "";
                        if(null != cell){
                            cellValue = getValue(cell);
                        }
                        System.out.println("第" + i + "个sheet,第" + j + "行,第" + k
                                + "列:" + cellValue);
                        // 字段名校验
                        if (j == 0) {
                            msg = valideExcelFormat(i, j, k, cellValue);
                            if (!"".equals(msg)) {
                                msgList.add(msg);
                                rv.setList(msgList);
                                return rv;
                            }
                        }
                        
                        
                        // 校验手机号
                        if (j > 0 && k == 0 && StringUtil.isNotBlank(cellValue)) {
                            //校验手机号格式
                            if (!RegexChk.checkCellPhone(cellValue)) {
                                msg = "第" + i + "个sheet,第" + j
                                        + "行,第" + k + "列,联系方式格式错误;";
                                msgList.add(msg);
                                rv.setList(msgList);
                                break;
                            }
                            //校验手机号是否已存在
                            List<UserInten>list=userIntenDao.selectByMobile(cellValue);
                            if(CollectionUtil.isNotEmpty(list)&&list.size()>0){
                                msg = "第" + i + "个sheet,第" + j
                                        + "行,第" + k + "列,联系方式已存在;";
                                msgList.add(msg);
                                rv.setList(msgList);
                                break;
                            }
                            userInten.setMobile(cellValue);
                        }
    
                        // 校验BD是否存在
                        if (j > 0 && k == 3 && StringUtil.isNotBlank(cellValue)) {
                            if (null == bdMap.get(cellValue)) {
                                msg = "第" + i + "个sheet,第" + j + "行,第" + k
                                        + "列,所属BD姓名错误;";
                                msgList.add(msg);
                                rv.setList(msgList);
                                break;
                            }
                            userInten.setBdId(bdMap.get(cellValue).toString());
                            userInten.setBdName(cellValue);
                        }
                        // 录入数据库
                        if (j > 0 && k == 1 && StringUtil.isNotBlank(cellValue)) {
                            userInten.setCompanyName((cellValue));
                        }
                        if (j > 0 && k == 2 && StringUtil.isNotBlank(cellValue)) {
                            userInten.setName((cellValue));
                        }
                        if (j > 0 && k == row.getLastCellNum() - 1) {
                            userInten.setId(userInten.generateId());
                            userIntenDao.insertSelective(userInten);
                            userIntenDao.updateCIDByUserCID();
                            userIntenDao.updateCIDBycoopCID();
                            userIntenDao.updateUserStatusNotQualify();
                            userIntenDao.updateUserStatusQualified();
                        }
                    }
                    System.out.println("第" + j + "行,处理完毕");
                }
            } 
            if(null == rv.getList()){
                rv.setSuccess(true);
            }
            return rv;
        }
    /**
         * 校验表字段名是否正确
         * @param i
         * @param j
         * @param k
         * @param cellValue
         * @return
         */
        public String valideExcelFormat(int i, int j, int k, String cellValue) {
            String msg = "";
            if (k == 0 && !cellValue.equals("联系方式")) {
                msg = "第" + i + "个sheet,第" + j + "行,第" + k + "列,应为‘联系方式’";
                return msg;
            }
            if (k == 1 && !cellValue.equals("公司名")) {
                msg = "第" + i + "个sheet,第" + j + "行,第" + k + "列,应为‘公司名’";
                return msg;
            }
            if (k == 2 && !cellValue.equals("姓名")) {
                msg = "第" + i + "个sheet,第" + j + "行,第" + k + "列,应为‘姓名’";
                return msg;
            }
            if (k == 3 && !cellValue.equals("所属BD姓名")) {
                msg = "第" + i + "个sheet,第" + j + "行,第" + k + "列,应为‘所属BD姓名’";
                return msg;
            }
            return msg;
        }
        /**
         * 是否是2003的excel,返回true是2003
         * @param filePath
         * @return
         */
        public boolean isExcel2003(String filePath) {
            return filePath.matches("^.+\.(?i)(xls)$");
        }
    
        /**
         * 是否是2007的excel,返回true是2007
         * @param filePath
         * @return
         */
        public boolean isExcel2007(String filePath) {
            return filePath.matches("^.+\.(?i)(xlsx)$");
        }
        /**
         * 读取单元格的值
         * @param cell
         * @return
         */
        private String getValue(Cell cell) {
            String result = "";
            DecimalFormat df = new DecimalFormat("0");
    
            switch (cell.getCellType()) {
            case Cell.CELL_TYPE_BOOLEAN:
                result = cell.getBooleanCellValue() + "";
                break;
            case Cell.CELL_TYPE_STRING:
                result = cell.getStringCellValue();
                break;
            case Cell.CELL_TYPE_FORMULA:
                result = cell.getCellFormula();
                break;
            case Cell.CELL_TYPE_NUMERIC:
                // 可能是普通数字,也可能是日期
                if (HSSFDateUtil.isCellDateFormatted(cell)) {
                    result = DateUtil.getJavaDate(cell.getNumericCellValue())
                            .toString();
                } else {
                    result = df.format(cell.getNumericCellValue()) + "";//将表格中的数字内容以字符串内容输出
                }
                break;
            }
            return result;
        }

     

  • 相关阅读:
    《命运赋》
    CSS3中的 transform (变形)+Transition(转换) = animation(动画)
    c#进阶之泛型
    正则表达式运用
    查询某时间段的统计数据
    很好用的request转换为实体方法还有判断实体所有参数不能为空的方法
    http 协议集合,超级简单
    今天无意发现jquery的一个以前的误导
    IFRAM随内部长宽高变化
    就最近学习MVC4.0的页面用法学到的东西
  • 原文地址:https://www.cnblogs.com/Rage-Leila/p/8945903.html
Copyright © 2011-2022 走看看