웹 서버에 매우 큰 POI 통합 문서를 빌드합니다. 전체 통합 문서를 메모리에 보관하면 여러 동시 요청에 대해 확장되지 않습니다. 서블릿 출력 스트림에 점진적으로 통합 문서를 쓸 수있는 방법이 있나요? 이는 응답 시간을 줄이고 프로세스 메모리를 효율적으로 만들어야합니다.서블릿 출력 스트림에 POI 워크 북 스트리밍
답변
불행히도, 순차적 데이터의 수단이 없다면 불가능합니다. 다른 형식을 찾아 보도록 권하고 싶습니다. CSV 또는 XML. 둘 다 순차적으로 작성할 수 있습니다. DB에서 오는 경우, 괜찮은 DB가 효율적으로 해당 형식으로 내보낼 수있는 기능을 내장하고 있기 때문에 더욱 효율적으로 수행 할 수 있습니다. 하나에서 다른쪽으로 스트림을 스트리밍하면됩니다.
JExcel 서블릿에서 스트림 코드를 읽는 샘플 코드가 있습니다. http://jexcelapi.sourceforge.net/resources/faq/
이 API의 단점은 Excel 2003까지만 지원한다는 것입니다.
POI 사용 - 파일을 생성하고 파일 바이트를 서블릿 출력 스트림에 제공 할 수 있습니까?
여기에 설명 된대로 다음 BigGridDemo.java의 접근 방식을 적용 할 수 엑셀 2007 (xslx)를 생성하려고하는 경우 : http://web.archive.org/web/20110821054135/http://www.realdevelopers.com/blog/code/excel
이 솔루션은 POI 템플릿 만 스트림으로 컨테이너 xslx을 생성 할 수 있도록하는 것입니다 실제 스프레드 시트 데이터를 XML 형식의 zip 출력 스트림으로 변환합니다. XML 생성을 능률화하는 것은 당신에게 달려 있습니다.
URL이 만료되었습니다. 해결할 수 있습니까? – rohit
쓰기 메소드를 HttpServletResponse.getOutputStream()에 직접 시도 했습니까?
는 다음의 예를 살펴주십시오HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("new sheet");
...
OutputStream out = response.getOutputStream();
wb.write(out);
out.close();
상황은 답변의 나머지 부분은 기록 된 상당히 이후 개선 - 스트리밍 이제 아파치 포이의 일부입니다.
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();
}
내가 서블릿의 OutputStream에 POI 통합 문서를 작성 중 :
다음은 문서의 예입니다. 배후에서 어떤 일이 발생합니까? 출력 스트림에 thte 바이트를 씁니까? 내 질문은, 나는 그것을 점진적으로 쓰는 법을 모른다. 전체 통합 문서가 만들어 질 때까지 기다렸다가 I/O에 기록해야합니다. 그리고 I/O에 쓰기 위해 약 1 분이 소요됩니다. 그것이 정당화 될지 모른다. –
스프레드 시트의 크기는 어느 정도입니까? 스프레드 시트를 만들었나요? 당신에게 주어진다면 그것을 수정합니까? I/O에 쓸 시간이 오래 걸립니까? –