2012-12-10 2 views
0

처음으로 나는이 질문을 모든 가정에서 물어 봅니다. 나는 내일 갱신하려고 노력할 것이다.파일로 NPOIFSFileSystem 객체 인스턴스화 문제

는 기본적으로 나는과 같이 NPOIFSFileSystem를 인스턴스화하고 있습니다 :

NPOIFSFileSystem fs = new NPOIFSFileSystem(new File(this.getLocalFile())); 

getLocalFile() 메소드는 파일 경로 문자열을 반환 - 나는 파일이 해당 위치에 존재하는 것을 알고있다. 그러나, instatiation 오류를 반환합니다 :

ArrayIndexOutOfBounds 

아무도 이것에 전혀 아이디어가 있습니까?

해당 파일은 XLS 파일이며 아랍어 문자가 포함되어 있으며 문제가 발생할 수 있는지 궁금합니다.

나는 이전에이 사용 POIFSFileSystem하지만 문제의 XLS 파일은 일부 문제와 각종 포럼 그래서, 누군가가 전에 본했다

NPOIFSFileSystem

로 이동 권장 원인이나요? 아니면 누구도 나에게 몇 가지 팁/포인터를 제공해 줄 수 있습니까?

내일 명확히 물어볼 필요가있는 경우, 직장에 돌아 왔을 때 (우리는 인터넷 연결을 수정했습니다)이 질문을 업데이트 할 것입니다. 사전에

감사 나단

편집 여기에 1 전체 스택 추적입니다 :

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 
    at org.apache.poi.poifs.filesystem.BlockStore$ChainLoopDetector.claim(BlockStore.java:95) 
    at org.apache.poi.poifs.filesystem.NPOIFSStream$StreamBlockByteBufferIterator.next(NPOIFSStream.java:212) 
    at org.apache.poi.poifs.filesystem.NPOIFSStream$StreamBlockByteBufferIterator.next(NPOIFSStream.java:186) 
    at org.apache.poi.poifs.property.NPropertyTable.buildProperties(NPropertyTable.java:88) 
    at org.apache.poi.poifs.property.NPropertyTable.<init>(NPropertyTable.java:66) 
    at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.readCoreContents(NPOIFSFileSystem.java:379) 
    at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:202) 
    at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:163) 
    at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:145) 
    at com.turnitin.datamap.parser.standard.XLSParser.defineParsableObject(XLSParser.java:67) 
    at com.turnitin.datamap.parser.standard.XLSParser.setUp(XLSParser.java:56) 
    at com.turnitin.datamap.parser.standard.XLSParser.<init>(XLSParser.java:46) 
    at com.turnitin.datamap.controller.DataMapController.parseData(DataMapController.java:255) 
    at com.turnitin.datamap.controller.DataMapController.processControl(DataMapController.java:162) 
    at com.turnitin.datamap.controller.DataMapController.processStart(DataMapController.java:130) 
    at com.turnitin.datamap.controller.DataMapController.main(DataMapController.java:61) 

나는 3.9로 업그레이드하고 다시 시도합니다 POI3-8

를 실행하고 너에게 알려줘.

다시 한번 감사 나단

편집 2

나는 3.9로 업데이트하고 곧 다시 테스트합니다 - 다른 항목 시험 전에 완료 될 때까지 그냥 기다리고. 나는 결과를 게시 할 것이다.

감사 나단

EDIT 3 같은 이상한 문제. 다음은 POI 3을 사용하는 스택 추적입니다.9 : 나는 POIFSFileSystem에 NPOIFSFileSystem에서 전환 한

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 
    at org.apache.poi.poifs.filesystem.BlockStore$ChainLoopDetector.claim(BlockStore.java:95) 
    at org.apache.poi.poifs.filesystem.NPOIFSStream$StreamBlockByteBufferIterator.next(NPOIFSStream.java:212) 
    at org.apache.poi.poifs.filesystem.NPOIFSStream$StreamBlockByteBufferIterator.next(NPOIFSStream.java:186) 
    at org.apache.poi.poifs.property.NPropertyTable.buildProperties(NPropertyTable.java:88) 
    at org.apache.poi.poifs.property.NPropertyTable.<init>(NPropertyTable.java:66) 
    at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.readCoreContents(NPOIFSFileSystem.java:379) 
    at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:202) 
    at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:163) 
    at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:145) 
    at com.turnitin.datamap.parser.standard.XLSParser.defineParsableObject(XLSParser.java:67) 
    at com.turnitin.datamap.parser.standard.XLSParser.setUp(XLSParser.java:56) 
    at com.turnitin.datamap.parser.standard.XLSParser.<init>(XLSParser.java:46) 
    at com.turnitin.datamap.controller.DataMapController.parseData(DataMapController.java:264) 
    at com.turnitin.datamap.controller.DataMapController.processControl(DataMapController.java:162) 
    at com.turnitin.datamap.controller.DataMapController.processStart(DataMapController.java:130) 
    at com.turnitin.datamap.controller.DataMapController.main(DataMapController.java:61) 

감사 나단

EDIT 4 :

FileInputStream fis = new FileInputStream(this.getFileToParse()); 
    POIFSFileSystem excelFile = new POIFSFileSystem(fis); 
    Workbook wb = WorkbookFactory.create(excelFile); 

이 나에게 다음과 같은 스택 추적 제공 :

java.io.IOException: block[ 1273 ] already removed - does your POIFS have circular or duplicate block references? 
    at org.apache.poi.poifs.storage.BlockListImpl.remove(BlockListImpl.java:89) 
    at org.apache.poi.poifs.storage.RawDataBlockList.remove(RawDataBlockList.java:34) 
    at org.apache.poi.poifs.storage.BlockAllocationTableReader.fetchBlocks(BlockAllocationTableReader.java:221) 
    at org.apache.poi.poifs.storage.BlockListImpl.fetchBlocks(BlockListImpl.java:123) 
    at org.apache.poi.poifs.storage.RawDataBlockList.fetchBlocks(RawDataBlockList.java:34) 
    at org.apache.poi.poifs.property.PropertyTable.<init>(PropertyTable.java:63) 
    at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:159) 
    at com.turnitin.datamap.parser.standard.XLSParser.defineParsableObject(XLSParser.java:68) 
    at com.turnitin.datamap.parser.standard.XLSParser.setUp(XLSParser.java:56) 
    at com.turnitin.datamap.parser.standard.XLSParser.<init>(XLSParser.java:46) 
    at com.turnitin.datamap.controller.DataMapController.parseData(DataMapController.java:264) 
    at com.turnitin.datamap.controller.DataMapController.processControl(DataMapController.java:162) 
    at com.turnitin.datamap.controller.DataMapController.processStart(DataMapController.java:130) 
    at com.turnitin.datamap.controller.DataMapController.main(DataMapController.java:61) 

파일이 존재하며 유효한 XLS 파일임을 알고 있습니다.

Java 1.7 및 Poi 3.9를 사용하고 있습니다.

응용 프로그램에/usr/자바/data_map_tool에서 실행하고 파일을 다운로드/홈/javaapp/data_map_files

응용 프로그램이 해당 디렉토리의 소유자 인 javaapp 사용자로 실행에서 처리됩니다 .

한순간에 나는 응용 프로그램이 실행중인 디렉토리 내의 디렉토리에 다운로드 된 파일을 가지고 있었지만 작동했습니다. 그러나 파일 크기는 파일 저장소로 사용하는 것을 금지합니다.

누구든지 이것에 대해 머리를 벽에 부딪히는 사람이 있습니까?

+0

는 전체 스택 트레이스를 게시 할 수 있을까요? 그리고 최신 버전의 Apache POI (3.9)를 사용해 보셨습니까? – Gagravarr

+0

Excel에서 파일을 열고 "다른 이름으로 저장"을 수행하면 새 파일이 제대로 열립니까? NPOIFSFileSytem 및 POIFSFileSystem의 예외는 저수준 OLE2 구조에서 계속 진행되고있는 문제가 있음을 나타냅니다 .... 또한 문제 파일이 공개적으로 사용 가능합니까? – Gagravarr

+0

나는 그것을 시도했지만 문제가 해결되지 않습니다. 불행히도이 파일은 공개적으로 사용할 수 없습니다. 그러나 xsl 파일에 아랍어 문자가 포함되어 있다는 사실을 알 수 있습니다. 그것은 잠재적 인 문제와 해결책을 나타 냅니까? 지금까지 도움을 주셔서 감사합니다. – nathj07

답변

0

글쎄, 나는 그것을 부숴 버렸다! 제안 된 것처럼 원본 소스 파일에 문제가 있습니다. 짧은 이야기를 자르려면 그것은 BOM이었습니다. XSL 파일의 시작 부분에 Byte Order Marker가 있습니다. Java 응용 프로그램이 FileInputStream을 사용하여 이것을 열면 혼란이 발생합니다.

그래서, 난 그냥 아파치 평민 IO에서

BOMInputStream(); 

으로 파일을 열려면 내 코드를 업데이트했습니다.

이 문제가 해결되었습니다.

많은 감사 나단