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;
        }

     

  • 相关阅读:
    cf B. Sereja and Suffixes
    cf E. Dima and Magic Guitar
    cf D. Dima and Trap Graph
    cf C. Dima and Salad
    最短路径问题(floyd)
    Drainage Ditches(网络流(EK算法))
    图结构练习—BFSDFS—判断可达性(BFS)
    Sorting It All Out(拓扑排序)
    Power Network(最大流(EK算法))
    Labeling Balls(拓扑)
  • 原文地址:https://www.cnblogs.com/Rage-Leila/p/8945903.html
Copyright © 2011-2022 走看看