Я создаю java программу для загрузки файла Excel и чтения его как Json с использованием весенней загрузки, но всякий раз, когда я пытаюсь загрузить свой файл, он показывает ошибку, а также то, что можно сделать, чтобы игнорировать пустую ячейку, кроме не ряд.
{
"timestamp": 1579604789613,
"status": 500,
"error": "Internal Server Error",
"exception": "java.lang.IndexOutOfBoundsException",
"message": "Index: 1, Size: 1",
"path": "/applications/upload"
}
класс обслуживания:
Workbook workbook = WorkbookFactory.create(file.getInputStream());
Sheet sheet = workbook.getSheetAt(0);
Supplier<Stream<Row>> rowStreamSupplier = uploadUtil.getRowStreamSupplier(sheet);
Row headerRow = rowStreamSupplier.get().findFirst().get();
List<String> headerCells = uploadUtil.getStream(headerRow)
.map(Cell::getStringCellValue)
.collect(Collectors.toList());
int colCount = headerCells.size();
return rowStreamSupplier.get()
.skip(1)
.map(row -> {
List<String> cellList = uploadUtil.getStream(row)
.map(Cell::getStringCellValue)
.collect(Collectors.toList());
return uploadUtil.cellIteratorSupplier(colCount)
.get()
.collect(toMap(headerCells::get, cellList::get));
})
.collect(Collectors.toList());
}
Util class
public Supplier<Stream<Row>> getRowStreamSupplier(Iterable<Row> rows) {
return () -> getStream(rows);
}
public <T> Stream<T> getStream(Iterable<T> rows) {
return StreamSupport.stream(rows.spliterator(), false);
}
public Supplier<Stream<Integer>> cellIteratorSupplier(int end) {
return () -> numberStream(end);
}
public Stream<Integer> numberStream(int end) {
return IntStream.range(0, end).boxed();
}
Исключение составляет:
java.lang.IndexOutOfBoundsException: Index: 37, Size: 37 at java.util.ArrayList.rangeCheck(ArrayList.java:653) ~[?:1.8.0_111]
at java.util.ArrayList.get(ArrayList.java:429) ~[?:1.8.0_111]
at com.application.lms.application.service.UploadService.lambda$upload$2(UploadService.java:57) ~[classes/:?]
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) ~[?:1.8.0_111]