2012-06-07 17 views
28

Sto lavorando con PHPExcel per esportare i dati per il download. Quando si aprono file scaricati, con celle con un numero elevato, mostra "#######" anziché il numero di valore. Sono provato setAutoSize() per ogni colonna, quindi chiamare $sheet->calculateColumnWidths() ma non cambia ancora. Vedo calculateColumnWidths() at here, @Mark Baker dice "calculateColumnWidths() aumenta il valore di forse il 5% per provare a garantire che l'intera colonna si adatti". Se la lunghezza numero nella cella supera il 5%, sembra doen del risolto il problemaCome impostare PHPExcel larghezza colonne automatiche

UPDATE Questa è la mia funzione di colonne automatico delle dimensioni:

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

Quale metodo di autosize stai applicando al calcolo? Approssimativo o esatto? Stai usando un font particolare? o in grassetto/corsivo? Quanto è calcolata la cifra? Forse l'aggiunta del 10% sarà migliore del 5%. –

+0

@MarkBaker Ho aggiornato il codice di esempio per la mia domanda. Ho usato setAutoSize() della classe ColumnDimension. – Davuz

risposta

28

primo potenziale problema potrebbe essere che si sta lavorando con lettere di colonna. L'operazione di incremento di PHP funzionerà con lettere di colonna, quindi se $ i è 'A', allora $ i ++ darà 'B', e se $ i è 'Z' di $ i ++ darà 'AA'; ma non è possibile utilizzare < = come comparatore, poiché "AA" è < = "Z" se eseguito come confronto diretto.

Invece di

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

uso

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

Per aggiungere il margine del 5% dopo aver chiamato $ PATRIMONIALE> calculateColumnWidths() DO:

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

Grazie! I Usa 'setWidth ((int) $ calculateWidth * 1.4);' misura 16 cifre. Funziona bene, ma spero ancora che una funzione sia completamente calcolata automaticamente e imposta la larghezza della colonna ^^. – Davuz

+1

@Panique Funziona con me. Puoi provare questo 'setWidth ((int) $ calculateWidth * 1.4);', modifica 1.4 ad un valore maggiore, 1.6 o 1.8 ... – Davuz

+0

@all Ho eliminato il mio commento in quanto il problema era dalla mia parte. Mi scuso davvero e ti ho dato un +1. Potrebbe essere il potere con te! – Sliq

0

Nessuno dei suggerimenti ha funzionato per me quindi ho fatto un calcolo manuale (piuttosto facile e veloce) (segue il codice di esempio) e funziona perfettamente (nota font/st yles sono predefiniti ma sarebbe facile da regolare per altri caratteri o stili)

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