PHPExcel ऑटो आकार स्तंभ चौड़ाई


101

मैं अपनी शीट के कॉलम को ऑटो आकार देने की कोशिश कर रहा हूं। मैं फ़ाइल लिख रहा हूं और अंत में मैं अपने सभी कॉलमों का आकार बदलने की कोशिश करता हूं।

// Add some data
$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('B1', 'test1111111111111111111111')
            ->setCellValue('C1', 'test1111111111111')
            ->setCellValue('D1', 'test1111111')
            ->setCellValue('E1', 'test11111')
            ->setCellValue('F1', 'test1')
            ->setCellValue('G1', 'test1');

foreach($objPHPExcel->getActiveSheet()->getColumnDimension() as $col) {
    $col->setAutoSize(true);
}
$objPHPExcel->getActiveSheet()->calculateColumnWidths();

उपरोक्त कोड काम नहीं करता है। पाठ को फिट करने के लिए कॉलम का आकार नहीं बदलता है

अद्यतन लेखक मैं उपयोग कर रहा हूँ$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');

जवाबों:


195

यदि कोई कॉलम AutoSize पर सेट है, तो PHPExcel स्तंभ की गणना की गई मान के आधार पर स्तंभ की चौड़ाई की गणना करने का प्रयास करता है (इसलिए किसी भी फ़ार्मुलों के परिणाम पर), और फॉर्मेट मास्क जैसे हज़ार विभाजकों द्वारा जोड़े गए किसी भी अतिरिक्त वर्ण।

डिफ़ॉल्ट रूप से, यह एक estimatedचौड़ाई है: एक अधिक सटीक गणना पद्धति उपलब्ध है, जो जीडी के उपयोग के आधार पर है, जो फ़ॉन्ट शैली सुविधाओं जैसे कि बोल्ड और इटैलिक को भी संभाल सकती है; लेकिन यह बहुत बड़ा ओवरहेड है, इसलिए इसे डिफ़ॉल्ट रूप से बंद कर दिया जाता है। आप उपयोग करके अधिक सटीक गणना सक्षम कर सकते हैं

PHPExcel_Shared_Font::setAutoSizeMethod(PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT);

हालाँकि, ऑटोसाइज़ सभी लेखक प्रारूपों पर लागू नहीं होता है ... उदाहरण के लिए CSV। आप इस बात का उल्लेख नहीं करते हैं कि आप किस लेखक का उपयोग कर रहे हैं।

लेकिन आपको आयाम सेट करने के लिए कॉलम की पहचान करने की भी आवश्यकता है:

foreach(range('B','G') as $columnID) {
    $objPHPExcel->getActiveSheet()->getColumnDimension($columnID)
        ->setAutoSize(true);
}

$objPHPExcel->getActiveSheet()->getColumnDimension() एक कॉलम आईडी की उम्मीद है।

$objPHPExcel->getActiveSheet()->getColumnDimensions()सभी परिभाषित स्तंभ आयाम रिकॉर्ड की एक सरणी लौटाएगा; लेकिन जब तक एक कॉलम आयाम रिकॉर्ड स्पष्ट रूप से नहीं बनाया गया है (शायद एक टेम्पलेट लोड करके, या मैन्युअल रूप से कॉल करके getColumnDimension()) तब यह मौजूद नहीं होगा (मेमोरी सेविंग)।


बहुत बहुत धन्यवाद। यह काम करता हैं। यह बोल्ड फ़ॉन्ट से बनाए गए अतिरिक्त रिक्ति की गणना नहीं करता है, हालांकि यह अपेक्षित है (मैंने इसे कहीं पढ़ा है)। क्या आप इसमें शामिल करने के लिए अपने उत्तर को अपडेट कर सकते हैं?
एल्किस कलोगेरिस

1
यदि आपको बोल्ड या इटैलिक जैसे टाइपफेस शैली के साथ सटीक डिग्री की आवश्यकता है, तो आपको PHPExcel_Sared_Font :: AUTOSIZE_METHOD_EXACT का उपयोग करने की आवश्यकता है, लेकिन यह बहुत धीमा है
मार्क बेकर

यह ठीक है मुझे परवाह नहीं है। हालांकि मुझे नहीं पता कि यह कैसे करना है। मैं परीक्षण फ़ोल्डर से 01simple-download-xls.php का उपयोग कर रहा हूं। मैं उस पंक्ति को कहां जोड़ूं? मेरी पूरी भलाई के लिए क्षमा करें। मैंने अभी इसके साथ खेलना शुरू किया है।
एल्किस कलोगेरिस

2
इसके अलावा, यदि आप कॉलम अक्षरों के माध्यम से पुनरावृति नहीं करना चाहते हैं, लेकिन इसके बजाय आप स्टैटिक विधि PHPExcel_Cell :: stringFromColumnIndex ($ columnIndex) का उपयोग कर स्तंभ पत्र प्राप्त कर सकते हैं
मीटपॉप्स मार्क

@MarkBaker क्या किसी एकल कथन के साथ करने के लिए कोई विधि उपलब्ध है ताकि हम किसी सूची में दिए गए स्तंभों की चौड़ाई निर्धारित कर सकें। वर्तमान में मैं $ ActiveSheetObj-> getColumnDimension ('G') -> setWidth (35) का उपयोग कर रहा हूं; सूची में कॉलम किसी भी क्रम का हो सकता है।
रोजा मिस्टिका

55

यदि आपको कई शीटों पर और प्रत्येक शीट में कई कॉलमों को करने की आवश्यकता है, तो यहां बताया गया है कि आप इन सभी के माध्यम से कैसे कर सकते हैं:

// Auto size columns for each worksheet
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {

    $objPHPExcel->setActiveSheetIndex($objPHPExcel->getIndex($worksheet));

    $sheet = $objPHPExcel->getActiveSheet();
    $cellIterator = $sheet->getRowIterator()->current()->getCellIterator();
    $cellIterator->setIterateOnlyExistingCells(true);
    /** @var PHPExcel_Cell $cell */
    foreach ($cellIterator as $cell) {
        $sheet->getColumnDimension($cell->getColumn())->setAutoSize(true);
    }
}

7
यह बेहतर समाधान है, क्योंकि इसमें पिछले Z. कॉलम के लिए एक विशेष विचार की आवश्यकता नहीं है।
एंथोनी

2
मैं इस उत्तर की पुष्टि PhpSpreadSheet में त्रुटिपूर्ण काम करता हूँ। अनेक अनेक धन्यवाद!
हिसवर्ड

$worksheet->getColumnIterator()यहां चीजों को सरल बनाने के लिए उपयोग करें। मेरे उत्तर को देखें
BARNZ

23

यहाँ @Mark बेकर पोस्ट पर आधारित एक और अधिक लचीला संस्करण:

foreach (range('A', $phpExcelObject->getActiveSheet()->getHighestDataColumn()) as $col) {
        $phpExcelObject->getActiveSheet()
                ->getColumnDimension($col)
                ->setAutoSize(true);
    } 

उम्मीद है की यह मदद करेगा ;)


14
यह केवल Z तक ही काम करता है, क्योंकि range('A', 'AB')सिर्फ 'A' नामक एक आइटम को वापस करेगा। तो range()इस मामले में उपयोग करना एक अच्छा विचार नहीं है!
माइकल

7
हालांकि यह काम करता है: ($ i = 'A'; $ i! = $ PhpExcelObject-> getActiveSheet () -> getHighestColumn (); $ i ++) {$ कार्यपत्रक- getColumnDimension ($ i) -> setAutoSize (TRUE); }
नाथन

इसका उपयोग न करें। कृपया मेरा जवाब देखें जो $sheet->getColumnIterator()
BARNZ

15
for ($i = 'A'; $i !=  $objPHPExcel->getActiveSheet()->getHighestColumn(); $i++) {
    $objPHPExcel->getActiveSheet()->getColumnDimension($i)->setAutoSize(TRUE);
}

3
अच्छा जवाब है, लेकिन $i <= $objPHPExcel->getActiveSheet()->getHighestColumn()अन्यथा अंतिम कॉलम का आकार नहीं होना चाहिए
billynoah

10

यह उदाहरण है कि वर्कशीट से सभी कॉलम का उपयोग कैसे करें:

$sheet = $PHPExcel->getActiveSheet();
$cellIterator = $sheet->getRowIterator()->current()->getCellIterator();
$cellIterator->setIterateOnlyExistingCells( true );
/** @var PHPExcel_Cell $cell */
foreach( $cellIterator as $cell ) {
        $sheet->getColumnDimension( $cell->getColumn() )->setAutoSize( true );
}

3
कृपया अपने उत्तर के आसपास कुछ संदर्भ जोड़कर बताएं कि यह समस्या का हल कैसे करता है
एंड्रयू स्टब्स

6

यह कोड स्निपेट उन सभी कॉलमों को स्वतः आकार देगा, जिनमें सभी शीट में डेटा होता है। एक्टिवशीट गेटटर और सेटर का उपयोग करने की कोई आवश्यकता नहीं है।

// In my case this line didn't make much of a difference
PHPExcel_Shared_Font::setAutoSizeMethod(PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT);
// Iterating all the sheets
/** @var PHPExcel_Worksheet $sheet */
foreach ($objPHPExcel->getAllSheets() as $sheet) {
    // Iterating through all the columns
    // The after Z column problem is solved by using numeric columns; thanks to the columnIndexFromString method
    for ($col = 0; $col <= PHPExcel_Cell::columnIndexFromString($sheet->getHighestDataColumn()); $col++) {
        $sheet->getColumnDimensionByColumn($col)->setAutoSize(true);
    }
}

6

phpspreadsheet के लिए:

$sheet = $spreadsheet->getActiveSheet(); // $spreadsheet is instance of PhpOffice\PhpSpreadsheet\Spreadsheet

foreach (
    range(
         1, 
         Coordinate::columnIndexFromString($sheet->getHighestColumn(1))
    ) as $column
) {
    $sheet
          ->getColumnDimension(Coordinate::stringFromColumnIndex($column))
          ->setAutoSize(true);
}

foreach (range('A', $sheet->getHighestDataColumn()) as $column) {$sheet->getColumnDimension($column)->setAutoSize(true);}
वेस्ले अब्बेनहिस

1
@WesleyAbbenhuis आपकी टिप्पणी केवल तभी काम करेगी जब 26 से अधिक कॉलम न हों। जब उच्चतम कॉलम उदाहरण के लिए: 'एएच' रेंज फ़ंक्शन ठीक से काम नहीं करेगा।
सैंडर वान कीर

3

मामले में किसी को इसकी तलाश थी।

नीचे दिया गया रिज़ॉल्यूशन PHPSpreadsheetPHPExcel के उनके नए संस्करण पर भी काम करता है ।

// assuming $spreadsheet is instance of PhpOffice\PhpSpreadsheet\Spreadsheet
// assuming $worksheet = $spreadsheet->getActiveSheet();
foreach(range('A',$worksheet->getHighestColumn()) as $column) {
    $spreadsheet->getColumnDimension($column)->setAutoSize(true);
}

नोट: अंतिम वास्तविक कॉलम के getHighestColumn()साथ प्रतिस्थापित किया जा सकता है getHighestDataColumn()

ये तरीके क्या करते हैं:

getHighestColumn($row = null) - उच्चतम वर्कशीट कॉलम प्राप्त करें।

getHighestDataColumn($row = null) - उच्चतम वर्कशीट कॉलम प्राप्त करें जिसमें डेटा हो।

getHighestRow($column = null) - उच्चतम वर्कशीट पंक्ति प्राप्त करें

getHighestDataRow($column = null) - उच्चतम वर्कशीट पंक्ति प्राप्त करें जिसमें डेटा हो।


2
foreach(range('B','G') as $columnID)
{
    $objPHPExcel->getActiveSheet()->getColumnDimension($columnID)->setAutoSize(true);
}

2

यदि आप के साथ for ($col = 2; $col <= 'AC'; ++ $col){...}या साथ पुनरावृति करने की कोशिश करते हैंforeach(range('A','AC') as $col) {...} इसके A से Z तक कॉलम के लिए काम करेंगे, लेकिन यह Z (उदा। 'A' से 'AC' के बीच) पास करने में विफल रहता है।

'Z' पास करने के लिए, आपको स्तंभ को पूर्णांक, वृद्धि, तुलना में बदलने और इसे स्ट्रिंग के साथ प्राप्त करने की आवश्यकता है:

$MAX_COL = $sheet->getHighestDataColumn();
$MAX_COL_INDEX = PHPExcel_Cell::columnIndexFromString($MAX_COL);
    for($index=0 ; $index <= $MAX_COL_INDEX ; $index++){
    $col = PHPExcel_Cell::stringFromColumnIndex($index);

    // do something, like set the column width...
    $sheet->getColumnDimension($col)->setAutoSize(TRUE);
}

इसके साथ, आप आसानी से 'Z' कॉलम को पास करते हैं और हर कॉलम में स्वतः-सेट करते हैं।


1

देर से आओ, लेकिन हर जगह खोज करने के बाद, मैंने एक समाधान बनाया है जो "एक" लगता है।

ज्ञात हो कि पिछले एपीआई संस्करणों पर एक स्तंभ पुनरावृत्ति है, लेकिन यह जानने के लिए नहीं है कि स्तंभ वस्तु को स्वयं पर कैसे लगाया जाए, मूल रूप से मैंने वास्तविक पहले इस्तेमाल किए गए कॉलम से वास्तविक अंतिम उपयोग किए जाने के लिए एक लूप बनाया है।

ये रहा:

//Just before saving de Excel document, you do this:

PHPExcel_Shared_Font::setAutoSizeMethod(PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT);

//We get the util used space on worksheet. Change getActiveSheet to setActiveSheetIndex(0) to choose the sheet you want to autosize. Iterate thorugh'em if needed.
//We remove all digits from this string, which cames in a form of "A1:G24".
//Exploding via ":" to get a 2 position array being 0 fisrt used column and 1, the last used column.
$cols = explode(":", trim(preg_replace('/\d+/u', '', $objPHPExcel->getActiveSheet()->calculateWorksheetDimension())));

$col = $cols[0]; //first util column with data
$end = ++$cols[1]; //last util column with data +1, to use it inside the WHILE loop. Else, is not going to use last util range column.
while($col != $end){
    $objPHPExcel->getActiveSheet()->getColumnDimension($col)->setAutoSize(true);

    $col++;
}

//Saving.
$objWriter->save('php://output');

1
// Auto-size columns for all worksheets
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
    foreach ($worksheet->getColumnIterator() as $column) {
        $worksheet
            ->getColumnDimension($column->getColumnIndex())
            ->setAutoSize(true);
    } 
}

0

आपको आयाम सेट करने के लिए कॉलम की पहचान करने की भी आवश्यकता है:

foreach (range('A', $phpExcelObject->getActiveSheet()->getHighestDataColumn()) as $col) {
$phpExcelObject
        ->getActiveSheet()
        ->getColumnDimension($col)
        ->setAutoSize(true);
}

0
$col = 'A';
while(true){
    $tempCol = $col++;
    $objPHPExcel->getActiveSheet()->getColumnDimension($tempCol)->setAutoSize(true);
    if($tempCol == $objPHPExcel->getActiveSheet()->getHighestDataColumn()){
        break;
    }
}

5
कृपया अपने उत्तर को सुधारें और इस बारे में सोचें: एक अच्छे उत्तर में हमेशा एक स्पष्टीकरण होगा कि क्या किया गया था और क्यों इस तरह से किया गया था, न केवल ओपी के लिए बल्कि भविष्य के आगंतुकों के लिए एसओ के लिए।
B001 B

0

Spreedsheet + पीएचपी 7 के लिए, आप के बजाय लिखना चाहिए PHPExcel_Cell::columnIndexFromString, \PhpOffice\PhpSpreadsheet\Cell::columnIndexFromString। और पाश में एक गलती है, वहाँ आप के <साथ काम नहीं करना चाहिए <=। अन्यथा, वह एक कॉलम को बहुत अधिक लूप में ले जाता है।


0

इन सभी जवाब थोड़े चूसना ... रेंज Z का उपयोग न करें () यह कॉलम Z से परे काम नहीं करेगा।

बस उपयोग करें:

$sheet = $spreadsheet->getActiveSheet();
foreach ($sheet->getColumnIterator() as $column) {
    $sheet->getColumnDimension($column->getColumnIndex())->setAutoSize(true);
}

ऐसा करने के बाद आप अपना डेटा लिखे ताकि कॉलम इटेटर को पता हो कि कितने कॉलम पर चलना है।

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