2010-04-20 3 views
15

웹 서버에 매우 큰 POI 통합 문서를 빌드합니다. 전체 통합 문서를 메모리에 보관하면 여러 동시 요청에 대해 확장되지 않습니다. 서블릿 출력 스트림에 점진적으로 통합 문서를 쓸 수있는 방법이 있나요? 이는 응답 시간을 줄이고 프로세스 메모리를 효율적으로 만들어야합니다.서블릿 출력 스트림에 POI 워크 북 스트리밍

답변

3

불행히도, 순차적 데이터의 수단이 없다면 불가능합니다. 다른 형식을 찾아 보도록 권하고 싶습니다. CSV 또는 XML. 둘 다 순차적으로 작성할 수 있습니다. DB에서 오는 경우, 괜찮은 DB가 효율적으로 해당 형식으로 내보낼 수있는 기능을 내장하고 있기 때문에 더욱 효율적으로 수행 할 수 있습니다. 하나에서 다른쪽으로 스트림을 스트리밍하면됩니다.

0

JExcel 서블릿에서 스트림 코드를 읽는 샘플 코드가 있습니다. http://jexcelapi.sourceforge.net/resources/faq/

이 API의 단점은 Excel 2003까지만 지원한다는 것입니다.

POI 사용 - 파일을 생성하고 파일 바이트를 서블릿 출력 스트림에 제공 할 수 있습니까?

+0

내가 서블릿의 OutputStream에 POI 통합 문서를 작성 중 :

다음은 문서의 예입니다. 배후에서 어떤 일이 발생합니까? 출력 스트림에 thte 바이트를 씁니까? 내 질문은, 나는 그것을 점진적으로 쓰는 법을 모른다. 전체 통합 문서가 만들어 질 때까지 기다렸다가 I/O에 기록해야합니다. 그리고 I/O에 쓰기 위해 약 1 분이 소요됩니다. 그것이 정당화 될지 모른다. –

+0

스프레드 시트의 크기는 어느 정도입니까? 스프레드 시트를 만들었나요? 당신에게 주어진다면 그것을 수정합니까? I/O에 쓸 시간이 오래 걸립니까? –

7

여기에 설명 된대로 다음 BigGridDemo.java의 접근 방식을 적용 할 수 엑셀 2007 (xslx)를 생성하려고하는 경우 : http://web.archive.org/web/20110821054135/http://www.realdevelopers.com/blog/code/excel

이 솔루션은 POI 템플릿 만 스트림으로 컨테이너 xslx을 생성 할 수 있도록하는 것입니다 실제 스프레드 시트 데이터를 XML 형식의 zip 출력 스트림으로 변환합니다. XML 생성을 능률화하는 것은 당신에게 달려 있습니다.

+0

URL이 만료되었습니다. 해결할 수 있습니까? – rohit

0

쓰기 메소드를 HttpServletResponse.getOutputStream()에 직접 시도 했습니까?

는 다음의 예를 살펴주십시오

HSSFWorkbook wb = new HSSFWorkbook(); 
HSSFSheet sheet = wb.createSheet("new sheet"); 
... 
OutputStream out = response.getOutputStream(); 
wb.write(out); 
out.close(); 
+2

-1 이것은 질문에 대답하지 않습니다. OP는 그가 해결하려고하는 문제는 모든 것을 만드는 것을 피하고 모든 것을 한꺼번에 작성하는 것입니다. – Ophidian

+0

-1 xlxs를 스트리밍 할 수 없습니다.언급 된 영업 담당자와 마찬가지로 – hellojava

+0

모든 행이 wb에 기록 될 때까지 메모리에 계속 남아 있습니다. –

2

상황은 답변의 나머지 부분은 기록 된 상당히 이후 개선 - 스트리밍 이제 아파치 포이의 일부입니다.

SXSSFWorkbook 클래스와 documentation here을 참조하십시오. 시트 위의 스트리밍 창을 사용하여 창 외부의 오래된 행을 임시 파일로 플러시합니다.

이것은 hlg's answer에 사용 된 BigGridDemo 접근 방식을 기반으로하지만 이제는 공식 배포의 일부입니다.

public static void main(String[] args) throws Throwable { 
    // keep 100 rows in memory, exceeding rows will be flushed to disk 
    SXSSFWorkbook wb = new SXSSFWorkbook(100); 
    Sheet sh = wb.createSheet(); 
    for(int rownum = 0; rownum < 1000; rownum++){ 
     Row row = sh.createRow(rownum); 
     for(int cellnum = 0; cellnum < 10; cellnum++){ 
      Cell cell = row.createCell(cellnum); 
      String address = new CellReference(cell).formatAsString(); 
      cell.setCellValue(address); 
     } 

    } 

    // Rows with rownum < 900 are flushed and not accessible 
    for(int rownum = 0; rownum < 900; rownum++){ 
     Assert.assertNull(sh.getRow(rownum)); 
    } 

    // ther last 100 rows are still in memory 
    for(int rownum = 900; rownum < 1000; rownum++){ 
     Assert.assertNotNull(sh.getRow(rownum)); 
    } 

    FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx"); 
    wb.write(out); 
    out.close(); 

    // dispose of temporary files backing this workbook on disk 
    wb.dispose(); 
}