Ширина столбца ширины 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();

Приведенный выше код не работает. Не меняет размер столбца, чтобы он соответствовал тексту

UPDATE Автор, которого я использую $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

Надеюсь, что это поможет;)

Ответ 4

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

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

Ответ 5

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

Ответ 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);
    }
}

Ответ 7

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

Ответ 8

Если вы попытаетесь выполнить итерацию с помощью 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 для каждого столбца.

Ответ 9

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

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

Ответ 10

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

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

Ответ 11

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

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

Ответ 12

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

Ответ 13

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

Ответ 14

для phpspreadsheet:

$sheet = $this->spreadsheet->getActiveSheet();

foreach (range('A', $sheet->getHighestColumn()) as $column) {
    $sheet->getColumnDimension($column)->setAutoSize(true);
}