然后在PHPExcel中自动调整列添加大标题文本而不会弄乱宽度

时间:2015-06-30 08:53:34

标签: phpexcel

我正在使用PHPExcel创建电子表格。我想添加数据,然后使用setAutoSize(true)设置列宽... 然后我想为页面添加一个不可避免地大于其列的标题。我遇到的问题是列自动调整到标题的宽度,即使我在setAutoSize(true)调用后添加它。

我已经尝试将该列的autosize设置为false,这只是将列恢复为其默认宽度。我已经尝试将自动大小设置为true,获取列的宽度,然后将auto size设置为false,然后设置列的宽度。这只是将宽度设置为上述默认值。下面是我的代码片段......

    while($row = $this->getRow()){

        ++$currentrow;
        for($i = 0;$i < count($row); $i++){
                $sheet->setCellValueByColumnAndRow($i + 1, $currentrow,$row[$i]);
        }
    }

    // now that we have put all the data in the spreadsheet, auto fit the columns...

    for($i = 1;$i <= $this->columnCount; $i++){

        // this bit converts an integer into an excel column (such as 2 = 'B' or 28 = 'AB')
        if($i + 64 > 90){
            $col = "A" . chr($i + 38);
        }else{
            $col = chr($i + 64);
        }

        $sheet->getColumnDimension($col)->setAutoSize(true);  
        /* this is causing the column containing the title to autosize
        to the title's width after the title is added further down the code.*/

    }

    $titlecolwidth = $sheet->getColumnDimension('B')->getWidth();
    $sheet->getColumnDimension('B')->setAutoSize(false);
    $sheet->getColumnDimension('B')->setWidth($titlecolwidth);

    // Add the heading...

    if(isset($heading)){    
        $sheet->setCellValueByColumnAndRow(1, 2,$heading);  
        $sheet->getCellByColumnAndRow(1,2)->getStyle()->getFont()->setSize(20);
    }

在excel中手动创建电子表格时,这类事情很容易实现 - 添加数据,执行自动调整列,然后添加标题。包含标题的列保持其先前设置的宽度(在添加标题之前)

有没有办法用phpexcel实现相同的效果?

我确实浏览了一下文档,但找不到自动调整列的内容,但是一旦完成匹配就不再使用了。

2 个答案:

答案 0 :(得分:2)

我通过查看另一个stackoverflow问题(How to PHPExcel set auto-columns width)找到了自己如何做到这一点。

如果我在自动调整后调用$sheet->calculateColumnWidths();,则'getwidth'调用将返回有效宽度,我的代码将起作用....

    // added line...
    $sheet->calculateColumnWidths();

    //original code...
    $titlecolwidth = $sheet->getColumnDimension('B')->getWidth();
    $sheet->getColumnDimension('B')->setAutoSize(false);
    $sheet->getColumnDimension('B')->setWidth($titlecolwidth);

答案 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
    }
}

https://stackoverflow.com/a/35027357/3591273