引入pom依赖:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.1</version>
</dependency>
实现导入接口:
/**
* 导如数据
* @param multipartFile
*/
@PostMapping(value = "/import", produces = "application/json")
public Object importBlackList(@RequestBody MultipartFile multipartFile){
return ExcelResolver.excelResolver(multipartFile);
}
实现解析方法:
public class ExcelResolver {
/**
* 判断文件是否符合exce的格式
* @param multipartFile 文件
* @return
*/
public static Object excelResolver(MultipartFile multipartFile){
Workbook workbook = null;
try {
InputStream in = multipartFile.getInputStream();
String fileName = multipartFile.getOriginalFilename();
//根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象
if (fileName.endsWith("xls")) {
//2003
workbook = new HSSFWorkbook(in);
} else if (fileName.endsWith("xlsx")) {
//2007 及2007以上
workbook = new XSSFWorkbook(in);
}
} catch (IOException e) {
e.printStackTrace();
}
return contentResolver(workbook);
}
/**
* 解析文件内容
* @param wb 文件对象
* @return
*/
private static Object contentResolver(Workbook wb){
if(wb == null || wb.getNumberOfSheets() < 1 ){
return "失败";
}
int sheetNum = wb.getNumberOfSheets();
List<Map> list = new ArrayList<>();
for(int i = 0; i < sheetNum; i ++){
Map<String, Object> sheetMap = new HashMap<>();
Sheet sheet = wb.getSheetAt(i);
String sheetName = sheet.getSheetName();
//解析title名称
Row hssfRow = sheet.getRow(0);
Map<String, String> titleMap = dataResolver(hssfRow);
Map<String, Map<String, String>> dataMap = dataResolver(sheet);
sheetMap.put("sheetName",sheetName);
sheetMap.put("contentTile",titleMap);
sheetMap.put("data",dataMap);
list.add(sheetMap);
}
return list;
}
/**
* 解析行数据
* @param hssfRow 行
* @return
*/
private static Map<String, String> dataResolver(Row hssfRow){
int firstCellNum = hssfRow.getFirstCellNum();
int lasCellNum = hssfRow.getLastCellNum();
Map<String, String> map = new HashMap<>();
for(int i = firstCellNum; i < lasCellNum; i ++){
Cell cell = hssfRow.getCell(i);
map.put("line_"+ i,cell.getStringCellValue());
}
return map;
}
/**
* 解析每一个sheet页数据
* @param sheet sheet对象
* @return
*/
private static Map<String, Map<String, String>> dataResolver(Sheet sheet){
Map<String, Map<String, String>> mapMap = new LinkedHashMap<>();
//获得当前sheet的开始行
int firstRowNum = sheet.getFirstRowNum();
//获得当前sheet的结束行
int lastRowNum = sheet.getLastRowNum();
for(int row = firstRowNum + 1; row <= lastRowNum; row++){
Row hssfRow = sheet.getRow(row);
Map<String, String> values = dataResolver(hssfRow);
mapMap.put("line_" +row, values);
}
return mapMap;
}
}
使用postman测试: