2012-06-07 27 views
28

Pracuję z PHPExcel, aby wyeksportować dane do pobrania. Kiedy otwarte pobrane pliki z komórkami mają dużą liczbę, zamiast numeru wartości wyświetlają się "#######". Zostałem wypróbowany setAutoSize() dla każdej kolumny, a następnie zadzwonić pod numer $sheet->calculateColumnWidths(), ale wciąż nie zmienia się. Widzę calculColumnWidths() at here, @mark Baker mówi "calculColumnWidths() zwiększyć wartość o 5%, aby spróbować i upewnić się, że cała kolumna pasuje". Jeśli długość numer w komórce przekracza 5%, wydaje się doen na rozwiązało problemuJak ustawić szerokość kolumny PHPExcel auto-kolumny

UPDATE To jest moja funkcja do kolumn auto size:

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

metoda, która autoSize ty stosując do obliczeń? W przybliżeniu lub dokładny? Czy używasz jakiejś konkretnej czcionki? lub pogrubienie/kursywa? Jak daleko jest obliczona ta liczba? Być może dodanie 10% będzie lepsze niż 5%. –

+0

@MarkBaker Zaktualizowałem przykładowy kod do mojego pytania. Użyłem klasy setAutoSize() klasy ColumnDimension. – Davuz

Odpowiedz

28

Pierwszy potencjalnym problemem może być to, że pracujemy z litery kolumn. Inkrementacja PHP będzie działać z literami kolumn, więc jeśli $ i jest "A", to $ i ++ da "B", a jeśli $ i jest "Z", to $ ++ da "AA"; ale nie możesz użyć < = jako komparatora, ponieważ "AA" to < = "Z", gdy wykonywane jest jako porównanie proste.

Zamiast

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

użycie

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

Aby dodać margines 5% po wywołaniu $> calculateColumnWidths postaci arkusza() zrobić:

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

Dziękujemy! Używam 'setWidth ((int) $ calculateWidth * 1.4);' do dopasowania 16 cyfr. Działa dobrze, ale nadal mam nadzieję, że funkcja automatycznie oblicza się i ustawia szerokość kolumny ^^. – Davuz

+1

@Panique To działa ze mną. Możesz spróbować tego 'setWidth ((int) $ calculateWidth * 1.4);', zmienić 1.4 na większą wartość, 1.6 lub 1.8 ... – Davuz

+0

@all Usunąłem swój komentarz, ponieważ problem był po mojej stronie. Naprawdę przepraszam i daję ci +1. Moc może być z tobą! – Sliq

0

Żadna z sugestii pracował dla mnie więc zrobiłem ręczne obliczenia (raczej łatwe i szybkie) (przykładowy kod podąża za nim) i działa idealnie (uwaga czcionki/ul yles są domyślne, ale byłoby łatwo dostosować do innej czcionki lub stylu)

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 
    } 
} 
Powiązane problemy