2012-06-21 16 views
7

के साथ एक्सेल .XLSX पढ़ने में त्रुटि मैं वेब अनुप्रयोग में एक्सएलएसएक्स फ़ाइल पढ़ने के लिए अपाचे पीओआई 3.8 पुस्तकालयों का उपयोग कर रहा हूं। निम्न कोड जावा कंसोल ऐप से पूरी तरह से ठीक काम करता है:अपाचे पीओआई

InputStream inputFS = new FileInputStream("test.xlsx"); 
Workbook workbook = new XSSFWorkbook(inputFS); // below exception is thrown on this line 
Sheet sheet = workbook.getSheetAt(0); 

लेकिन वेब एप्लिकेशन में उपयोग किए जाने पर "पढ़ने त्रुटि" फेंकता है। (उसी क्रम में)

java.io.IOException: Read error 
at java.io.FileInputStream.readBytes(Native Method) ~[na:1.6.0_31] 
at java.io.FileInputStream.read(Unknown Source) ~[na:1.6.0_31] 
at java.io.FilterInputStream.read(Unknown Source) ~[na:1.6.0_31] 
at java.io.PushbackInputStream.read(Unknown Source) ~[na:1.6.0_31] 
at java.util.zip.ZipInputStream.readFully(Unknown Source) ~[na:1.6.0_31] 
at java.util.zip.ZipInputStream.readLOC(Unknown Source) ~[na:1.6.0_31] 
at java.util.zip.ZipInputStream.getNextEntry(Unknown Source) ~[na:1.6.0_31] 
at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource.<init>(ZipInputStreamZipEntrySource.java:51) ~[poi-ooxml-3.8-20120326.jar:3.8] 
at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:83) ~[poi-ooxml-3.8-20120326.jar:3.8] 
at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:228) ~[poi-ooxml-3.8-20120326.jar:3.8] 
at org.apache.poi.util.PackageHelper.open(PackageHelper.java:39) ~[poi-ooxml-3.8-20120326.jar:3.8] 
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:187) ~[poi-ooxml-3.8-20120326.jar:3.8] 
at com.corp.ReportManager.parseExcelReport(ReportManager.java:575) [ReportManager.class:na] 

निम्नलिखित जार classpath में शामिल किए गए हैं: स्टैक ट्रेस की एक प्रासंगिक निकालने नीचे चिपकाया जाता है

poi-3.8-20120326.jar 
poi-ooxml-3.8-20120326.jar 
poi-ooxml-schemas-3.8-20120326.jar 
xbean.jar 
dom4j-1.6.1.jar 

वहाँ एक स्मृति से संबंधित मुद्दों होना प्रतीत नहीं होता है चूंकि मैंने उपरोक्त कोड का आह्वान करने से पहले कुछ ढेर उपयोग आंकड़े एकत्र किए हैं। XLSX फ़ाइल आकार में 1.15 एमबी है।

##### Heap utilization statistics [MB] ##### 
Used Memory:13 MB 
Free Memory:9 MB 
Total Memory:23 MB 
Max Memory:247 MB 
+1

अपने वेब एप्लिकेशन देखें/फ़ाइल से अपने पढ़ने संशोधित कर सकते हैं? –

+0

वेब ऐप में फ़ाइल तक पहुंच है, अगर आप यही पूछ रहे हैं। यह केवल पढ़ता है (कोई संशोधित नहीं)। संबंधित नोट पर, वेब ऐप बिना किसी समस्या के एक्सएलएस (पुरानी बाइनरी प्रारूप) फ़ाइलों को संसाधित करता है। यह केवल एक्सएलएसएक्स फाइलों के साथ है जो इसे किसी समस्या में चलाता है। –

+0

उपयोग की जा रही नई सुविधाओं में से कोई भी है जो इसका समर्थन नहीं करता है? http://poi.apache.org/spreadsheet/index.html –

उत्तर

5

उपरोक्त कोड का उपयोग करने वाली विधि में एक पैरामीटर है - FileInputStream। कोड स्निपेट में पहली पंक्ति कोड का बहुत अधिक हिस्सा है, लेकिन इनवॉकिंग विधि का हिस्सा है। के बाद से सवाल में विधि एक अनुमान लगाने के लिए एक्सेल प्रारूप या यहां तक ​​कि एक फाइल एक्सटेंशन का ज्ञान नहीं था, मैंने तय कर लिया है कि मैं पहली बार के रूप में नीचे FileInputStream का उपयोग कर HSSF एपीआई पढ़ने की कोशिश करेंगे:

Sheet sheet = null; 
try { 

    POIFSFileSystem poifs = new POIFSFileSystem(inputFS); 
    Workbook workbook = new HSSFWorkbook(poifs); 
    sheet = workbook.getSheetAt(0); 
} 
catch (Exception e) { 
} 

if (sheet == null) { 

    try { 

     Workbook workbook = new XSSFWorkbook(inputFS); 
     sheet = workbook.getSheetAt(0); 
    } 
    catch (Exception e) { 
    } 
} 

समस्या उपर्युक्त कोड के साथ यह है कि XSSF API के माध्यम से इसे खोलने के दूसरे प्रयास के दौरान inputFS ऑब्जेक्ट की स्थिति अज्ञात है। और इसने read error उत्पन्न किया। मैं प्रतिस्थापित निम्नलिखित कोड है, जो ठीक काम करता है और इस मुद्दे को हल किया जाना प्रतीत होता है के साथ ऊपर:

Sheet sheet = null; 
try { 

    Workbook workbook = WorkbookFactory.create(inputFS); 
    sheet = workbook.getSheetAt(0); 
} 
catch (Exception e) { 
} 

मैं दोनों XLS (पुराने, बाइनरी) और XLSX (नवीनतम, XML- आधारित) स्वरूपों और इसके साथ यह परीक्षण किया काम करता है। हर किसी की मदद और इनपुट के लिए धन्यवाद!

1

ऐसा लगता है कि उनके XSSF API

+0

मैं एसएस एपीआई के माध्यम से अपने एक्सएसएसएफ एपीआई का उपयोग कर रहा हूं। जैसा कि मैंने पहले कहा था, वही कोड एक कंसोल एप्लिकेशन में ठीक काम करता है। यह वह वेब ऐप है जिसमें कोड में दूसरी पंक्ति निष्पादित करते समय कोई समस्या है। –

+0

और आप वेब एप्लिकेशन से पुराने प्रारूप के साथ काम कर सकते हैं? ऐसा लगता है कि यह होना चाहिए कि आप किसी भी कारण से फ़ाइल तक नहीं पहुंच सकते हैं, या आप इसका उपयोग कर रहे प्रारूप को नहीं पढ़ सकते हैं। –

+1

ऐसा लगता है कि वे अपने उदाहरण कोड में XSSFReader का उपयोग कर रहे हैं, जो आप नहीं कर रहे हैं। हालांकि, यह समझा नहीं जाता है कि यह कंसोल ऐप में क्यों काम करेगा ... जो अनुमति के मुद्दे के लिए अधिक समर्थन देता है। शायद यह देखने का प्रयास करें कि आपका ऐप इसे देख/पढ़ सकता है या नहीं? –

2

अपवाद उपयोग करने की आवश्यकता लग रहा है इंगित करता है वहाँ अपने InputStream के साथ कुछ हो रहा है कि। हालांकि, अगर आपके पास फ़ाइल है, तो उसे पीओआई में सीधे पास करें! इनपुटस्ट्रीम का उपयोग करने से स्मृति में सब कुछ बफरिंग की आवश्यकता होती है, जो अंतरिक्ष को खाती है। चूंकि आपको उस बफरिंग करने की आवश्यकता नहीं है, तो मत करो! बफरिंग से आपकी समस्या को ठीक करना चाहिए

यदि आप पीओआई के नवीनतम रात के निर्माण के साथ चल रहे हैं, तो यह बहुत आसान है। आपका कोड हो जाता है:

File file = new File("test.xlsx"); 
OPCPackage opcPackage = OPCPackage.open(file); 
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage); 

अन्यथा, यह बहुत समान है:

File file = new File("test.xlsx"); 
OPCPackage opcPackage = OPCPackage.open(file.getAbsolutePath()); 
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage); 

आप यकीन है कि अगर आपकी फ़ाइल, एक HSSFWorkbook या XSSFWorkbook है तो आप उचित एक खोलने के लिए WorkbookFactory उपयोग कर सकते हैं नहीं कर रहे हैं आपके लिए:

File file = new File("test.xlsx"); 
Workbook workbook = WorkbookFactory.create(file); 
+0

हां, मैं 'WorkbookFactory.create (...) 'का उपयोग करके समाप्त हुआ क्योंकि मुझे नहीं पता कि फ़ाइल HSSFWorkbook या XSSFWorkbook है या नहीं। –

+1

सुनिश्चित करें कि यदि आप वास्तविक फ़ाइल ऑब्जेक्ट रखते हैं तो आप इनपुटस्ट्रीम संस्करण की बजाय फ़ाइल संस्करण का उपयोग करें - यह तेज़ और कम स्मृति होगी! – Gagravarr

+0

मुझे 'java.lang.ClassNotFoundException: org.apache.poi.ss.usermodel.WorkbookFactory' क्यों मिलता है, जब मेरे पास lib में सभी जार होते हैं? (नेटबीन) – victorio

-3

उपयोग इस जार

<dependency> 
    <groupId>org.apache.xmlbeans</groupId> 
    <artifactId>xmlbeans</artifactId> 
    <version>2.3.0</version> 
</dependency>