论Web开发如何读取上传的xls的内容

这一篇博客应该是接着我之前一篇博客:“ 论前后台如何实现web中文件下载功能”http://blog.csdn.net/qq_27949963/article/details/54286957的。
现在我想要分享的内容是如何实现对web中上传的xls表格里的内容进行读取并批量保存的,而我要实现的功能就是批量保存用户。
首先上传文件。
前台jsp内容:

<form id="uploadXlsForm" action="${ctx}/upLoadxls.do" enctype="multipart/form-data" method="post" target="hiddenFrame">
         上传文件:<input id="userxls" type="file" name="file" >  </form>
         <button type="submit" onclick="addPatchUser()">增加</button>

前台上传后的结果判断,js代码:

function addPatchUser(){
    if($('#userxls').val()){
        $("#uploadXlsForm").ajaxSubmit({
            success:function(data){//图片上传成功时
                console.log(data); 
                if(data==0){
                    art.dialog({icon: 'warning',time:2, content:'文件格式或内容错误,请检查!' });    
                }else{ 
                    art.dialog({icon: 'warning',time:2, content:'批量用户增加成功!' }); 
                    $('#table').jqGrid('setGridParam',{datatype:'json',page:1}).trigger("reloadGrid");
                    $('#pathcDialog').dialog('close');
                }
            },
            error:function(xhr){
                alert('上传失败!');            
            }
        });
    }else{
        art.dialog({icon: 'warning',time:2, content:'请上传批量增加用户文件!' });  
        return false;
    }
}

前台效果图:
这里写图片描述
后台接收文件,有两种方法。
方法一:
首先引入jar:commons-fileupload
或者添加依赖

       <dependency>
            <groupId>tomcat</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.0-5.5.23</version>
        </dependency>

实现代码:
控制器:

/**
     * 接收上传的xls
     * 
     * @param response
     * @param data
     */
    @RequestMapping(value = "/upLoadxls")
    @ResponseBody
    public int upLoadxls(HttpServletResponse response, HttpServletRequest request, ServletRequest req) {
        try {
            DiskFileUpload du = new DiskFileUpload();
            List<?> list = du.parseRequest(request);// 解析请求,得到一个List对象
            return userService.getUserInfoFromUpLoadXml(list);

        } catch (Exception e) {
            LOGGER.error(e.getMessage(), e);
        }
        return 0;
    }

读取xls里面的内容。需要引入jar:poi-ooxml
或者添加依赖:

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.12</version>
        </dependency>

然后开始读取文件内容,如果是文件的话,在利用HSSFWorkbook类转化为WorkBook.
代码如下:

@Override
     @SuppressWarnings("resource")
    public int getUserInfoFromUpLoadXml(List<?> list) {
        try {
        for (int i = 0; i < list.size(); i++) {
            FileItem fi = (FileItem) list.get(i);
            if (!fi.isFormField()) {// 判断取得的是文件,还是字段
                FileInputStream f=(FileInputStream) fi.getInputStream();
                HSSFWorkbook workbook = new  HSSFWorkbook(f);
                   for (int i1 = 0; i1 < workbook.getNumberOfSheets(); i1++) {
                    if (null != workbook.getSheetAt(i1)) {
                     HSSFSheet sheet = workbook.getSheetAt(i1);
                     if(sheet.getLastRowNum()!=0){
                     userDAO.batchAddUser(sheet);
                     return EnumUtil.SUCCESS.getValue();
                     }
                    }
                   }

            }
        }
        } catch (Exception e) {
            LOGGER.error(e.getMessage(), e);
        }
        return EnumUtil.FAILURE.getValue();
    }

方法二:

/**
     * 接收上传的xls
     * @param file
     */
    @RequestMapping(value = "/upLoadxls")
    @ResponseBody
    public void upLoadxls(@RequestParam(value="file") MultipartFile file){
          customerService.batchAddCustomerInfo(file);
    }

service层

@SuppressWarnings("resource")
    @Override
    public void batchAddCustomerInfo(MultipartFile file) {
        try {
            FileInputStream f = (FileInputStream) file.getInputStream();
            HSSFWorkbook workbook = new HSSFWorkbook(f);
            for (int a = 0; a < workbook.getNumberOfSheets(); a++) {
                if (null != workbook.getSheetAt(a)) {
                    HSSFSheet sheet = workbook.getSheetAt(a);
                        handleRowNumValue(sheet);
                }
            }
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw new ActivateRuntimeException(ErrorCodeAUTH.AUTH000005, "新增", "客户");
        }
    }

最后一步就是批量保存xls中的内容,上面操作已经读取了xls文件,下面就是记性一行一行的单元格的内容的获取了。其中需要注意的是
HSSFRow row = sheet.getRow(index);//读取指定行
row.getCell(i).getNumericCellValue()//获取指定行的内容。
getNumericCellValue()为获取的内容都是数据,获取到的是double类型。getCellType()=0
getStringCellValue()获取到的内容是字符串,获取到的是String类型,但是这两个获取之前一定要判断row.getCell(index)指定单元格的内容是都非空,否则的话会报IllegalStateException异常。
下面是我进行用户信息批量插入的方法,这里只选择了几项信息插入。

@Override
    public void batchAddUser(final HSSFSheet sheet) {
        StringBuilder sb = new StringBuilder();
        sb.append("  INSERT INTO ");
        sb.append("  WTPT_USER(USERID,USERNAME,SEX,TELEPHONENO,IDTYPE,IDNUM ");
        sb.append("  VALUES(?,?,?,?,?,?) ");
        dao.getJdbcTemplate().batchUpdate(sb.toString(), new BatchPreparedStatementSetter() {
            @Override
            public void setValues(PreparedStatement ps, int rs) throws SQLException {
                int num = 1;
                int i = 0;
                int a = 0;
                HSSFRow row = sheet.getRow(rs + 2);//加2是因为我的表格里的标题占了两行
                if (row != null) {
                    String userId = new RandomGUID().toString();
                    ps.setString(num++, userId);
                    ps.setString(num++,
                            row.getCell(a++).getCellType() == 0 ? String.valueOf(row.getCell(i).getNumericCellValue())
: row.getCell(i).getStringCellValue());
                    ++i;
                    if(row.getCell(i).getStringCellValue().equals("男")) {
                        ps.setInt(num++, 1);
} else if (row.getCell(i).getStringCellValue().equals("女")) {
                        ps.setInt(num++, 0);
                    } else {
                        ps.setInt(num++, 2);
                    }
                    ++i;
                    String telephone = row.getCell(i) == null ? null: String.valueOf(row.getCell(i).getNumericCellValue());
                    ps.setString(num++, telephone);// 电话
                    ++i;
if (row.getCell(i).getStringCellValue().equals("护照")) {
                        ps.setInt(num++, 2);
} else if (row.getCell(i).getStringCellValue().equals("驾照")) {
                        ps.setInt(num++, 3);
} else {
                        ps.setInt(num++, 1);
        }
                    ++i;
                    ps.setString(num++,
row.getCell(i) == null ? null : String.valueOf(row.getCell(i).getStringCellValue()));// 证件号码
                    ++i;
                    ps.setString(num++, row.getCell(i) == null ? null : row.getCell(i).getStringCellValue());
if (row.getCell(i++).getStringCellValue().equals("是")) {
            SysUser sysUser = new SysUser();
            sysUser.setId(new RandomGUID().toString());
            sysUser.setUserId(userId);
if (row.getCell(i) != null) {
try {                               sysUser.setLoginCode(row.getCell(i).getStringCellValue());
    } catch (IllegalStateException e) {                         sysUser.setLoginCode(String.valueOf(row.getCell(i).getNumericCellValue()));
}
                        } else {                            sysUser.setLoginCode(telephone);
                        }
                        ++i;
                        if (row.getCell(i) != null) {
                            try {
                                sysUser.setPassword(MD5Digest.md5Digest(row.getCell(i).getStringCellValue()));
                            } catch (IllegalStateException e) {
                                sysUser.setPassword(MD5Digest.md5Digest(String.valueOf(row.getCell(i).getNumericCellValue())));
                            }
                        } else {
                            sysUser.setPassword(MD5Digest.md5Digest("1234"));
                        }
                        sysUserDAO.add(sysUser);
                    }
                }
            }

            @Override
            public int getBatchSize() {
                return sheet.getLastRowNum() - 1;
            }
        });
    }

到此就结束了,这样就可以上传一个xls的文件,并且读取内容,进行批量保存了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值