124 votes

PHPExcel : largeur automatique des colonnes

J'essaie de dimensionner automatiquement les colonnes de ma feuille. J'écris le fichier et à la fin j'essaie de redimensionner toutes mes colonnes.

// Add some data
$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('B1', 'test1111111111111111111111')
            ->setCellValue('C1', 'test1111111111111')
            ->setCellValue('D1', 'test1111111')
            ->setCellValue('E1', 'test11111')
            ->setCellValue('F1', 'test1')
            ->setCellValue('G1', 'test1');

foreach($objPHPExcel->getActiveSheet()->getColumnDimension() as $col) {
    $col->setAutoSize(true);
}
$objPHPExcel->getActiveSheet()->calculateColumnWidths();

Le code ci-dessus ne fonctionne pas. Il ne modifie pas la taille de la colonne pour l'adapter au texte.

UPDATE Le rédacteur que j'utilise $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');

228voto

Mark Baker Points 90240

Si une colonne est définie sur AutoSize, PHPExcel tente de calculer la largeur de la colonne sur la base de la valeur calculée de la colonne (donc sur le résultat de toute formule), et de tout caractère supplémentaire ajouté par les masques de format tels que les séparateurs de milliers.

Par défaut, il s'agit d'un estimated width : une méthode de calcul plus précise est disponible, basée sur l'utilisation de GD, qui peut également gérer les caractéristiques de style de police telles que le gras et l'italique ; mais il s'agit d'une surcharge beaucoup plus importante, elle est donc désactivée par défaut. Vous pouvez activer le calcul plus précis en utilisant

PHPExcel_Shared_Font::setAutoSizeMethod(PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT);

Cependant, la taille automatique ne s'applique pas à tous les formats Writer... par exemple CSV. Vous ne mentionnez pas quel rédacteur vous utilisez.

Mais vous devez également identifier les colonnes pour définir les dimensions :

foreach(range('B','G') as $columnID) {
    $objPHPExcel->getActiveSheet()->getColumnDimension($columnID)
        ->setAutoSize(true);
}

$objPHPExcel->getActiveSheet()->getColumnDimension() attend un ID de colonne.

$objPHPExcel->getActiveSheet()->getColumnDimensions() retournera un tableau de tous les enregistrements de dimension de colonne définis ; mais à moins qu'un enregistrement de dimension de colonne n'ait été explicitement créé (peut-être en chargeant un modèle, ou en appelant manuellement la commande getColumnDimension() ) alors il n'existera pas (économie de mémoire).

0 votes

Merci beaucoup. Cela fonctionne. Il ne calcule pas l'espacement supplémentaire créé par la police en gras, bien que cela soit attendu (je l'ai lu quelque part). Pourriez-vous mettre à jour votre réponse pour inclure cela aussi ?

1 votes

Si vous avez besoin de ce degré de précision avec des styles de caractères tels que le gras ou l'italique, vous devez utiliser PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT, mais c'est beaucoup plus lent.

0 votes

C'est bon, je m'en fiche. Bien que je ne sache pas comment le faire. J'utilise le fichier 01simple-download-xls.php du dossier Test. Où dois-je ajouter cette ligne ? Désolé pour mon manque total de connaissances. Je viens juste de commencer à jouer avec.

67voto

MrUpsidown Points 3561

Si vous devez le faire sur plusieurs feuilles, et plusieurs colonnes dans chaque feuille, voici comment vous pouvez les parcourir toutes par itération :

// Auto size columns for each worksheet
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {

    $objPHPExcel->setActiveSheetIndex($objPHPExcel->getIndex($worksheet));

    $sheet = $objPHPExcel->getActiveSheet();
    $cellIterator = $sheet->getRowIterator()->current()->getCellIterator();
    $cellIterator->setIterateOnlyExistingCells(true);
    /** @var PHPExcel_Cell $cell */
    foreach ($cellIterator as $cell) {
        $sheet->getColumnDimension($cell->getColumn())->setAutoSize(true);
    }
}

7 votes

C'est la meilleure solution, car elle ne nécessite pas de considération spéciale pour les colonnes passées Z.

3 votes

Je peux confirmer que cette réponse fonctionne parfaitement dans PhpSpreadSheet également. Merci beaucoup !

1 votes

Utilice $worksheet->getColumnIterator() pour simplifier les choses ici. Reportez-vous à ma réponse

28voto

TodStoychev Points 75

Voici une variante plus flexible basée sur le post de @Mark Baker :

foreach (range('A', $phpExcelObject->getActiveSheet()->getHighestDataColumn()) as $col) {
        $phpExcelObject->getActiveSheet()
                ->getColumnDimension($col)
                ->setAutoSize(true);
    } 

J'espère que cela vous aidera ;)

16 votes

Cela ne fonctionne que jusqu'à Z, car range('A', 'AB') ne retournera qu'un seul élément nommé 'A'. Ainsi, en utilisant range() dans ce cas n'est PAS une bonne idée !

8 votes

Cela fonctionne cependant : for ($i = 'A' ; $i != $phpExcelObject->getActiveSheet()->getHighestColumn() ; $i++) {Worksheet->getColumnDimension($i)->setAutoSize(TRUE) ; }.

0 votes

Ne l'utilisez pas. Veuillez consulter ma réponse qui utilise le $sheet->getColumnIterator()

21voto

BARNZ Points 97

N'utilisez pas la fonction range(), elle ne fonctionnera pas au-delà de la colonne Z.

Il suffit d'utiliser :

$sheet = $spreadsheet->getActiveSheet();
foreach ($sheet->getColumnIterator() as $column) {
    $sheet->getColumnDimension($column->getColumnIndex())->setAutoSize(true);
}

Faites-le après avoir écrit vos données afin que l'itérateur de colonnes sache sur combien de colonnes il doit itérer.

20voto

Nathan Points 2600
for ($i = 'A'; $i !=  $objPHPExcel->getActiveSheet()->getHighestColumn(); $i++) {
    $objPHPExcel->getActiveSheet()->getColumnDimension($i)->setAutoSize(TRUE);
}

4 votes

Bonne réponse mais devrait être $i <= $objPHPExcel->getActiveSheet()->getHighestColumn() sinon la dernière colonne n'est pas dimensionnée

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X