2012-10-03 17 views
8

मैं XLSX फ़ाइलों को लिखने के लिए अपाचे के पीओआई एपीआई का उपयोग कर रहा हूं। चूंकि मुझे बड़ी फाइलें लिखने की ज़रूरत है, इसलिए मैं स्ट्रीमिंग एपीआई (एसएक्सएसएसएफ) का उपयोग कर रहा हूं। ऐसा करने के लिए, मैं this मार्गदर्शिका का पालन कर रहा हूं। ध्यान दें कि उदाहरण के अंत तकअपाचे पीओआई: SXSSFWorkbook.dispose() मौजूद नहीं है

wb.dispose 

यह डब्ल्यूबी उदाहरण एक SXSSFWorkbook उदाहरण को संदर्भित करता है। मैं अपने कोड में इसका उपयोग कर रहा हूं लेकिन यह निपटान विधि के बारे में शिकायत नहीं करता है। मैंने स्रोत कोड डाउनलोड किया और विधि वहां नहीं है। हालांकि, उनके SVN करने के लिए जा रहा है और यह जांच करना कि वर्ग 'कोड हम वहाँ विधि देख सकते हैं:

https://svn.apache.org/repos/asf/poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFWorkbook.java

मैं पहले से ही अपने कोड पुन: संयोजित करने की कोशिश की, लेकिन मैं त्रुटियों की एक बहुत कुछ मिलता है ...

+0

क्यों SVN से पूरे codebase चेकआउट और निर्माण कि चींटी के साथ नहीं? या हाल ही में एक रात का निर्माण पकड़ो? – Gagravarr

+0

@Gagravarr वर्तमान संस्करण 3.9-बीटा 1 है और मैं वास्तव में वास्तव में costumers के लिए बीटा एपीआई का उपयोग करना टालना चाहता था ... –

+0

यदि आप नई सुविधाओं का उपयोग करना चाहते हैं, तो आपको नई रिलीज का उपयोग करने की आवश्यकता है ... – Gagravarr

उत्तर

7

2012-12-03 तक, पीओआई 3.9 स्थिर रिलीज के रूप में उपलब्ध है। इस रिलीज में SXSSFWorkbook में dispose() विधि उपलब्ध है।

(बेशक, मामला यह नहीं था जब प्रश्न पूछा गया था।)

12

अपाचे पीओआई 3.8 (उस समय नवीनतम स्थिर) प्रत्येक शीट के लिए एक अस्थायी एक्सएमएल फ़ाइल बनाता है (एसएक्सएसएसएफ का उपयोग करते समय) लेकिन इन फ़ाइलों को हटाने का विकल्प नहीं देता है। यह तथ्य इस एपीआई को उपयोग करने के लिए अच्छा नहीं बनाता है क्योंकि अगर मैं 600 एमबी डेटा निर्यात कर रहा हूं तो मेरे पास 600 एमबी के साथ 2 फाइलें होंगी और उनमें से एक अस्थायी फ़ोल्डर में तब तक हटा दी जाएगी जब तक इसे हटाया नहीं जाता है।

कोड में खोदने पर, हम देखते हैं कि SXSSFSheet में SheetDataWriter का उदाहरण है। यह अंतिम वर्ग File उदाहरण द्वारा प्रदर्शित अस्थायी फ़ाइल को लिखने और बनाए रखने के लिए ज़िम्मेदार है। इस ऑब्जेक्ट को एक्सेस करने से फ़ाइल को मिटाने की अनुमति मिल जाएगी। ये सभी उदाहरण निजी हैं, सैद्धांतिक रूप से, आप उन्हें एक्सेस नहीं कर सकते हैं। हालांकि, प्रतिबिंब के माध्यम से, हम इस उपयोगी लेकिन कष्टप्रद फ़ाइलों को हटाने के लिए File उदाहरण तक पहुंच सकते हैं!

निम्नलिखित विधियों को ऐसा करने की अनुमति है। deleteSXSSFTempFiles पर कॉल करके, उस कार्यपुस्तिका की सभी अस्थायी फ़ाइलें हटा दी जाती हैं।

/** 
* Returns a private attribute of a class 
* @param containingClass The class that contains the private attribute to retrieve 
* @param fieldToGet The name of the attribute to get 
* @return The private attribute 
* @throws NoSuchFieldException 
* @throws IllegalAccessException 
*/ 
public static Object getPrivateAttribute(Object containingClass, String fieldToGet) throws NoSuchFieldException, IllegalAccessException { 
    //get the field of the containingClass instance 
    Field declaredField = containingClass.getClass().getDeclaredField(fieldToGet); 
    //set it as accessible 
    declaredField.setAccessible(true); 
    //access it 
    Object get = declaredField.get(containingClass); 
    //return it! 
    return get; 
} 

/** 
* Deletes all temporary files of the SXSSFWorkbook instance 
* @param workbook 
* @throws NoSuchFieldException 
* @throws IllegalAccessException 
*/ 
public static void deleteSXSSFTempFiles(SXSSFWorkbook workbook) throws NoSuchFieldException, IllegalAccessException { 

    int numberOfSheets = workbook.getNumberOfSheets(); 

    //iterate through all sheets (each sheet as a temp file) 
    for (int i = 0; i < numberOfSheets; i++) { 
     Sheet sheetAt = workbook.getSheetAt(i); 

     //delete only if the sheet is written by stream 
     if (sheetAt instanceof SXSSFSheet) { 
      SheetDataWriter sdw = (SheetDataWriter) getPrivateAttribute(sheetAt, "_writer"); 
      File f = (File) getPrivateAttribute(sdw, "_fd"); 

      try { 
       f.delete(); 
      } catch (Exception ex) { 
       //could not delete the file 
      } 
     } 
    } 
} 
संबंधित मुद्दे