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 Baker的更灵活的变体:
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)
– 获取包含数据的最高工作表行。