"제공된 데이터가 OLE2 형식으로 되어 있습니다. 여기서는 OOXML (Office Open XML) 문서를 다루는 POI의 일부를 호출하고 있습니다. 이 데이터를 처리하려면 HSSF를 사용하는 POI의 다른 부분을 호출해야 합니다."
이 메시지는 주로 엑셀 (.xls) 형식의 문서를 처리하려고 할 때 발생한다.
OLE2 형식은 이전 버전의 엑셀 문서 형식을 나타내며, 이러한 문서를 처리하기 위해서는 HSSF (Horrible Spreadsheet Format)를 사용해야 한다.
반면에 XSSF는 최신 버전의 엑셀 문서 (.xlsx)를 처리하기 위한 라이브러리입니다. 따라서 에러 메시지가 나타나면 문서의 형식에 맞게 적절한 POI 부분을 호출하도록 코드를 수정해야 한다.
최종 코드는 아래와 같다.
if (req.getAttachments() != null && req.getAttachments().get(0).getOriginalFilename().substring(req.getAttachments().get(0).getOriginalFilename().lastIndexOf(".") + 1).equals("xls")) {
try {
System.out.println(design.getCreatedAt().format(DateTimeFormatter.ISO_DATE) );
FileInputStream file = new FileInputStream("src/main/prodmedia/image/"+design.getCreatedAt().format(DateTimeFormatter.ISO_DATE)+"/"+design.getDesignAttachments().get(0).getUniqueName());
HSSFWorkbook workbook = new HSSFWorkbook(file);
int rowindex = 0;
int columnindex = 0;
//시트 수 (첫번째에만 존재하므로 0을 준다)
//만약 각 시트를 읽기위해서는 FOR문을 한번더 돌려준다
HSSFSheet sheet = workbook.getSheetAt(0);
//행의 수
int rows = sheet.getPhysicalNumberOfRows();
for (rowindex = 0; rowindex < rows; rowindex++) {
//행을읽는다
HSSFRow row = sheet.getRow(rowindex);
if (row != null) {
//셀의 수
int cells = row.getPhysicalNumberOfCells();
for (columnindex = 0; columnindex <= cells; columnindex++) {
//셀값을 읽는다
HSSFCell cell = row.getCell(columnindex);
String value = "";
//셀이 빈값일경우를 위한 널체크
if (cell == null) {
continue;
} else {
//타입별로 내용 읽기
switch (cell.getCellType()) {
case FORMULA:
value = cell.getCellFormula();
break;
case NUMERIC:
value = cell.getNumericCellValue() + " numeric ";
break;
case STRING:
value = cell.getStringCellValue() + " string";
break;
case BLANK:
value = cell.getBooleanCellValue() + " blank";
break;
case ERROR:
value = cell.getErrorCellValue() + " error";
break;
default:
value = "";
break;
}
}
System.out.println(rowindex + "번 행 : " + columnindex + "번 열 값은: " + value);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}