2017-02-16 3 views
0

업로드 된 스프레드 시트를 Oracle 데이터베이스 BLOB 열에 저장해야한다는 요구 사항이 있습니다. 사용자가 ADF UI를 사용하여 스프레드 시트를 업로드하면 동일한 스프레드 시트가 DB에 저장되고 나중에 검색됩니다. Google은 POI를 사용하여 스프레드 시트를 처리하고 있습니다. 업로드 된 파일이 byte []로 변환되어 응용 프로그램 서버로 전송됩니다. Appserver는 BLOB 열에도 동일하게 유지됩니다. 하지만 나중에 동일한 내용을 가져 오려고하면 "Excel에서 읽을 수없는 내용이 *****. xlsx에 있습니다"라는 메시지가 나타납니다.이 통합 문서의 내용을 복구 하시겠습니까? 메시지. 이 문제는 에 의해 해결 될 수 있습니다. 바이트 []를 XSSFWorkbook으로 변환하고이를 다시 바이트 []로 변환하여 그대로 유지할 수 있습니다. 하지만 내 요구 사항에 따라 매우 큰 스프레드 시트를 가져올 수 있으며 XSSFWorkbook을 초기화하면 outofmemory 문제가 발생할 수 있습니다. 코드는 바이트 [] 업로드 스프레드 시트BLOB 열에 스프레드 시트 쓰기 POI를 사용하여 스프레드 시트 쓰기

if (uploadedFile != null) { 
     InputStream inputStream; 
     ByteArrayOutputStream byteArrayOutputStream = new   ByteArrayOutputStream(); 
       inputStream = uploadedFile.getInputStream(); 
       int c = 0; 
       while (c != -1) { 
        c = inputStream.read(); 
        byteArrayOutputStream.write((char) c); 
       } 
       bytes = byteArrayOutputStream.toByteArray(); 

      } 

아래와 같다 동일한 바이트 [] 아래 블롭 컬럼으로 유지되고 도착. 1.이 바이트 []를 BlobCloumn 에 할당합니다. 2. SQL 업데이트 문을 bolobColumn 으로 업데이트합니다. 3. 명령문을 실행합니다.

위의 단계가 완료되면 다음과 같이 스프레드 시트를 검색하십시오. 1. BlobColumn 을 읽습니다. 2. BlobColumn 바이트에서 바이트 []를 가져옵니다. 3. 응답의 content-type을 설정하여 스프레드 시트를 지원합니다. 4. 바이트 []를 전송하십시오.

하지만 위의 다운로드 한 스프레드 시트를 열면 스프레드 시트 오류가 발생합니다.

UI에서 바이트 []를받은 후 아래 단계를 추가하면 문제가 해결됩니다.

InputStream is = new ByteArrayInputStream(uploadedSpreadSheetBytes); 
    XSSFWorkbook uploadedWorkbook = new XSSFWorkbook(is); 

후 내가 XSSFWorkbook에 바이트 [] 변환 후, [] 중복 다시 바이트로 XSSFWorkbook 변환 느낌

byteArrayOutputStream = new ByteArrayOutputStream(); 
     workbook.write(byteArrayOutputStream); 
     byte[] spreadSheetBytes = byteArrayOutputStream.toByteArray(); 

아래와 같이 XSSFWorkbook에서 다시 바이트 []를 파생.

도움을 주시면 감사하겠습니다. 감사합니다. .

+0

어딘가에 손상이 도입되었지만 프로세스가 무엇인지 분명하지 않습니다. 한 번에 한 단계 씩 철자를 기입 한 다음 오류가 발생한 위치를 알려주십시오. 스프레드 시트가 지속되는 방법 및 프로세스에 대한 세부 사항을 포함하십시오. 전환과 동일합니다 : 어떻게하고 있으며, 어떤 과정에서 그렇게하고 있는지. 나의 초기 생각은 POI가'OutputStream'에 쓰는 것이고, 아마도'ByteArrayOutputStream'은'toString()'과 함께 작동 할 것입니다. – jmarkmurphy

답변

0

SAX (이벤트 기반 구문 분석)를 사용하여 전체 XSSFWorkbook을 초기화하는 대신 메모리 문제를 피할 수 있습니다. 이렇게하면 파일의 일부만 처리하므로 메모리를 적게 소비합니다. SAX 구문 분석에 대한 자세한 내용은 the POI spreadsheet how-to page을 참조하십시오. JVM 메모리를 늘릴 수도 있지만 물론 보장 할 수는 없습니다.

+0

스프레드 시트를 읽으려고 시도했습니다. 그러나 여기의 경우는 byte []를 DB에 쓰는 것입니다. UI에서 오는 바이트 []를 쓰면 스프레드 시트를 여는 동안 손상된 스프레드 시트 메시지가 표시됩니다. 대신 바이트 []를 XSSFWorkbook으로 변환하고 바이트 []를 다시 가져 와서 DB에 쓰면 아무런 문제가 발생하지 않습니다. – Vasantha

+0

바이트 []를 XSSFWorkbook으로 어떻게 변환하고 있습니까?문자 인코딩, 파일 헤더, 뭔가 잘못 될 수 있습니다. XSFFWorkbook로 변환하는 과정에서 일부 필요한 바이트를 추가한다고 추측합니다. 초기 바이트 []와 XSSFWorkbook에서 바이트 []를 되찾은 후의 바이트 크기를 비교하십시오. – FrederikVH

+0

@Vasantha : "하지만 여기서 바이트 []를 DB에 쓰는 것입니다." 그렇습니다. 그러나 어떻게이 일을하고 있는지 알 수 있습니까? 이 작업을 수행 할 수있는 유일한 방법은 아니며 코드를 제공하지 않았습니다. 이 질문을 편집하여 DB에 바이트 []를 쓰는 코드를 보여주십시오. –