The supplied data appears to be in the OLE2 Format. You are calling the part of POI that deals with OOXML (Office Open XML) Documents. You need to call a different part of POI to process this data (eg HSSF instead of XSSF)

Yunny.Log ·2022년 9월 7일
0

Debugging

목록 보기
43/69
post-thumbnail
post-custom-banner
  • 스프링부트에서 엑셀파일을 열어서 읽으려고 했는데 저런 에러가 발생
  • 에러의 이유는 에러 메시지에 정확히 써져있는 것과 같이 HSSF 를 사용하라는 것이었던 것 (HSSF instead of XSSF)

"제공된 데이터가 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();
            }
        }


post-custom-banner

0개의 댓글