在没有采用异步进行表单提交时,批量导入时,要将form标签的enctype的值设置为multipart/form-data,才可以上传,(就是将文件以流的形式上传)。
后台获取数据必须要使用文件工厂(DiskFileItemFactory,ServletFileUpload)。因为通过request.getParameter拿到的值是null,
在项目中,整个项目都采用的是异步方式,因此要引入一个jquery.form.min.js的文件,去做
表单的提交,后台采用的是SpringMVC的文件上传,以下是代码实现:前台页面是一个bootstrap的一个模态框:
是主页面里面的代码
从页面
批量导入
这里大家看到会有些蒙,说为什么不把两部分放到一起呢,我来说明,下面的这部分我走了一个后台,然后跳转到的一个页面,然后把这个页面通过js的函数放入的id属性值为printDepartInputBatchForm的那个div里面
下面是js函数
采用$("#inputForm").ajaxSubmit({})来实现,其中#后面的值是form表单的id属性值
//批量导入
//跳转页面
function inputBatch(){
loadingShow();
$.post("${contextPath}/后台地址",//跳转模态框
function(data){
//alert(data);
$("#printDepartInputBatchForm").html(data);
loadingHide();
$("#modal-input").modal("toggle");
});
}
//导入
function inputBatchConfirm(){
$.messager.model = {
ok: {
text : "确定",
classed : "btn-default"
},
cancel: {
text : "取消",
classed : "btn-error"
}
}
$.messager.confirm("提示信息", "确认导入?", function() {
var excelInput=$('#excelInput').val();
var templateFileName="print.xlsx";
if (excelInput== '') {
$.messager.alert("提示信息","导入文件不能为空!");
return;
}
var suffix=excelInput.substr(excelInput.lastIndexOf(".") + 1);
if("xlsx"!= suffix) {
$.messager.alert("提示信息","导入文件类型必须为excel!");
return;
}
if(excelInput!=templateFileName){
$.messager.alert("提示信息","请下载模板文件,进行数据录入!");
return;
}
loadingShow();
$('#inputForm').ajaxSubmit({
type: "post",
dataType : "json",
enctype :"multipart/form-data",
url : "${contextPath}/sys/printdepart/inputBatchPrintDepart",//跳转后台
success : function(data) {
//返回1时表示导入成功
if(data.result=='1'){
$.messager.alert("提示信息","导入成功!");
loadingHide();
$("#modal-input").modal('hide');
$("#grid-table").trigger("reloadGrid");
}else if(data.result=="2"){
$.messager.alert("提示信息","Excel工作表中无数据!");
loadingHide();
}else if(data.result=="3"){
$.messager.alert("提示信息","机构代码已存在,请检查第"+data.index+"行机构代码");
loadingHide();
}else if(data.result=="4"){
$.messager.alert("提示信息","机构代码不能为空,请检查第"+data.index+"行机构代码");
loadingHide();
}else if(data.result=="5"){
$.messager.alert("提示信息","机构名称不能为空,请检查第"+data.index+"行机构名称");
loadingHide();
}else if(data.result=="11"){
$.messager.alert("提示信息","机构代码格式不正确,请检查第"+data.index+"行机构代码,至少输入8位数字字符");
loadingHide();
}else if(data.result=="6"){
$.messager.alert("提示信息","所在城市不能为空,请检查第"+data.index+"行所在城市");
loadingHide();
}else if(data.result=="12"){
$.messager.alert("提示信息","所在城市格式不正确,请检查第"+data.index+"行所在城市,输入6位数字字符");
loadingHide();
}else if(data.result=="10"){
$.messager.alert("提示信息","所在城市代码不存在,请检查第"+data.index+"行所在城市代码,填写正确的城市代码请到模版文件city工作表中查找");
loadingHide();
}else if(data.result=="7"){
$.messager.alert("提示信息","详细地址不能为空,请检查第"+data.index+"行详细地址");
loadingHide();
}else if(data.result=="8"){
$.messager.alert("提示信息","联系人员不能为空,请检查第"+data.index+"行联系人员");
loadingHide();
}else if(data.result=="9"){
$.messager.alert("提示信息","联系电话不能为空,请检查第"+data.index+"行联系电话");
loadingHide();
}else if(data.result=="13"){
$.messager.alert("提示信息","联系电话格式不正确,请检查第"+data.index+"行联系电话,输入正确的联系电话");
loadingHide();
}else{
$.messager.alert("提示信息","导入失败!");
loadingHide();
}
}
});
});
return false;
}
js函数里面的代码注释写的还算详细,详细大家都能看的明白。
后台代码:
导入时要引入poi的jar包和文件上传的jar包,SpringMVC的文件上传,(MultipartFile) ,其中的excelInput是前台文件域的name属性的值
//批量导入跳转页面
@RequestMapping(value="/preInputBatch" ,method={RequestMethod.GET ,RequestMethod.POST})
public ModelAndView preInputBatch(HttpServletRequest request , HttpServletResponse response) throws Exception{
logger.info("批量导入页面跳转");
PrintDepart printDepart=new PrintDepart();
return new ModelAndView("back/printdepart/inputbatchprintdepart" ,"printDepart" ,printDepart);
}
//批量导入
@RequestMapping(value="/inputBatchPrintDepart" ,method={RequestMethod.GET ,RequestMethod.POST})
@ResponseBody
public Map inputBatchPrintDepart(MultipartFile excelInput,HttpServletRequest request , HttpServletResponse response) throws Exception{
logger.info("批量导入");
Map map=new HashMap();
List printList=new ArrayList();
InputStream is=null;
try {
is=excelInput.getInputStream();//输入流指向选择的文件
XSSFWorkbook workBook=new XSSFWorkbook(is);
XSSFSheet sheet=workBook.getSheetAt(0);
if(sheet.getLastRowNum()==0){
map.put("result", "2");//表中无数据
return map;
}
Integer row=0;
Integer index=0;
for(int i = 0; i < sheet.getPhysicalNumberOfRows() - 2; i++){// 取到工作表所有行数-2是代表没有数据的行数
PrintDepart print=new PrintDepart();
row=i+3;
index=i+2;
//检查输入的数据是否合法
if(sheet.getRow(index).getCell(0)==null
||"".equals(sheet.getRow(index).getCell(0))||
sheet.getRow(index).getCell(0).getCellType()==XSSFCell.CELL_TYPE_BLANK){//判断单元格是否为空
map.put("result", "4");//机构代码为空
map.put("index", row);
return map;
}
if(null!=printDepartService.getByProerties("departCode",sheet.getRow(index).getCell(0).getStringCellValue())){
map.put("result", "3");//存在机构代码
map.put("index", row);
return map;
}
Boolean flag=Pattern.matches("^\\d{8,}$", sheet.getRow(index).getCell(0).getStringCellValue());
if(flag==false){
map.put("result", "11");//机构代码不合法
map.put("index", row);
return map;
}
if(sheet.getRow(index).getCell(1)==null
||"".equals(sheet.getRow(index).getCell(1))||
sheet.getRow(index).getCell(1).getCellType()==XSSFCell.CELL_TYPE_BLANK){
map.put("result", "5");//机构名称为空
map.put("index", row);
return map;
}
if(sheet.getRow(index).getCell(2)==null
||"".equals(sheet.getRow(index).getCell(2))||
sheet.getRow(index).getCell(2).getCellType()==XSSFCell.CELL_TYPE_BLANK){
map.put("result", "6");//所在城市为空
map.put("index", row);
return map;
}
Boolean fa=Pattern.matches("^\\d{6}$", sheet.getRow(index).getCell(2).getStringCellValue());
if(fa==false){
map.put("result", "12");//所在城市不合法
map.put("index", row);
return map;
}
if(null==areaService.getByProerties(new String[]{"areaCode","areaGrade"},
new Object[]{sheet.getRow(index).getCell(2).getStringCellValue(),"2"})){
map.put("result", "10");//所在城市代码要填写area表中存在的
map.put("index", row);
return map;
}
if(sheet.getRow(index).getCell(3)==null
||"".equals(sheet.getRow(index).getCell(3))||
sheet.getRow(index).getCell(3).getCellType()==XSSFCell.CELL_TYPE_BLANK){
map.put("result", "7");//详细地址为空
map.put("index", row);
return map;
}
if(sheet.getRow(index).getCell(4)==null
||"".equals(sheet.getRow(index).getCell(4))||
sheet.getRow(index).getCell(4).getCellType()==XSSFCell.CELL_TYPE_BLANK){
map.put("result", "8");//联系人为空
map.put("index", row);
return map;
}
if(sheet.getRow(index).getCell(5)==null
||"".equals(sheet.getRow(index).getCell(5))||
sheet.getRow(index).getCell(5).getCellType()==XSSFCell.CELL_TYPE_BLANK){
map.put("result", "9");//联系电话为空
map.put("index", row);
return map;
}
Boolean fl=Pattern.matches("1\\d{10}", sheet.getRow(index).getCell(5).getStringCellValue());
if(fl==false){
map.put("result", "13");//联系电话不合法
map.put("index", row);
return map;
}
print.setDepartCode(sheet.getRow(index).getCell(0).getStringCellValue());
print.setDepartName(sheet.getRow(index).getCell(1).getStringCellValue());
print.setCity(sheet.getRow(index).getCell(2).getStringCellValue());
print.setAddress(sheet.getRow(index).getCell(3).getStringCellValue());
print.setLinkMan(sheet.getRow(index).getCell(4).getStringCellValue());
print.setLinkTel(sheet.getRow(index).getCell(5).getStringCellValue());
print.setCreateTime(new Date());
print.setStatus("1");
printList.add(print);
}
for(PrintDepart entityPrint : printList){//将对象循环添加到数据库
printDepartService.persist(entityPrint);
}
map.put("result", "1");
} catch (Exception e) {
e.printStackTrace();
map.put("result", "0");
}
is.close();
return map;
}