2013-04-19 6 views
6

निम्नलिखित कोड का उपयोग करना, सेल मूल्य मेरी एक्सेल स्प्रेडशीट में किए गए परिवर्तनों को सहेजा नहीं हैं:Apache POI OPCPackage क्यों बंद नहीं होगा() विधि लिखने योग्य फ़ाइल खोलने के लिए सामग्री को सहेज/लिखती है?

OPCPackage pkg = OPCPackage.open(inputFile); 
XSSFWorkbook wb = new XSSFWorkbook(pkg); 

ModifyWorkbook(); 

pkg.close(); 

निम्नलिखित एक समाधान मैंने लिखा है, लेकिन मुझे समझ नहीं आता क्यों यह आवश्यक है।

OPCPackage pkg = OPCPackage.open(inputFile); 
XSSFWorkbook wb = new XSSFWorkbook(pkg); 

ModifyWorkbook(); 

File tmp = File.createTempFile("tempSpreadsheet", ".xlsx"); 
FileOutputStream newExcelFile = new FileOutputStream(tmp); 
wb.write(newExcelFile); 
newExcelFile.close(); 
tmp.deleteOnExit(); 
pkg.close(); 

विषय पर जावाडॉक्स और गाइड इंगित करते हैं कि .close() विधि को सहेजना और बंद करना चाहिए। बंद होने से पहले संशोधित कोशिकाओं के मानों पर जांच करता है, यह इंगित करता है कि परिवर्तन किए गए हैं, लेकिन अकेले pkg.close() विधि बंद होने पर फ़ाइल में उन परिवर्तनों को लिखने के लिए पर्याप्त नहीं है।

उत्तर

2

OPCPackage.close() पर एक कॉल अंतर्निहित OOXML फ़ाइल संरचना को बंद कर देगा। यह नहीं करेगा कि एक्सएसएसएफ (या एक्स एक्स? एफ प्रारूपों में से कोई भी) उनके परिवर्तन लिखने का कारण बनता है। तो, आप एक अन-बदली गई फाइल लिखेंगे ....

यदि आप निम्न स्तर के संशोधन कर रहे हैं, तो आप OPCPackage खोल सकते हैं, परिवर्तन कर सकते हैं, फिर उन्हें लिखने के करीब कॉल कर सकते हैं। यदि आप उच्च स्तरीय सामान कर रहे हैं, तो आप OPCPackage खोलें, परिवर्तन करने के लिए UserModel कोड के साथ काम करें, फिर इसके परिवर्तन लिखने के लिए usermodel से पूछें। यह आखिरी कदम है जो महत्वपूर्ण है।

आपके मौजूदा कोड को कुछ हद तक की तरह है:

File f = new File("test.txt"); 
Sting s = readFileCompletely(f); 
s = s.replaceAll("foo", "bar"); 
f.close(); 
// Why hasn't the file contents changed? 

में फ़ाइल को पढ़ने और उच्च स्तर की वस्तुओं को संशोधित करने के लिए पर्याप्त नहीं है, आप भी परिवर्तन को लिखने के लिए उच्च स्तर पर वस्तुओं को बताने के लिए की जरूरत है। (उच्च स्तरीय प्रदर्शन के कारणों के लिए स्मृति में कैश बातें वस्तुओं)

1

एक (XSSF) पर close कॉलिंग वर्कबुक OPCP.close जो जावाडोक राज्यों कॉल करेगा:

myWorkbook.close() कॉलिंग दायर करने के लिए यह था परिवर्तन लिखना चाहिए से खुला।

हालांकि, वर्तमान संस्करण (3.15) में ऐसा करने में समस्याएं प्रतीत होती हैं। कारण स्वयं ही अज्ञात है, लेकिन मुझे पता चला कि myWorkbook.write() पर कॉल करने से न केवल आउटपुट स्ट्रीम में बदलाव आएंगे, बल्कि बंद होने के बाद आपके वर्तमान उदाहरण भी होंगे।

एक उचित समाधान का इसलिए हो सकता है:

try (OutputStream bos = ByteStreams.nullOutputStream()){ 
    workbook.write(bos); 
    workbook.close(); 
} catch (IOException e) { 
    log.error("Could not write Output File", e); 
} 

यहाँ Guavas ByteStreams के साथ किया। other शून्य आउटपुट स्ट्रीम कार्यान्वयन का उपयोग करने के लिए स्वतंत्र महसूस करें।

संबंधित मुद्दे