基于Spring MVC的Excel文件上传

JSP

<a href="javascript:void(0);"  onclick="inPage()" class="pt_btn btn_blue" id="inport" style="width: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; width: 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;
    }

 

 

转载于:https://www.cnblogs.com/Rage-Leila/p/8945903.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值