private ArrayList<ImportIndicatorRowDataDto> validFileAndConvertData(MultipartFile file) throws IOException {
InputStream fileInputStream = file.getInputStream();
if (file.isEmpty()) {
throw new DomainArgumentException("上传文件不能为空");
}
String fileName = file.getOriginalFilename();
assert fileName != null;
String fileSuffix = fileName.substring(fileName.lastIndexOf(".") + 1);
if (!"xls".equalsIgnoreCase(fileSuffix) && !"xlsx".equalsIgnoreCase(fileSuffix)) {
throw new DomainArgumentException("文件格式错误");
}
ExcelOutPut excelOutPut = null;
if ("xlsx".equals(fileSuffix)) {
excelOutPut = PoiHelper.readXlsx(fileInputStream);
} else if ("xls".equals(fileSuffix)) {
excelOutPut = PoiHelper.readXls(fileInputStream);
}
if (excelOutPut == null || excelOutPut.getTitleList() == null) {
throw new DomainArgumentException("导入文件模板错误");
}
int rowNumber = 1;
ArrayList<ImportIndicatorRowDataDto> dataList = new ArrayList<>();
if (ObjectUtils.isNotEmpty(excelOutPut.getDataList())) {
for (ArrayList<String> rowData : excelOutPut.getDataList()) {
if (rowData.get(0).isEmpty() && rowData.get(1).isEmpty()) {
continue;
}
int colNum = 0;
ImportIndicatorRowDataDto indicatorRowDataDto = new ImportIndicatorRowDataDto();
indicatorRowDataDto.setRowNumber(rowNumber);
indicatorRowDataDto.setIndicatorSystemNo(rowData.get(colNum++).trim());
indicatorRowDataDto.setIndicatorName(rowData.get(colNum++).trim());
dataList.add(indicatorRowDataDto);
rowNumber++;
}
}
return dataList;
}
工具类
public class PoiHelper {
public static ExcelOutPut readXlsx(InputStream io) throws IOException {
var dataList = new ArrayList<ArrayList<String>>();
var titleList = new ArrayList<String>();
var xssfWorkbook = new XSSFWorkbook(io);
var xssfSheet = xssfWorkbook.getSheetAt(0);
var rowStart = xssfSheet.getFirstRowNum();
var rowEnd = xssfSheet.getLastRowNum();
var row1 = xssfSheet.getRow(rowStart);
if (row1 == null) {
xssfWorkbook.close();
return null;
}
var cellStart1 = row1.getFirstCellNum();
var cellEnd1 = row1.getLastCellNum();
for (var k = cellStart1; k <= cellEnd1; k++) {
var cell = row1.getCell(k);
if (cell != null && !cell.toString().isEmpty()) {
titleList.add(cell.toString());
}
}
for (var i = rowStart + 1; i <= rowEnd; i++) {
var row = xssfSheet.getRow(i);
if (row == null) {
continue;
}
var cellStart = 0;
var cellEnd = row.getPhysicalNumberOfCells();
if (cellEnd < 0) {
continue;
}
var arrayList = new ArrayList<String>();
for (var k = cellStart; k < titleList.size(); k++) {
var cell = row.getCell(k);
if (cell == null) {
arrayList.add("");
} else {
switch (cell.getCellTypeEnum()) {
case NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) {
var date = cell.getDateCellValue();
var formater = new SimpleDateFormat("yyyy-MM-dd");
arrayList.add(formater.format(date));
} else {
arrayList.add(NumberToTextConverter.toText(cell.getNumericCellValue()));
}
break;
case STRING:
arrayList.add(cell.getStringCellValue());
break;
case BOOLEAN:
arrayList.add(String.valueOf(cell.getBooleanCellValue()));
break;
case FORMULA:
arrayList.add(cell.getCellFormula());
break;
case BLANK:
arrayList.add("");
break;
case ERROR:
arrayList.add("");
break;
default:
arrayList.add("");
break;
}
}
}
dataList.add(arrayList);
}
var excelOutPut = new ExcelOutPut(titleList, dataList);
xssfWorkbook.close();
io.close();
return excelOutPut;
}
public static ExcelOutPut readXls(InputStream io) throws IOException {
var dataList = new ArrayList<ArrayList<String>>();
var titleList = new ArrayList<String>();
var hssfWorkbook = new HSSFWorkbook(io);
var hssfSheet = hssfWorkbook.getSheetAt(0);
var rowStart = hssfSheet.getFirstRowNum();
var rowEnd = hssfSheet.getLastRowNum();
var row1 = hssfSheet.getRow(rowStart);
if (null == row1) {
hssfWorkbook.close();
return null;
}
var cellStart1 = row1.getFirstCellNum();
var cellEnd1 = row1.getLastCellNum();
for (int k = cellStart1; k <= cellEnd1; k++) {
HSSFCell cell = row1.getCell(k);
if (null != cell && !cell.toString().isEmpty()) {
titleList.add(cell.toString());
}
}
for (var i = rowStart + 1; i <= rowEnd; i++) {
HSSFRow row = hssfSheet.getRow(i);
if (row == null) {
continue;
}
int cellStart = 0;
int cellEnd = row.getPhysicalNumberOfCells();
if (cellEnd < 0) {
continue;
}
var arrayList = new ArrayList<String>();
for (var k = cellStart; k < titleList.size(); k++) {
var cell = row.getCell(k);
if (cell == null) {
arrayList.add("");
} else {
switch (cell.getCellTypeEnum()) {
case NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) {
var date = cell.getDateCellValue();
var formater = new SimpleDateFormat("yyyy-MM-dd");
arrayList.add(formater.format(date));
} else {
arrayList.add(NumberToTextConverter.toText(cell.getNumericCellValue()));
}
break;
case STRING:
arrayList.add(cell.getStringCellValue());
break;
case BOOLEAN:
arrayList.add(String.valueOf(cell.getBooleanCellValue()));
break;
case FORMULA:
arrayList.add(cell.getCellFormula());
break;
case BLANK:
arrayList.add("");
break;
case ERROR:
arrayList.add("");
break;
default:
arrayList.add("");
break;
}
}
}
dataList.add(arrayList);
}
var excelOutPut = new ExcelOutPut(titleList, dataList);
hssfWorkbook.close();
return excelOutPut;
}
public static ExcelOutPut readXlsxWithSheets(InputStream io,int sheet) throws IOException {
var dataList = new ArrayList<ArrayList<String>>();
var titleList = new ArrayList<String>();
var xssfWorkbook = new XSSFWorkbook(io);
var xssfSheet = xssfWorkbook.getSheetAt(sheet);
var rowStart = xssfSheet.getFirstRowNum();
var rowEnd = xssfSheet.getLastRowNum();
var row1 = xssfSheet.getRow(rowStart);
if (row1 == null) {
xssfWorkbook.close();
return null;
}
var cellStart1 = row1.getFirstCellNum();
var cellEnd1 = row1.getLastCellNum();
for (var k = cellStart1; k <= cellEnd1; k++) {
var cell = row1.getCell(k);
if (cell != null && !cell.toString().isEmpty()) {
titleList.add(cell.toString());
}
}
for (var i = rowStart + 1; i <= rowEnd; i++) {
var row = xssfSheet.getRow(i);
if (row == null) {
continue;
}
var cellStart = 0;
var cellEnd = row.getPhysicalNumberOfCells();
if (cellEnd < 0) {
continue;
}
var arrayList = new ArrayList<String>();
for (var k = cellStart; k < titleList.size(); k++) {
var cell = row.getCell(k);
if (cell == null) {
arrayList.add("");
} else {
switch (cell.getCellTypeEnum()) {
case NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) {
var date = cell.getDateCellValue();
var formater = new SimpleDateFormat("yyyy-MM-dd");
arrayList.add(formater.format(date));
} else {
arrayList.add(NumberToTextConverter.toText(cell.getNumericCellValue()));
}
break;
case STRING:
arrayList.add(cell.getStringCellValue());
break;
case BOOLEAN:
arrayList.add(String.valueOf(cell.getBooleanCellValue()));
break;
case FORMULA:
arrayList.add(cell.getCellFormula());
break;
case BLANK:
arrayList.add("");
break;
case ERROR:
arrayList.add("");
break;
default:
arrayList.add("");
break;
}
}
}
dataList.add(arrayList);
}
var excelOutPut = new ExcelOutPut(titleList, dataList);
xssfWorkbook.close();
io.close();
return excelOutPut;
}
}
接受转换后的实体,一个是表头集合,一个是数据集合
@Data
@AllArgsConstructor
public class ExcelOutPut {
private ArrayList<String> titleList;
private ArrayList<ArrayList<String>> dataList;
}