我们在日常的开发过程中,poi导入数据要根据注解的列名和顺序进行识别,那么首先要校验模版的正确与否,即表头是否正确,然后才能开始数据和业务层面的校验,最近也是被这个东西烦的不行,解决后记录一下,一个是方便自己以后查看,也给其他兄弟分享下,节省时间,话不多说,直接上代码:
//仅作事列,可根据具体代码改造
public Result dataImport(MultipartFile file, HttpServletResponse response, HttpServletRequest request, UserDTO userDTO) throws Exception {
//1、校验文件是否符合基本标准
if (ObjectUtils.isEmpty(file)) {
return Result.failed("请选择上传文件");
}
if(!file.getOriginalFilename().endsWith(".xlsx") &&
!file.getOriginalFilename().endsWith(".xls")) {
return Result.failed("请选择excel文件上传");
}
//2、定义正确表头有序集合
List<String> list = new ArrayList<>();
Collections.addAll(list, "姓名", "手机号", "性别");
//3、开始校验
boolean headerFlag = checkExcelHeaders(file, list);
if (!headerFlag){
return Result.failed("上传失败,模板错误,请核对后重新上传");
}
}
/**
* 检查 Excel 文件表头信息
*
* @param file
* @param dataList
* @return
* @throws Exception
*/
public boolean checkExcelHeaders(MultipartFile file, List<String> dataList) throws Exception {
byte [] byteArr=file.getBytes();
InputStream inputStream = new ByteArrayInputStream(byteArr);
Workbook workbook = new XSSFWorkbook(inputStream);
Sheet sheet = workbook.getSheetAt(0);
System.out.println(sheet.getLastRowNum());
//获取 excel 第一行数据(表头)
Row row = sheet.getRow(0);
//存放表头信息
List<String> headerList = new ArrayList<>();
//算下有多少列
int colCount = sheet.getRow(0).getLastCellNum();
System.out.println(colCount);
for (int j = 0; j < colCount; j++) {
Cell cell = row.getCell(j);
String cellValue = cell.getStringCellValue().trim();
headerList.add(cellValue);
}
return dataList.equals(headerList);
}
通过有序集合的比较,就可以得出表头是否正确的结论啦,分享就到这里,有需要的兄弟快去试试吧!
更新如下:优化了传入Excel的格式,适配xls,以及对代码的细微调整以至于更加完善
/**
* 检查 Excel 文件表头信息
*
* @param file
* @param dataList
* @return
*/
public boolean checkExcelHeaders(MultipartFile file, List<String> dataList) throws IOException {
InputStream inputStream = null;
try {
byte [] byteArr=file.getBytes();
inputStream = new ByteArrayInputStream(byteArr);
Workbook workbook = WorkbookFactory.create(inputStream);
Sheet sheet = workbook.getSheetAt(0);
System.out.println(sheet.getLastRowNum());
//获取 excel 第一行数据(表头)
Row row = sheet.getRow(0);
//存放表头信息
List<String> headerList = new ArrayList<>();
//算下有多少列
int colCount = sheet.getRow(0).getLastCellNum();
for (int j = 0; j < colCount; j++) {
Cell cell = row.getCell(j);
String cellValue = cell.getStringCellValue().trim();
headerList.add(cellValue);
}
return dataList.equals(headerList);
}catch (Exception e){
log.error("模版表头解析错误:", e);
return false;
}finally {
if (inputStream != null){
inputStream.close();
}
}
}