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,可以使用更加精确的计算方法,GD也可以处理粗体和斜体等字体样式的特征; 但这是一个更大的开销,所以它默认closures。 您可以使用更精确的计算

 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()需要一个列ID。

$objPHPExcel->getActiveSheet()->getColumnDimensions()将返回所有定义的列维度logging的数组; 但是除非明确创build了列维度logging(可能通过加载模板或手动调用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 Ba​​ker的更灵活的变体:

 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 getter和setter。

 // 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'之间的迭代)。

为了迭代通过'Z',你需要将列转换为整数,增量,比较,并再次获取它作为string:

 $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设置为每一列。

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

来得晚,但到处寻找后,我创造了一个似乎是“唯一”的解决scheme。

众所周知,在最后一个API版本中有一个列迭代器,但不知道如何自己调整列对象,基本上我创build了一个循环,从真正的第一列使用到最后使用的列。

这里是:

 //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 。 而在循环是一个错误,你必须<不适用于<= 。 否则,他会在循环中插入太多的列。

如果有人正在寻找这个。

下面的分辨率也适用于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()或最后一个实际的列replace。

这些方法做什么:

getHighestColumn($row = null) – 获取最高的工作表列。

getHighestDataColumn($row = null) – 获取包含数据的最高工作表列。

getHighestRow($column = null) – 获取最高的工作表行

getHighestDataRow($column = null) – 获取包含数据的最高工作表行。