我正在尝试自动调整工作表的列大小。我正在写文件,最后尝试调整所有列的大小。
// 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');
[如果将列设置为AutoSize,PHPExcel会尝试根据列的计算值(因此根据任何公式的结果)以及格式掩码(例如千位分隔符)添加的任何其他字符来计算列宽。
默认情况下,这是estimated
宽度:基于使用GD的更精确的计算方法是可用的,它还可以处理字体样式功能,例如粗体和斜体;但这是一个很大的开销,因此默认情况下将其关闭。您可以使用
PHPExcel_Shared_Font::setAutoSizeMethod(PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT);
但是,自动调整大小并不适用于所有Writer格式...例如CSV。您没有提及您正在使用的作家。
但是您还需要标识列以设置尺寸:
foreach(range('B','G') as $columnID) {
$objPHPExcel->getActiveSheet()->getColumnDimension($columnID)
->setAutoSize(true);
}
[$objPHPExcel->getActiveSheet()->getColumnDimension()
需要列ID。
$objPHPExcel->getActiveSheet()->getColumnDimensions()
将返回所有已定义列维记录的数组;但是除非明确创建了列维记录(例如通过加载模板或通过手动调用getColumnDimension()
),否则该记录将不存在(内存保存)。
如果有人在寻找这个。
下面的分辨率也适用于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版本上有一个列迭代器,但不知道如何自动调整其列对象,基本上,我已经创建了一个循环,从真正的最先使用的列到真正的最后一个使用的列。
在这里:
//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
。而且在循环中是一个错误,您必须在<
中不使用<=
。否则,他会过多地进入循环中。]
// Auto-size all columns for each worksheet
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
foreach ($worksheet->getColumnIterator() as $column) {
$worksheet
->getColumnDimension($column->getColumnIndex())
->setAutoSize(true);
}
}
如果需要在多张纸上并且每张纸上有多列,则可以通过以下方法遍历所有这些:
// 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);
}
希望这会有所帮助;)
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 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);
}
}
对于phpspreadsheet:
$sheet = $spreadsheet->getActiveSheet(); // $spreadsheet is instance of PhpOffice\PhpSpreadsheet\Spreadsheet
foreach (
range(
1,
Coordinate::columnIndexFromString($sheet->getHighestColumn(1))
) as $column
) {
$sheet
->getColumnDimension(Coordinate::stringFromColumnIndex($column))
->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(例如,在'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'列并将自动调整大小设置为每一列。