Ширина столбца размера 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);
однако autosize не применяется ко всем форматам записи... например, 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").
для итерации 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 " и установить autosize для каждого столбца.
на случай, если кто-то искал это.
разрешение ниже, также работает на 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)
- получить высокий лист row
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
. И в петле есть ошибка, там вы должны <
не работает с <=
. В противном случае, он слишком сильно втягивает колонку в петлю.