2012-06-22 5 views
5

를로드하는 데 시간이 많이 걸립니다 :XSSFWorkbook 내가 다음 코드를 사용하고

File file = new File("abc.xlsx"); 
InputStream st = new FileInputStream(file); 
XSSFWorkbook wb = new XSSFWorkbook(st); 

XLSX 파일 자체는 25,000 행이 각 행 500 열의 콘텐츠가 있습니다. 디버깅하는 동안 XSSFWorkbook을 만드는 세 번째 행을 보았습니다.이 문을 완료하는 데 많은 시간 (1 시간!)이 걸렸습니다.

원본 xlsx 파일의 값에 액세스하는 더 좋은 방법이 있습니까?

감사 Abhishek S

답변

14

하면 파일이있을 때 첫번째로,의 InputStream에서 XSSFWorkbook를로드하지 않습니다! InputStream을 사용하면 모든 것을 메모리에 버퍼링해야하므로 공간을 많이 차지하고 시간이 오래 걸립니다. 그 버퍼링을 할 필요가 없기 때문에하지 마라!

야간 최신 POI 빌드를 실행중인 경우 매우 간단합니다. 귀하의 코드가된다 :

File file = new File("C:\\D\\Data Book.xlsx"); 
OPCPackage opcPackage = OPCPackage.open(file); 
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage); 

그렇지 않으면, 그것은 매우 유사 :

File file = new File("C:\\D\\Data Book.xlsx"); 
OPCPackage opcPackage = OPCPackage.open(file.getAbsolutePath()); 
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage); 
+1

문제가 완전히 해결되지 않으면 poi 이벤트 api를 메모리 부족 공간으로 사용하여 큰 파일을 읽을 수 있습니다. poi 문서는 다음 예제를 포함합니다. http://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api –

+0

감사합니다. 이 문제가 어떻게 해결 될지 궁금하다. 내용을 메모리에 버퍼링하지 않습니까? 아니면 원본 참조를 사용하여 데이터에 액세스 할 수 있습니까? –

+2

파일과 함께 열면 입력 스트림을 사용하여 여는 것보다 버퍼링 시간이 단축됩니다 – Gagravarr

0

POI의 스트리밍 버전을 사용하는 것이 좋습니다. 그러면 필요에 따라 파일의 하위 집합이 메모리에로드됩니다. 대용량 파일을 다룰 때 권장되는 방법입니다.

POI SXSSF

+9

내 인상은 파일 만 읽을 수 없습니다, 쓰기, 파일에 적용 POI의 스트리밍 버전입니다. –

+7

정확함, SXSSF는 쓰기 전용입니다. 낮은 메모리 읽기를 수행하려면 이벤트 (SAX) 처리가 필요합니다. – Gagravarr

관련 문제