此方法导入的是制定文件内容的方式,内容不符返回提示,导入失败
1.工具类:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.Logger;
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;
//读取文件方法,判断是否是Excel文件格式
public class ExcelUploadUtils {
// 日志
private final static Logger logger = Logger.getLogger(ExcelUploadUtils.class);
public static Workbook isExcelFile(String realPath, String filename) {
Workbook workbook = null;
try {
String ext = filename.substring(filename.lastIndexOf(".") + 1);// 获取文件扩展名
System.out.println("文件扩展名为:" + ext);
File file = new File(realPath+"/"+filename);
FileInputStream fis = new FileInputStream(file);// 使用文件输入流
if ("xls".equalsIgnoreCase(ext)) {
workbook = new HSSFWorkbook(fis);
fis.close();
logger.debug("系统读取到.xls格式文件");
} else if ("xlsx".equalsIgnoreCase(ext)) {
workbook = new HSSFWorkbook(fis);
fis.close();
logger.debug("系统读取到.xlsx格式文件");
} else {
fis.close();
logger.error("文件不是Excel的格式,返回null");
workbook = null;
}
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
logger.error("文件没有找到", e);
} catch (IOException e) {
e.printStackTrace();
}
return workbook;
}
//读取文件标题头
public static Map<Integer, Map<Integer, String>> readExcelTitle(Workbook workbook) {
Sheet sheet;
Row row;
if (workbook == null) {
logger.debug("Workbook对象为空!");
}
sheet = workbook.getSheetAt(0);
row = sheet.getRow(0);
int cells = row.getPhysicalNumberOfCells();// 标题总列数
System.out.println("标题总列数:" + cells);
String[] titles = new String[cells];
for (int i = 0; i < cells; i++) {
titles[i] = row.getCell(i).getStringCellValue();// 获取所有标题封装一个标题数组
}
// return titles;
System.out.println("获取标题头方法完毕,调用读取文件内容方法");
Map<Integer, Map<Integer, String>> content = readExcelContent( workbook, sheet, row);
return content;
}
//获取文件内容方法
public static Map<Integer, Map<Integer, String>> readExcelContent(Workbook workbook, Sheet sheet, Row row) {
Map<Integer, Map<Integer, String>> content = new HashMap<Integer, Map<Integer, String>>();
sheet = workbook.getSheetAt(0);// 文件第一页
int RowNum = sheet.getLastRowNum();// 总行数
System.out.println("总行数:"+RowNum);
row = sheet.getRow(0);// 第一行
int ColNum = row.getPhysicalNumberOfCells();// 总列数
for (int i = 1; i <= RowNum-2; i++) {
row = sheet.getRow(i); // 获取每行
int j = 0;
Map<Integer, String> cellValue = new HashMap<Integer, String>();// 此map装一行的所有单元格内容
while (j < ColNum) {
if (row != null) {
Object obj = getCellFormatValue(row.getCell(j));// 每一个单元格内容
if (obj != null) {
// 内容不为空,添加到集合中
cellValue.put(j, obj.toString());
} else {
// 内容为空,添加一个""
cellValue.put(j, "");
}
j++;
} else {
break;
}
content.put(i, cellValue);
}
}
return content;
}
//获取单元格内容方法
private static Object getCellFormatValue(Cell cell) {
Object cellvalue = null;
if (cell != null) {
int cellType = cell.getCellType();
switch (cellType) {
case Cell.CELL_TYPE_STRING:// 内容为字符串
cellvalue = cell.getRichStringCellValue().getString();
break;
case Cell.CELL_TYPE_BLANK:// 内容为空
cellvalue = "";
break;
case Cell.CELL_TYPE_NUMERIC:// 内容数字
if (DateUtil.isCellDateFormatted(cell)) {
// 是否为date类型,转换格式
Date date = cell.getDateCellValue();
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
cellvalue = format.format(date);
} else {
if(cell!=null ){
//设置单元格格式为字符串
cell.setCellType(Cell.CELL_TYPE_STRING);
}
//纯数字
cellvalue = cell.getStringCellValue();
}
break;
}
} else {
cellvalue = "";
}
return cellvalue;
}
}
2.controller类:
@ResponseBody
@RequestMapping(value = "/sys/importRegUser" , method = RequestMethod.POST , produces = "text/html; charset=utf-8")
public String importRegUser(HttpServletRequest req,@RequestParam("excelfile") MultipartFile mufile) {
int successnumber = 0;
String filename = mufile.getOriginalFilename();//获取文件名
String realPath = req.getRealPath("/upload");
logger.debug("批量白名单上传服务器路径:"+realPath);
if(realPath.isEmpty()){ //若未有文件夹就创建
File file = new File(realPath);
file.mkdirs();
}
File dest = new File(realPath + "/" + filename);//用文件绝对路径封装file对象
try {
mufile.transferTo(dest);//上传文件到服务器
logger.debug("文件上传成功");
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
logger.error("IOException",e);
}
Workbook workbook = ExcelUploadUtils.isExcelFile(realPath, filename);//获取文件对象
if (workbook != null) {
Sheet sheet = workbook.getSheetAt(0);
Row row = sheet.getRow(0);// 第一行
int cells = row.getPhysicalNumberOfCells();// 标题总列数
Cell cell = row.getCell(0);// 第一列
String firstResult = cell.toString();// 第一个单元格的内容
if (!firstResult.equals("停车场编号") || cells != 13) {
logger.debug("读取到的文件内容导入有误,第一个单元格内容为::" + firstResult);
//导入失败之后删除导入的文件
if(dest.exists()){
dest.delete();
}
return "{\"message\":\"notNeedFile\"}";
}
Map<Integer, Map<Integer, String>> contentMap = ExcelUploadUtils.readExcelTitle(workbook);//此方法内部调用了readExcelContent()方法,返回给一个map集合
if (contentMap.size() <= 0) {
logger.debug("文件中没有内容,批量添加失败");
//导入失败之后删除导入的文件
if(dest.exists()){
dest.delete();
}
return "{\"message\":\"fail\"}";
}else {
logger.debug("读取到excel文件数据Map" + contentMap);
for (int i = 1; i <= contentMap.size(); i++) {// 添加白名单到数据库
Map<Integer, String> map = contentMap.get(i);
if (contentMap.get(contentMap.size()).equals("") || contentMap.get(contentMap.size()).equals(null)) {
logger.debug("文件中到此行已经没有内容,终止读取。。。");
break;
}
String sysWriteDate = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss").format(new Date());
TbRegisterUserS regUser = new TbRegisterUserS(map.get(1),
map.get(0), map.get(2), map.get(3), map.get(4), map
.get(5), map.get(6), map.get(7),
map.get(8), map.get(9), map.get(10), map.get(11),
map.get(12), sysWriteDate, 1);
String result = manySaveRegUser(regUser);
if (result.equals("{\"message\":\"success\"}")) {
successnumber += 1;
}
}
int failnumber = contentMap.size() - successnumber;
logger.debug("批量导入白名单成功!导入成功:" + successnumber + "条,未成功:"+ failnumber + "条");
//导入成功之后删除导入的文件
if(dest.exists()){
dest.delete();
}
return "{\"message\":\"success\"}";
}
} else {
logger.debug("系统未读取到文件,或者文件格式不是Excel");
System.out.println("文件不是Excel格式,路径是:"+dest.toString());
//导入失败之后删除导入的文件
if(dest.exists()){
dest.delete();
}
return "{\"message\":\"notExcelFile\"}";
}
}
Public void manySaveRegUser(RegUser regUser){
//存数据库方式略!
}