我正在使用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();
}
答案 0 :(得分:28)
第一个潜在的问题可能是你正在使用专栏信。 PHP的递增器操作将使用列字母,因此如果$ i为'A',则$ i ++将给出'B',如果$ i为'Z',则$ i ++将给出'AA';但你不能使用&lt; =作为比较器,因为'AA'在执行直接比较时是&lt; ='Z'。
而不是
for($i = $fromCol; $i <= $toCol; $i++) {
使用
$toCol++;
for($i = $fromCol; $i !== $toCol; $i++) {
要在调用$ sheet-&gt; calculateColumnWidths()之后添加5%的保证金,请执行以下操作:
for($i = $fromCol; $i !== $toCol; $i++) {
$calculatedWidth = $sheet->getColumnDimension($i)->getWidth();
$sheet->getColumnDimension($i)->setWidth((int) $calculatedWidth * 1.05);
}
答案 1 :(得分:0)
这些建议都没有对我有用,所以我做了一个手动计算(相当简单快速)(示例代码如下)并且工作正常(注意字体/样式是默认的,但很容易调整其他字体或样式)
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
}
}