主要解决excel表格导入问题:
使用的是Poi的Jar包,所以要先导入进来。
然后是代码部分
/**
* excel文件导入
*/
public String execlImp(){
try {
//判断是否通过校验
boolean flag = true;
//打印的结果
String result = "";
//获取文件路径
String fileKey = getRequest().getParameter("fileKey");
String url = "";
SysFile sysFile = sysFileService.getFileByKey(fileKey);
url=sysFile.getFileSavePath();
//获取文件名
String name = sysFile.getFileName().substring(sysFile.getFileName().lastIndexOf(".")+1);
//转成流
InputStream stream = new FileInputStream(url);
//创建excel文件
Workbook book = createWorkBook(name, stream);
//获取excel中具体的表 参数0,1,2表示excel左下方的表1,表2,表3
Sheet sheet = book.getSheetAt(0);
//用来校验重复数据的列表
List carNum = new ArrayList();
//遍历每行数据(i=1,从第二行开始)
for (int i = 1;i<=sheet.getLastRowNum();i++) {
//row表示一行
Row row = sheet.getRow(i);
//写了个方法,专门做校验
int falg = isflag(row,carNum);
//校验结束后将第一行,第一列的数据放入做重复校验的数组
carNum.add(row.getCell(0).toString());
//这是对校验结果做出的反馈
if(falg == -99) {
flag = false;
result = "导入的文件格式不正确";
getRequest().getSession().setAttribute(Constants.HINT, Constants.HINT_ERR);
} else {
if(falg!=0){
flag = false;
switch (falg) {
case 99:
result += "第"+(i+1)+"为空
";
getRequest().getSession().setAttribute(Constants.HINT, Constants.HINT_WARNING);
continue;
case 1:
result += "第"+(i+1)+"行车号为空
";
getRequest().getSession().setAttribute(Constants.HINT, Constants.HINT_WARNING);
continue;
case 2:
result += "第"+(i+1)+"行车号表中重复
";
getRequest().getSession().setAttribute(Constants.HINT, Constants.HINT_WARNING);
continue;
case 3:
result += "第"+(i+1)+"行车号长度不正确
";
getRequest().getSession().setAttribute(Constants.HINT, Constants.HINT_WARNING);
continue;
case -4:
result += "第"+(i+1)+"行车号只能为数字
";
getRequest().getSession().setAttribute(Constants.HINT, Constants.HINT_WARNING);
continue;
case 4:
result += "第"+(i+1)+"行车号数据库中重复
";
getRequest().getSession().setAttribute(Constants.HINT, Constants.HINT_WARNING);
continue;
}
}
}
}
//如果校验成功,那么我们再一条条将数据插入数据库
if(flag){
for (int i = 1;i<=sheet.getLastRowNum();i++) {
System.out.println(sheet.getLastRowNum());
Row row = sheet.getRow(i);
OilAdvanceTrain oilAdvanceTrain = new OilAdvanceTrain();
oilAdvanceTrain.setActualTrainKey("null");
oilAdvanceTrain.setCreatePerson(user.getUserName());
oilAdvanceTrain.setCreateTime(TimeHelper.getCurrentTime());
oilAdvanceTrain.setIsFlag(Constants.IS_FLAG);
oilAdvanceTrain.setTrainNo(row.getCell(0).toString());
if (row.getLastCellNum()>1) {
oilAdvanceTrain.setTrainType(row.getCell(1).toString());
}
oilAdvanceTrainService.saveOilAdvanceTrain(oilAdvanceTrain);
}
result = "导入成功!";
getRequest().getSession().setAttribute(Constants.HINT, Constants.HINT_RIGHT);
}
getSession().setAttribute(Constants.SESSION_OP_RESULT_MESS, result);
} catch (Exception e) {
// 上抛异常至页面, 用户界面提示
e.printStackTrace();
}
return "success";
}
public int isflag(Row row,List carnum){
int code = 0; // 默认值 0 , 校验成功则返回默认值 0
// 表格格式不正确,表格不完整
/* try {
* //此处有坑 ,row.row.getLastCellNum() 是获取该列的最后一行的位置,如果有些数据为空,或者在不知道情况下写入为空数据,会造成数据错乱,所以一定谨慎使用;
if (row.getLastCellNum() != 2) {
System.out.println(row.getLastCellNum());
code = -99; // 表格格式不正确
return code;
}
} catch (Exception e) {
code = -99; // 表格格式不正确
return code;
}*/
// 空记录 即:cells 为空 !
//关于row.getCell的空指针异常,如果excel中少了一格数据,而我们getCell那个数据时会生成空指针
/* if ((row.getCell(0).toString() == null || row.getCell(0).toString()
.equals(""))){
code = 99; // 此条记录为空
return code;
}*/
if ((row.getCell(0) == null
|| row.getCell(0).toString().equals("")
|| !Pattern.matches("^[\\u0391-\\uFFE5\\w\\s\\·]+", row.getCell(0).toString().trim()))) {
code = 1; // 错误提示 :A列不得为空
return code;
}
if(carnum.contains(row.getCell(0).toString())){
code = 2; // 错误提示 :重复校验
return code;
}
if (row.getCell(0).toString().length() != 7) {
code = 3; //车牌号长度不正确
return code;
}
if (!Pattern.matches("^[0-9]+", row.getCell(0).toString().trim())) {
code = -4;//车号只能为数字
return code;
}
if (oilAdvanceTrainService.getOilAdvanceTrainByTrainNo(row.getCell(0).toString())){
code = 4; //数据库中存在该车号
return code;
}
return code;
}