Ширина стовпця автоматичного розміру PHPExcel


100

Я намагаюся автоматично розмістити стовпці аркуша. Я пишу файл і врешті-решт намагаюся змінити розмір усіх своїх стовпців.

// 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ширина: доступний більш точний метод обчислення, заснований на використанні GD, який також може обробляти функції стилю шрифту, такі як жирний і курсивний; але це набагато більший накладні витрати, тому він вимкнено за замовчуванням. Ви можете ввімкнути більш точний розрахунок, використовуючи

PHPExcel_Shared_Font::setAutoSizeMethod(PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT);

Однак автоматичний розмір не застосовується до всіх форматів програми Writer ... наприклад, CSV. Ви не згадуєте, якого письменника ви використовуєте.

Але вам також потрібно визначити стовпці, щоб встановити параметри:

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

$objPHPExcel->getActiveSheet()->getColumnDimension() очікує ідентифікатор стовпця.

$objPHPExcel->getActiveSheet()->getColumnDimensions()поверне масив усіх визначених записів про розмірність стовпців; але якщо запис розмірності стовпців явно не створено (можливо, завантажуючи шаблон або вручну викликаючи getColumnDimension()), він не буде існувати (збереження пам'яті).


Дуже дякую. Це працює. Він не обчислює додатковий інтервал, створений із жирного шрифту, хоча це очікується (я десь читав його). Чи можете ви оновити свою відповідь, щоб включити і це?
Alkis Kalogeris

1
Якщо вам потрібна така ступінь точності в стилі шрифту, як напівжирний або курсив, тоді вам потрібно використовувати PHPExcel_Shared_Font :: AUTOSIZE_METHOD_EXACT, але це набагато повільніше
Марк Бейкер

Це нормально, мені все одно. Хоча я не знаю, як це зробити. Я використовую 01simple-download-xls.php з папки Тест. Де я додати цей рядок? Вибачте за моє повне неподання. Я тільки почав з цим грати.
Алкіс Калогеріс

2
Крім того, якщо ви не хочете повторювати букви стовпців, а індекси, скористайтеся статичним методом PHPExcel_Cell :: stringFromColumnIndex ($ columnIndex), щоб отримати лист стовпця
MeatPopsicle

@MarkBaker Чи є якийсь метод, який можна зробити з одним оператором, щоб ми могли встановити ширину стовпців, наведених у списку. В даний час я використовую $ activeSheetObj-> getColumnDimension ('G') -> setWidth (35); стовпці у списку можуть бути будь-якого порядку.
Rosa Mystica

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. Дякую тонну!
Гіссвард

23

Ось більш гнучкий варіант, заснований на публікації @Mark Baker:

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); }
Натан

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

2
хороша відповідь, але має бути $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

Цей фрагмент коду автоматично визначає розмір усіх стовпців, що містять дані на всіх аркушах. Немає необхідності використовувати засіб отримання та налаштування ActiveSheet.

// 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 стовпців. Наприклад, коли найвищий стовпчик: "AH", функція діапазону не працюватиме належним чином.
Сандер Ван Кір


3

У випадку, якщо хтось цього шукав.

Роздільна здатність нижче також працює над PHPSpreadsheetїх новою версією PHPExcel.

// 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

Якщо ви спробуєте перебрати 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

Приходьте пізно, але, шукаючи всюди, я створив рішення, яке, здається, "єдине".

Будучи відомим, що в останніх версіях API є ітератор стовпців, але не знаючи, як самостійно налаштувати об’єкт стовпця, я в основному створив цикл для переходу від реального першого використовуваного стовпця до реального останнього використовуваного.

Ось справа:

//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

Вам також потрібно визначити стовпці, щоб встановити параметри:

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

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

5
Будь ласка, переформатуйте свою відповідь і подумайте над цим: у хорошій відповіді завжди буде пояснення того, що було зроблено і чому це було зроблено таким чином, не тільки для ОП, але і для майбутніх відвідувачів ПС.
B001,

1

Для Spreedsheet + PHP 7, ви повинні написати замість PHPExcel_Cell::columnIndexFromString, \PhpOffice\PhpSpreadsheet\Cell::columnIndexFromString. І в циклі є помилка, з якою ви <не повинні працювати <=. В іншому випадку він бере занадто багато стовпців у цикл.


1
// Auto-size columns for all worksheets
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
    foreach ($worksheet->getColumnIterator() as $column) {
        $worksheet
            ->getColumnDimension($column->getColumnIndex())
            ->setAutoSize(true);
    } 
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.