Apache POI Excel - विस्तारित किए जाने वाले कॉलम को कैसे कॉन्फ़िगर करें?


102

मैं कुछ डेटा आउटपुट Apache POI APIकरने के लिए उपयोग कर रहा हूं excel spreadsheet

जब मैं स्प्रेडशीट बनाई और खोली जाती है, तो कॉलम का विस्तार नहीं किया जाता है, इसलिए डेट फॉरमेट किए गए टेक्स्ट जैसे कुछ लंबे टेक्स्ट पहली नज़र में दिखाई नहीं दे रहे हैं।

मैं स्तंभ की चौड़ाई को समायोजित करने के लिए सीमा को विस्तारित करने या खींचने के लिए एक्सेल में स्तंभ सीमा को केवल डबल क्लिक कर सकता हूं, लेकिन 20+ कॉलम हो सकता है और ऐसा कोई तरीका नहीं है जो मैं चाहता हूं कि मैन्युअल रूप से हर बार मैं स्प्रेडशीट खोलूं :(

मुझे पता चला (हालांकि गलत तरीका हो सकता है) groupRow()और setColumnGroupCollapsed()चाल करने में सक्षम हो सकता है लेकिन कोई भाग्य नहीं। शायद मैं इसे गलत तरीके से इस्तेमाल कर रहा हूं।

नमूना कोड स्निपेट

        Workbook wb = new HSSFWorkbook();
        CreationHelper createHelper = wb.getCreationHelper();
        //create sheet
        Sheet sheet = wb.createSheet("masatoSheet");

        //not really working yet.... :(
        //set group for expand/collapse
        //sheet.groupRow(0, 10); //just random fromRow toRow argument values...
        //sheet.setColumnGroupCollapsed(0, true);

        //create row
        Row row = sheet.createRow((short)0);
        //put a cell in the row and store long text data
        row.createCell(0).setCellValue("Loooooooong text not to show up first");

जब यह स्प्रेडशीट बनाई जाती है, तो "Looooooong टेक्स्ट पहले नहीं दिखा" स्ट्रिंग सेल में है, लेकिन चूंकि कॉलम का विस्तार नहीं किया गया है इसलिए केवल "Loooooooo" दिखाई दे रहा है।

मैं इसे कैसे कॉन्फ़िगर कर सकता हूं ताकि जब मैं अपनी स्प्रेडशीट खोलूं, तो कॉलम पहले से ही विस्तारित हो ???



आप इसे पूरा करने के लिए POI का उपयोग करने का एक तरीका ढूंढ रहे हैं। लेकिन इसे केवल एक्सेल में करने के लिए पूरी शीट का चयन करें और AB कॉलम शीर्षक सीमा पर डबल क्लिक करें। यदि आपको कई शीटों के लिए ऐसा करने की आवश्यकता है तो एक कोडित समाधान आपको बेहतर सेवा दे सकता है।
औसत

जवाबों:


176

बाद आप पत्रक के लिए अपने सभी डेटा को शामिल किया है, तो आप कॉल कर सकते हैं autoSizeColumn(int column)उचित आकार करने के लिए कॉलम AutoFit करने के लिए अपने पत्र पर

यहां एपीआई का लिंक दिया गया है

अधिक पोस्ट के लिए यह पोस्ट देखें अपाचे पोई का उपयोग करते समय सामग्री के आकार के लिए एक्सेल सेल आकार फिटिंग में समस्या


8
बस यह इंगित करना चाहता था कि autoSizeColumnअच्छी तरह से पैमाने नहीं हैं और यदि आपके पास बहुत सारी पंक्तियाँ हैं तो सुपर धीमी होगी । मुझे इस विषय में जो सुझाव दिया गया था, मुझे थोड़ा हैक करना पड़ा और कुछ ऐसा ही करना पड़ा ।
lbstr

8
AutoSizeColumn के बारे में चेतावनी , इसके लिए java फ़ॉन्ट उपलब्ध होना चाहिए। यह सर्वर पर उपयोग किए जाने वाले हेडलेस जावा jre का हिस्सा नहीं है और यह NullPointerException को फेंक देगा।
स्टीफन डिलन

@StephenDillon फ़ॉन्ट विन्यास के लिए अशक्त सूचक को ठीक करने का कोई विचार?
वीशाल

हमें सबसे अच्छा तरीका यह लगा कि हम कॉल में प्रत्येक पंक्ति पर लूप करते हैं, सबसे लंबी चार लंबाई पाते हैं और x + को एक बफर से गुणा करते हैं। एक्स परीक्षण और त्रुटि का उपयोग करता है यह देखने के लिए कि क्या फिट बैठता है लेकिन यह एक चार की औसत चौड़ाई होनी चाहिए। फ़ॉन्ट के बिना मुझे विश्वास नहीं है कि आप वास्तव में इसे सही कर सकते हैं, लेकिन हम बहुत करीब हैं। अन्यथा आप उपयोगकर्ता को इसे खोलने के बाद पहली बार इसे ठीक करने के लिए एक्सेल में एक मैक्रो जोड़ सकते हैं, यह सबसे अच्छी विधि थी लेकिन मैक्रोज़ को सक्षम करने की आवश्यकता है
स्टीफन डिलन

46

टिप: ऑटो आकार का काम करने के लिए, डेटा को एक्सेल में पॉप्युलेट करने के बाद कॉल किया sheet.autoSizeColumn(columnNumber)जाना चाहिए ।

डेटा को पॉप्युलेट करने से पहले विधि को कॉल करने से कोई प्रभाव नहीं पड़ेगा।


stackoverflow.com/questions/37069820/… कभी-कभी जो काम नहीं कर रहा है
user7856586

यहां दिया गया उत्तर जावा से संबंधित है, जबकि टिप्पणी में प्रदान किया गया लिंक Android से संबंधित है। उत्तर अभी भी सभी जावा मामलों में काम करता है (हेडलेस जावा जेआरई को छोड़कर, जिसमें जावा फ़ॉन्ट उपलब्ध नहीं है)।
उन्नी क्रिश

धन्यवाद, मैंने फंक की गणना की, और सेटकोल्युमिड का इस्तेमाल निम्नलिखित तरीके से किया: (5 until row.lastCellNum).forEach { colNum -> val columnWidth = (row.getCell(colNum).toString().length * 0.44 + 2.24) * 768 reportSheet.setColumnWidth(colNum, columnWidth.toInt()) }
user7856586

@ user7856586 मेरे लिए इस विधि को थोड़ा और विस्तार से बता सकते हैं
महरोज़ मुस्तफ़ा

39

यदि आप किसी कार्यपुस्तिका के सभी स्तंभों को स्वत: आकार देना चाहते हैं, तो यहां एक विधि है जो उपयोगी हो सकती है:

public void autoSizeColumns(Workbook workbook) {
    int numberOfSheets = workbook.getNumberOfSheets();
    for (int i = 0; i < numberOfSheets; i++) {
        Sheet sheet = workbook.getSheetAt(i);
        if (sheet.getPhysicalNumberOfRows() > 0) {
            Row row = sheet.getRow(sheet.getFirstRowNum());
            Iterator<Cell> cellIterator = row.cellIterator();
            while (cellIterator.hasNext()) {
                Cell cell = cellIterator.next();
                int columnIndex = cell.getColumnIndex();
                sheet.autoSizeColumn(columnIndex);
            }
        }
    }
}

मैं हो रही है NullPointerExceptionपर row.cellIterator()। क्या ऐसा इसलिए है क्योंकि सेल में मेरा कोई मूल्य नहीं है?
राकी

10

आप कुछ इस तरह की कोशिश कर सकते हैं:

HSSFSheet summarySheet = wb.createSheet();
summarySheet.setColumnWidth(short column, short width);

यहाँ पराम हैं: शीट में कॉलम संख्या और इसकी चौड़ाई लेकिन, चौड़ाई की इकाइयाँ बहुत छोटी हैं, आप उदाहरण के लिए 4000 कोशिश कर सकते हैं।


धन्यवाद जानकर अच्छा लगा! मुझे लगता है कि मेरे उद्देश्य के लिए जहां कॉलम स्ट्रिंग गतिशील रूप से उत्पन्न हो सकती है, ऑटो-साइज़िंग विधि मामले में फिट होगी।
मियो


5

नीचे नमूना कोड

HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("your sheet name");
HSSFRow row = sheet.createRow(0);

cell = row.createCell(0);
cell.setCellValue("A BIG NAME WITH AUTO SIZE FEATURE ENABLED");

// यह महत्वपूर्ण है

sheet.autoSizeColumn(0);

// तर्क सेल नंबर होना चाहिए

cell = row.createCell(1);
cell.setCellValue("a big name without auto size feature enabled");

आउटपुट की जाँच करें और पागल हो :)


2
sheet.setColumnWidth (columnIndex, चौड़ाई) भी एक ऐसी विधि है जिसे आप देखना चाहते हैं
Mateen

3

यदि आप अपने कॉलम की गिनती जानते हैं (तो यह संग्रह सूची के बराबर है)। आप बस एक शीट के सभी स्तंभों को समायोजित करने के लिए इस एक लाइनर का उपयोग कर सकते हैं (यदि आप कम से कम जावा 8 का उपयोग करते हैं)।

IntStream.range(0, columnCount).forEach((columnIndex) -> sheet.autoSizeColumn(columnIndex));

1

मैं नीचे सरल समाधान का उपयोग करता हूं:

यह आपकी कार्यपुस्तिका और पत्रक है:

XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("YOUR Workshhet");

फिर कॉलम और पंक्तियों के साथ अपनी शीट में डेटा जोड़ें। एक बार शीट में डेटा जोड़ने के साथ autoSizeColumnचौड़ाई के लिए निम्नलिखित कोड लिखें ।

for (int columnIndex = 0; columnIndex < 15; columnIndex++) {
                    sheet.autoSizeColumn(columnIndex);
                }

यहां, 15 के बजाय, आप अपनी शीट में कॉलम की संख्या जोड़ते हैं।

आशा है कि कोई इसकी मदद करे।


0

इसका बहुत ही सरल, यह एक लाइन कोड dataSheet.autoSizeColumn (0) का उपयोग करें

या ब्रैकेट में कॉलम की संख्या dataSheet.autoSizeColumn (सेल नंबर) दें


0

आप पाठ को भी लपेट सकते हैं। PFB नमूना कोड:

CellStyle wrapCellStyle = new_workbook.createCellStyle();
                    wrapCellStyle.setWrapText(true);

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.