2012-06-07 250 views
28

我正在使用PHPExcel导出数据以供下载。打开下载的文件时,如果单元格数量很大,则会显示“#######”而不是数值。我试过setAutoSize()每列,然后调用$sheet->calculateColumnWidths()但它仍然没有改变。我看到calculateColumnWidths()at here,@Mark Ba​​ker说“calculateColumnWidths()增加了大概5%的值,以确保整列适合”。如果细胞数长度超过5%,似乎DOEN的解决了这个问题如何PHPExcel设置自动列宽度

UPDATE 这是我的功能,自动调整大小列:

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

您应用哪种自动调整方法计算?大约还是精确?你在使用任何特定的字体吗?或大胆/斜体样式?这个数字有多远?也许增加10%会好于5%。 –

+0

@MarkBaker我已经更新了我的问题的示例代码。我使用ColumnDimension类的setAutoSize()。 – Davuz

回答

28

一是潜在的问题可能是你正在使用列字母。 PHP的增量操作可以使用列字母,所以如果$ i是'A',那么$ i ++会给'B',如果$ i是'Z'而不是$ i ++会给'AA';但不能使用< =作为比较器,因为'AA'为< ='Z'时作为直接比较执行。

而不是

for($i = $fromCol; $i <= $toCol; $i++) { 

使用

$toCol++; 
for($i = $fromCol; $i !== $toCol; $i++) { 

要调用$片状> calculateColumnWidths后添加5%的保证金()做的事:

for($i = $fromCol; $i !== $toCol; $i++) { 
    $calculatedWidth = $sheet->getColumnDimension($i)->getWidth(); 
    $sheet->getColumnDimension($i)->setWidth((int) $calculatedWidth * 1.05); 
} 
+0

谢谢!我使用'setWidth((int)$ calculatedWidth * 1.4);'来适应16位数字。它工作良好,但我仍然希望有一个函数自动完成计算并设置列宽^^。 – Davuz

+1

@Panique它与我合作。你可以试试这个'setWidth((int)$ calculatedWidth * 1.4);',将1.4改为一个更大的值,1.6或1.8 ... – Davuz

+0

@我删除了我的评论,因为问题出在我身上。我真的很抱歉,给你一个+1。力量可能与你同在! – Sliq

0

的建议无工作对我来说,我做了一个手动计算(相当容易和快速)(示例代码如下),并完美工作(注意字体/ st yles是默认的,但它很容易调整为其他字体或样式)

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