Ширина колонки размера 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');

13 79

13 ответов:

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

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

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()) тогда он не будет существовать (сохранение памяти).

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

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

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

надеюсь, что это помогает ;)

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

этот фрагмент кода автоматически определяет размер всех столбцов, содержащих данные на всех листах. Нет необходимости использовать геттер и сеттер 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);
    }
}
foreach(range('B','G') as $columnID)
{
    $objPHPExcel->getActiveSheet()->getColumnDimension($columnID)->setAutoSize(true);
}

Если вы попытаетесь повторить с for ($col = 2; $col <= 'AC'; ++ $col){...} или foreach(range('A','AC') as $col) {...} он будет работать для столбцов от A до Z, но он не может передать Z (Ex. итерация между "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 " и установить авторазмер для каждого столбца.

в случае, если кто-то ищет этого.

разрешение ниже, также работает на 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) - получить самую высокую строку рабочего листа, которая содержит данные.

приходите поздно, но после поиска везде, я создал решение, которое, кажется, "один".

известно, что есть итератор столбца на последних версиях API, но не зная, как atuoadjust объект столбца он сам, в основном я создал цикл, чтобы перейти от реального первого используемого столбца к реальному последнему используемому.

вот он:

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

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