dhkimm
10
2021-09-24 10:57:09
8
194

poi 엑셀 파일 읽어오기중 에러


안녕하세요

poi 라이브러리를 사용해서 excel 파일을 읽어 list로 반환하는 중에 에러가 있어서 질문 드립니다.

[소스]

OPCPackage opcPackage = OPCPackage.open(multipartFile.getInputStream());
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);

* mutipartFile은 앞단에서 넘긴 excel파일입니다.

[에러]

java.io.IOException: Failed to read zip entry source

Caused by: java.util.zip.ZipException: invalid stored block lengths


다음과 같은 에러가 발생하는데 해결법을 잘 모르겠네요...

좋은 해결법이 있다면 공유 부탁드립니다ㅠㅠ

0
  • 답변 8

  • HJOW
    3k
    2021-09-24 11:18:22 작성 2021-09-24 11:19:03 수정됨

    XSSFWorkbook 와 SXSSFWorkbook 는 xlsx 형식의 파일만 읽을 수 있습니다.

    xlsx, docx, pptx 등 x가 붙은 최신 규격은 내부적으로 내용을 xml로 저장하고 zip 방식으로 압축하는 방식을 사용하고 있습니다.


    저 에러가 난 것은, 열려는 파일을 xlsx 로 보고 압축부터 풀려고 했는데 올바른 압축파일이 아니어서 오류가 난 것이죠.

    구버전인 xls 파일을 열려면 HSSFWorkbook 를 사용해야 합니다.

  • dhkimm
    10
    2021-09-24 11:27:15

    현재 올라간 파일이 xlsx,docx,pptx 와 같이 x가 붙는 최신 규격의 파일들이 맞는데 어떻게 처리를 하면 되죠...?

  • HJOW
    3k
    2021-09-24 13:13:11 작성 2021-09-24 13:13:41 수정됨

    1. 그 파일을 MS 오피스 2007 이상의 버전으로 열어보세요.

        파일 자체가 MS 오피스가 아닌 다른 프로그램 (예: 한컴오피스, 폴라리스) 에서 만들어졌을 수도 있으므로


    2. Apache POI 라이브러리 버전을 올려보세요.

        최신 MS 오피스에서 저장된 파일일 수 있으므로


    3. MS 오피스로 열고 다른 이름으로 저장해서 그 파일로 업로드 시도해보세요.

        메일이나 메신저 등으로 파일이 전달되다가 손상되었을 수 있으므로

  • 카스마당
    1k
    2021-09-24 13:27:26

    멀티파트면 업로드시 파일이 일부가 잘리거나 제대로 업로드가 안된 상태일 수 있습니다.

    로컬PC와 업로드된 파일 용량 비교 먼저 해보시면 좋겠네요.

  • dhkimm
    10
    2021-09-24 14:13:58 작성 2021-09-24 14:49:27 수정됨

    카스마당님 답변처럼 업로드된 파일이 깨지며, 로컬 PC상의 파일과 용량이 상이합니다.

    해당하는 에러에 대한 해결법이 있을까요??

  • dhkimm
    10
    2021-09-24 14:50:26

    HJOW님 좋은답변 감사합니다.

    알려주신 방법으로는 해결이 되지 않았습니다ㅠㅠ

  • 카스마당
    1k
    2021-09-24 15:42:25 작성 2021-09-24 15:43:11 수정됨

    소스를 보기전엔 정확한 답변을 드리기 어렵겠지만

    업로드 구현부분을 먼저 확인해 보셔야 될것 같습니다.

    이후 문제 없다면 poi쪽도 해결되지 않을까요.?

    파일을 서버에 저장한뒤 getInputStream을 사용했는지

    저장하지 않고 getInputStream을 사용했는지도 한번 보시구요.

  • dhkimm
    10
    2021-09-24 15:57:10

    카스마당님, 우선 답변 감사합니다.

    아래 소스는 업로드 구현부 입니다.(mutipartFile = xlsx파일)

    문제가 있을까요..?

    String strFileName = multipartFile.getOriginalFilename();
    
    File file  = new File("C:\\upload\\temp\\"+ strFileName );
    
    byte[] bytFileSize = multipartFile.getBytes();
    
    try (OutputStream stream = new FileOutputStream(file)) {
        stream.write(bytFileSize);
    } catch(Exception e) {
     ......
    }
    


  • 로그인을 하시면 답변을 등록할 수 있습니다.