我正在使用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实现相同的效果?
我确实浏览了一下文档,但找不到自动调整列的内容,但是一旦完成匹配就不再使用了。
答案 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
}
}