Ширина колонки размера 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 ответов:
если столбец имеет значение 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); }