2011-11-17 16 views
6

से CellStyle हटाना Apache POI का उपयोग करना ... मैं workbook.CreateCellStyle() का इस्तेमाल किया है, अगर थोड़ी देर के बाद मैं बनाया CellStyle नष्ट करने के लिए की जरूरत है ... मैं इसे कैसे कार्यपुस्तिका से निकालते हैं? मैं यह अभी भी बनी हुई है, भले ही यह अप्रयुक्त है देख सकते हैं।Apache POI कार्यपुस्तिका

क्या मैं जरूरत workbook.deleteCellStyle (cellStyle.getIndex()) की तरह कुछ है,

org.apache.poi.hssf.usermodel.HSSFOptimiser.optimiseCellStyles(HSSFWorkbook) 

उत्तर

3

स्रोत से आंकना निम्न विधि अप्रयुक्त CellStyles हटा देता है।

+0

ऐसा लगता है कि यह नौकरी करना चाहिए ... लेकिन इसे चलाने से वास्तव में कुछ भी नहीं होता है! मैं बाद में इसे फिर से डीबग करने की कोशिश करूंगा। – AhHatem

1

सेल हो रही है और शैली के लिए कुछ भी काम कर सकते हैं की स्थापना:

HSSFRow hr= workBook.getSheet("SheetName").getRow(rowIndex); 
HSSFCell hc=hr.getCell(cellIndex); 
hc.setCellStyle(null); 

करने का प्रयास करें यह यह आपके लिए काम करेंगे कर सकते हैं

+1

शैली अभी भी फाइल में संग्रहीत की जाएगी। कुछ दिनों के लिए खोज करने के बाद, मेरा दावा है कि अपाचे पीओआई का उपयोग करके कार्यपुस्तिका से शैली को हटाने का कोई सीधा तरीका नहीं है। – user1581900

1

आप समस्या को हल एक नव निर्मित कार्यपुस्तिका पर किसी भी आवश्यक cellstyles साथ डेटा को कॉपी करके काम कर सकता था। cellstyle "अस्तित्व" पर्दे के पीछे गाड़ी, या नहीं होने के लिए अच्छी तरह से सोच समझकर प्रकट होता है।

+0

यह एक अच्छी सलाह नहीं है। क्या होगा यदि पुस्तक में 3 या अधिक भारी डेटा है और ओपी को केवल एक सेल को हटाने की आवश्यकता है? –

+1

"3 या अधिक भारी डेटा" क्या है? और: वह कोशिकाओं को हटा नहीं रहा है, वह बिना संदर्भित सेल स्टाइल से छुटकारा पाना चाहता है। एक कामकाज एक कामकाज है, और यह एक है, और समाधान नहीं, तो: तो क्या। यदि आपके पास एक है, तो हमें बताएं। – TheBlastOne

+0

सेलस्टाइल का अस्तित्व, कोशिकाओं के मूल्यों की प्रतिलिपि बनाते समय, कोई नहीं है। शैलियों को पीछे छोड़ दिया जाएगा। इसका मतलब है कि मुझे नई कार्यपुस्तिका में नई शैलियों को बनाने की आवश्यकता होगी। सेलस्टाइल प्रबंधक इस कार्य के साथ मेरी मदद कर सकता है। हालांकि मैं प्रदर्शन के बारे में चिंतित हूं। @ लुइगी: आप सही हैं। ऐसे मामले होंगे जहां कोई शैलियों को हटाया नहीं जाएगा, लेकिन मुझे अभी भी यह सुनिश्चित करना होगा कि कोई अप्रयुक्त/डुप्लीकेट नहीं है। – user1581900

4

r1391891 के रूप में, HSSFOptimiser डुप्लिकेट सेल शैलियों को हटाने के अलावा, गैर-उपयोग की गई शैलियों को भी हटा देगा।

तो, अपने आप को हाल ही में एक रात का निर्माण/SVN चेकआउट निर्माण हड़पने (या बस एक महीने या तो में 3.9-beta1 रिहाई के लिए रुको!), और फिर कुछ ऐसा कार्य करें:

NPOIFSFileSystem poifs = new NPOIFSFileSystem(new File("/path/to/excel/file.xls")); 
HSSFWorkbook wb = new HSSFWorkbook(poifs.getRoot()); 
HSSFOptimiser.optimiseCellStyles(wb); 

FileOutputStream fout = new FileoutputStream("optimised.xls"); 
wb.write(fout); 
fout.close() 

उसके बाद, optimsed.xls कोई डुप्लिकेट सेल शैलियों, और कोई गैर-इस्तेमाल किया सेल शैलियों शामिल होंगे। (यदि आप पहले से मौजूद नहीं हैं, तो आप फ़ाइल को बनाने के अंत में आसानी से ऑप्टिमाइज़ चरण डाल सकते हैं)

नोट - HSSFOptimiser दृष्टिकोण केवल xxF फ़ाइलों के लिए काम करेगा, न कि XSSF .xlsx वाले के लिए। यह बहुत अधिक नहीं काम के साथ दृष्टिकोण सामान्यीकरण करने के लिए संभव हो जाना चाहिए, लेकिन अब के लिए यह HSSF केवल ....

+1

यह मेरे (सामान्य-सामान्य) उत्तर - +1 का उपयोगी और सुपरचार्ज संस्करण है। – TheBlastOne

+0

यह दृष्टिकोण मुझे ओओएक्सएमएल प्रारूप (*। Xlsx फ़ाइलों) के साथ छोड़कर समस्या का केवल आधा हल करता है। दूसरी तरफ, xlsx -> xls -> xlsx को कन्वर्ट करना मुश्किल नहीं होना चाहिए। मुझे इसे आजमाएं और देखें कि प्रदर्शन क्या है। – user1581900

+0

@Gagravarr Xlsx के लिए ऐसा करने का कोई तरीका है ... ?? –

2

वहाँ वर्तमान स्रोत कोड में कोई सीधा तरीका है:

यह कैसे शैली बनाया जाता है :

public short getNumCellStyles() 
{ 
    return (short) workbook.getNumExFormats(); 
} 

साथ

public HSSFCellStyle createCellStyle() 
{ 
    ... 
    ExtendedFormatRecord xfr = workbook.createCellXF(); 
    short index = (short) (getNumCellStyles() - 1); 
    HSSFCellStyle style = new HSSFCellStyle(index, xfr, this); 
    return style; 
} 

और (InternalWorkbook में)

public int getNumExFormats() { 
    ... 
    return numxfs; 
} 

और कार्यपुस्तिका के साथ।createCellXF() को हल करने:

InternalWorkbook getWorkbook() { 
    return workbook; 
} 

और फिर InternalWorkbook वस्तु पर:

public ExtendedFormatRecord getExFormatAt(int index) { 
    int xfptr = records.getXfpos() - (numxfs - 1); 

    xfptr += index; 
    ExtendedFormatRecord retval = 
    (ExtendedFormatRecord) records.get(xfptr); 

    return retval; 
} 

public void removeExFormatRecord(ExtendedFormatRecord rec) { 
    records.remove(rec); // this updates XfPos for us 
    numxfs--; 
} 

तो यह सुनिश्चित करने के लिए

public ExtendedFormatRecord createCellXF() { 
    ExtendedFormatRecord xf = createExtendedFormat(); 

    records.add(records.getXfpos()+1, xf); 
    records.setXfpos(records.getXfpos() + 1); 
    numxfs++; 
    return xf; 
} 

तो क्या HSSFWorkbook से संभव है, कॉल करने के लिए है लघु कार्यपुस्तिका से छोटा, इस तरह कुछ:

InternalWorkbook w = workbook.getWorkbook(); 
ExtendedFormatRecord record = w.getExFormatAt(index); 
w.removeExFormatRecord(record); 

यह सब बहुत ही भयानक है :)

+0

को रोकने के लिए कोई तरीका है मुझे लगता है कि हो सकता है कि मुझे कुछ ले जाने के लिए। मैंने अभी विस्तारितफॉर्मैट रिकार्ड पर एक त्वरित नज़र डाली और ऐसा लगता है कि शैलियों और कोशिकाओं दोनों विस्तारित FormatRecords हैं। अगर मुझे इस इंडेक्स में शैली की सही संख्या पता है तो मुझे विश्वास है कि मैं इसे हटाने में सक्षम हूं। हालांकि, मुझे डर है कि कोशिकाओं से (हटाए गए) शैली के सभी संदर्भ दूषित हो जाएंगे ... – user1581900

+0

आपको संदर्भों को भी ठीक करना होगा, अन्यथा चीजें तोड़ेंगी जब आप हटाए गए एक्सएफ के ऑर्डर को घुमाएंगे । यह देखने के लिए कि क्या करने की आवश्यकता है, HSSFOptimiser पर एक नज़र डालें! – Gagravarr

+0

हालांकि यह मेरे प्रश्न का पूर्ण उत्तर नहीं है, लेकिन पीओआई स्रोत कोड के इस सरल प्रतिलिपि ने मुझे सही दिशा में इंगित किया। धन्यवाद! – user1581900

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