PHPExcel如何设置自动列宽
Posted
技术标签:
【中文标题】PHPExcel如何设置自动列宽【英文标题】:How to PHPExcel set auto-columns width 【发布时间】:2012-06-11 06:01:04 【问题描述】:我正在使用 phpExcel 导出数据以供下载。当打开下载的文件时,单元格的编号很大,它显示“#######”而不是值编号。我为每一列尝试了setAutoSize()
,然后调用$sheet->calculateColumnWidths()
,但它仍然没有改变。我看到 calculateColumnWidths() at here,@Mark Baker 说“calculateColumnWidths() 将值增加 5% 以尝试确保整个列适合”。如果单元格中的数字长度超过 5%,似乎确实解决了问题
更新 这是我自动调整列大小的功能:
function autoFitColumnWidthToContent($sheet, $fromCol, $toCol)
if (empty($toCol) ) //not defined the last column, set it the max one
$toCol = $sheet->getColumnDimension($sheet->getHighestColumn())->getColumnIndex();
for($i = $fromCol; $i <= $toCol; $i++)
$sheet->getColumnDimension($i)->setAutoSize(true);
$sheet->calculateColumnWidths();
【问题讨论】:
您在计算中应用了哪种自动调整大小方法?大约还是精确?您是否使用任何特定的字体?还是粗体/斜体样式?这个数字计算得有多远?也许增加 10% 会比 5% 更好。 @MarkBaker 我已经为我的问题更新了示例代码。我使用了 ColumnDimension 类的 setAutoSize()。 【参考方案1】:第一个潜在问题可能是您正在使用列字母。 PHP 的增量操作将使用列字母,因此如果 $i 是 'A',则 $i++ 将给出 'B',如果 $i 是 'Z',则 $i++ 将给出 'AA';但是您不能使用
代替
for($i = $fromCol; $i <= $toCol; $i++)
使用
$toCol++;
for($i = $fromCol; $i !== $toCol; $i++)
要在调用 $sheet->calculateColumnWidths() 后添加 5% 的边距:
for($i = $fromCol; $i !== $toCol; $i++)
$calculatedWidth = $sheet->getColumnDimension($i)->getWidth();
$sheet->getColumnDimension($i)->setWidth((int) $calculatedWidth * 1.05);
【讨论】:
谢谢!我使用setWidth((int) $calculatedWidth * 1.4);
来适应 16 位数字。它工作得很好,但我仍然希望有一个函数自动完全计算并设置列宽^^。
@Panique 它对我有用。你可以试试这个setWidth((int) $calculatedWidth * 1.4);
,把1.4改成更大的值,1.6或者1.8...
@all 我删除了我的评论,因为问题就在我这边。我真的很抱歉,并给了你们所有人+1。愿力量与你同在!
增加宽度后不要忘记在列上调用->setAutoSize(false)
。否则,您在调用 $sheet->calculateColumnWidths()
之前设置的 setAutoSize(true)
将在保存到 Excel 文件时取代您手动设置的宽度。【参考方案2】:
没有任何建议对我有用,所以我进行了手动计算(相当简单和快速)(示例代码如下)并且效果很好(注意字体/样式是默认设置,但很容易调整为其他字体或样式)
foreach((array)$data as $sheet_data)
$maxwidth = array( );
$objPHPExcel->setActiveSheetIndex( $i++ );
$sheet = $objPHPExcel->getActiveSheet( );
if ( !empty($sheet_data['title']) )
$sheet->setTitle($sheet_data['title']);
if ( !empty($sheet_data['rows']) )
foreach((array)$sheet_data['rows'] as $row=>$cols)
foreach((array)$cols as $col=>$val)
$p = strpos($col,':');
if ( false !== $p )
// range
$range = $col; $xy = substr( $col, 0, $p );
$col = substr($xy,0,-1);
// estimate maximum column width by number of characters
$w = mb_strlen( $val );
if ( !isset($maxwidth[$col]) ) $maxwidth[$col] = $w;
elseif ( $w > $maxwidth[$col] ) $maxwidth[$col] = $w;
$sheet->mergeCells( $range );
$sheet->setCellValue( $xy, $val );
$sheet->getStyle( $range )
->getAlignment( )
->setHorizontal( PHPExcel_Style_Alignment::HORIZONTAL_CENTER )
->setVertical( PHPExcel_Style_Alignment::VERTICAL_CENTER )
;
else
$xy = $col.$row;
// estimate maximum column width by number of characters
$w = mb_strlen( $val );
if ( !isset($maxwidth[$col]) ) $maxwidth[$col] = $w;
elseif ( $w > $maxwidth[$col] ) $maxwidth[$col] = $w;
$sheet->setCellValue( $xy, $val );
$sheet->getStyle( $xy )
->getAlignment( )
->setHorizontal( PHPExcel_Style_Alignment::HORIZONTAL_CENTER )
->setVertical( PHPExcel_Style_Alignment::VERTICAL_CENTER )
;
// autosize columns based on calculation + some padding
foreach($maxwidth as $col=>$width)
$sheet->getColumnDimension( $col )->setAutoSize( false );
$sheet->getColumnDimension( $col )->setWidth( (int)($width * 1.2) ); // add padding as well
【讨论】:
以上是关于PHPExcel如何设置自动列宽的主要内容,如果未能解决你的问题,请参考以下文章