2012-06-07 2 views
28

Я работаю с PHPExcel для экспорта данных для загрузки. Когда открытые загруженные файлы, с ячейками имеют большое количество, вместо «номер» показывают «#######». Я опробован setAutoSize() для каждого столбца, затем звоните $sheet->calculateColumnWidths(), но он по-прежнему не изменяется. Я вижу calcColumnWidths() at here, @Mark Baker говорит, что «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 Я обновил пример кода для моего вопроса. Я использовал setAutoSize() класса ColumnDimension. – 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++) { 

Чтобы добавить маржу 5% после вызова $ sheet-> calculateColumnWidths() сделать:

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

Спасибо! Я использую 'setWidth ((int) $ calculateWidth * 1.4);' подходит для 16 цифр. Он работает хорошо, но я все еще надеюсь, что функция auto полностью рассчитана и задает ширину столбца ^^. – Davuz

+1

@Panique Это работает со мной. Вы можете попробовать эту 'setWidth ((int) $ calculateWidth * 1.4);', изменить 1.4 на большее значение, 1.6 или 1.8 ... – Davuz

+0

@all Я удалил свой комментарий, поскольку проблема была на моей стороне. Я действительно извиняюсь и дал вам все +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 
    } 
} 
Смежные вопросы