Intereting Posts

Ширина столбца ширины PHPExcel

Я пытаюсь автоматизировать размер столбцов моего листа. Я пишу файл, и в конце я пытаюсь изменить размер всех моих столбцов.

// 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');

    Если столбец установлен в AutoSize, PHPExcel пытается вычислить ширину столбца на основе вычисленного значения столбца (так на результат любых формул) и любых дополнительных символов, добавленных форматными масками, такими как тысячи разделителей.

    По умолчанию это estimated ширина: возможен более точный метод расчета, основанный на использовании GD, который также может обрабатывать функции стиля шрифта, такие как жирный и курсивный; но это намного больше накладных расходов, поэтому по умолчанию он отключен. Вы можете включить более точный расчет, используя

     PHPExcel_Shared_Font::setAutoSizeMethod(PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT); 

    Однако autosize не распространяется на все форматы Writer … например, CSV. Вы не говорите, какой писатель вы используете.

    Но вам также нужно определить столбцы для установки измерений:

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

    $objPHPExcel->getActiveSheet()->getColumnDimension() ожидает идентификатор столбца.

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

    Если вам нужно сделать это на нескольких листах и ​​на нескольких столбцах на каждом листе, вот как вы можете перебирать все из них:

     // 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); } } 

    Здесь более гибкий вариант, основанный на сообщении @Mark Baker:

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

    Надеюсь это поможет 😉

    Это пример использования всех столбцов на листе:

     $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 ); } 
     for ($i = 'A'; $i != $objPHPExcel->getActiveSheet()->getHighestColumn(); $i++) { $objPHPExcel->getActiveSheet()->getColumnDimension($i)->setAutoSize(TRUE); } 

    Этот фрагмент кода будет автоматически определять все столбцы, содержащие данные на всех листах. Нет необходимости использовать приемник и сеттер 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); } } 

    Если вы пытаетесь выполнить итерацию с помощью for ($col = 2; $col <= 'AC'; ++ $col){...} или с foreach(range('A','AC') as $col) {...} он будет работать для столбцов от A до Z, но он не пройдет Z (пример итерации между «A» и «AC»).

    Чтобы итератировать pass '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» и установите autoisize для каждого столбца.

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

    Приходите поздно, но после поиска повсюду я создал решение, которое, кажется, «одно».

    Известно, что на последних версиях 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'); 

    вам также необходимо определить столбцы для установки размеров:

     foreach (range('A', $phpExcelObject->getActiveSheet()->getHighestDataColumn()) as $col) { $phpExcelObject ->getActiveSheet() ->getColumnDimension($col) ->setAutoSize(true); } 
     $col = 'A'; while(true){ $tempCol = $col++; $objPHPExcel->getActiveSheet()->getColumnDimension($tempCol)->setAutoSize(true); if($tempCol == $objPHPExcel->getActiveSheet()->getHighestDataColumn()){ break; } } в $col = 'A'; while(true){ $tempCol = $col++; $objPHPExcel->getActiveSheet()->getColumnDimension($tempCol)->setAutoSize(true); if($tempCol == $objPHPExcel->getActiveSheet()->getHighestDataColumn()){ break; } } 

    Для Spreedsheet + PHP 7 вы должны написать вместо PHPExcel_Cell::columnIndexFromString , \PhpOffice\PhpSpreadsheet\Cell::columnIndexFromString . И в цикле ошибка, вы должны < не работать с <= . В противном случае он слишком сильно перебирает колонку.

    В случае, если кто-то искал это.

    Приведенное ниже решение также работает с 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) – Получить столбец с наибольшим getHighestDataColumn($row = null) , содержащий данные.

    getHighestRow($column = null) – Получить высочайшую строку листа

    getHighestDataRow($column = null) – Получить высочайшую строку листа, содержащую данные.