这一篇博客应该是接着我之前一篇博客:“ 论前后台如何实现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的文件,并且读取内容,进行批量保存了。