PHPExcel auto taille colonne largeur

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. Ne modifie pas la taille de la colonne pour s'adapter au texte

Mettre à jour L'auteur que j'utilise $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');

79
demandé sur Captain Obvlious 2013-05-26 21:34:00

13 réponses

Si une colonne est définie sur AutoSize, PHPExcel tente de calculer la largeur de la colonne en fonction de la valeur calculée de la colonne (ainsi que du résultat de toutes les formules) et des caractères supplémentaires ajoutés par des masques de format tels que des séparateurs de milliers.

Par défaut, il s'agit d'une largeur estimated: une méthode de calcul plus précise est disponible, basée sur L'utilisation de GD, qui peut également gérer des fonctionnalités de style de police telles que le gras et l'italique; mais c'est une surcharge beaucoup plus grande, donc elle est 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, autosize ne s'applique pas à tous les formats D'écriture... par exemple CSV. Vous ne mentionnez pas quel écrivain 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 ait été explicitement créé (peut-être en chargeant un modèle, ou manuellement appeler getColumnDimension()) alors il n'existera pas (économie de mémoire).

165
répondu Mark Baker 2013-05-26 18:01:26

Si vous avez besoin de le faire sur plusieurs feuilles et plusieurs colonnes dans chaque feuille, voici comment vous pouvez parcourir tous:

// 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);
    }
}
36
répondu MrUpsidown 2014-10-06 10:58:35

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

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

J'espère que cela aide ;)

14
répondu TodStoychev 2014-07-07 12:19:51
for ($i = 'A'; $i !=  $objPHPExcel->getActiveSheet()->getHighestColumn(); $i++) {
    $objPHPExcel->getActiveSheet()->getColumnDimension($i)->setAutoSize(TRUE);
}
8
répondu Nathan 2016-04-28 21:06:06

Voici un exemple d'utilisation de toutes les colonnes de la feuille de calcul:

$sheet = $PHPExcel->getActiveSheet();
$cellIterator = $sheet->getRowIterator()->current()->getCellIterator();
$cellIterator->setIterateOnlyExistingCells( true );
/** @var PHPExcel_Cell $cell */
foreach( $cellIterator as $cell ) {
        $sheet->getColumnDimension( $cell->getColumn() )->setAutoSize( true );
}
7
répondu dmi3x 2014-08-04 11:06:30

Cet extrait de code va automatiquement dimensionner toutes les colonnes qui contiennent des données dans toutes les feuilles. Il n'est pas nécessaire d'utiliser le getter et le setter activeSheet.

// In my case this line didn't make much of a difference
PHPExcel_Shared_Font::setAutoSizeMethod(PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT);
// Iterating all the sheets
/** @var PHPExcel_Worksheet $sheet */
foreach ($objPHPExcel->getAllSheets() as $sheet) {
    // Iterating through all the columns
    // The after Z column problem is solved by using numeric columns; thanks to the columnIndexFromString method
    for ($col = 0; $col <= PHPExcel_Cell::columnIndexFromString($sheet->getHighestDataColumn()); $col++) {
        $sheet->getColumnDimensionByColumn($col)->setAutoSize(true);
    }
}
5
répondu Ronnie 2016-09-20 11:58:38
foreach(range('B','G') as $columnID)
{
    $objPHPExcel->getActiveSheet()->getColumnDimension($columnID)->setAutoSize(true);
}
3
répondu Sadikhasan 2015-01-12 10:52:43

Si vous essayez d'itérer avec for ($col = 2; $col <= 'AC'; ++ $col){...}, ou avec foreach(range('A','AC') as $col) {...} cela fonctionnera pour les colonnes de A à Z, mais il échoue à passer le Z (ex. itérer entre 'A' à 'AC').

Pour itérer le passage 'Z' , vous devez convertir la colonne en entier, incrémenter, comparer et l'obtenir à nouveau sous forme de chaîne:

$MAX_COL = $sheet->getHighestDataColumn();
$MAX_COL_INDEX = PHPExcel_Cell::columnIndexFromString($MAX_COL);
    for($index=0 ; $index <= $MAX_COL_INDEX ; $index++){
    $col = PHPExcel_Cell::stringFromColumnIndex($index);

    // do something, like set the column width...
    $sheet->getColumnDimension($col)->setAutoSize(TRUE);
}

Avec cela, vous passez facilement la colonne ' Z ' et définissez autosize sur chaque colonne.

2
répondu Alejandro Silva 2016-10-04 22:42:31

Au cas où quelqu'un chercherait ça.

La résolution ci-dessous fonctionne également sur PHPSpreadsheet, leur nouvelle version de PHPExcel.

// assuming $spreadsheet is instance of PhpOffice\PhpSpreadsheet\Spreadsheet
// assuming $worksheet = $spreadsheet->getActiveSheet();
foreach(range('A',$worksheet->getHighestColumn()) as $column) {
    $spreadsheet->getColumnDimension($column)->setAutoSize(true);
}

Remarque: getHighestColumn() peut être remplacé par getHighestDataColumn(), ou la dernière colonne réel.

Ce que ces méthodes font:

getHighestColumn($row = null) - Obtenir la plus haute colonne de feuille de calcul.

getHighestDataColumn($row = null) - Obtenir la plus haute colonne de feuille de calcul qui contient des données.

getHighestRow($column = null) - obtenir la ligne de feuille de calcul La plus élevée

getHighestDataRow($column = null) - obtenir la plus haute ligne de feuille de calcul qui contient des données.

2
répondu Gabi Dj 2017-11-04 18:26:38

Arrivez en retard, mais après avoir cherché partout, j'ai créé une solution qui semble être "l'unique".

Étant connu qu'il existe un itérateur de colonnes sur les dernières versions de L'API, mais ne sachant pas comment ajuster l'objet de colonne, j'ai créé une boucle pour passer de la première colonne utilisée à la dernière.

Voilà:

//Just before saving de Excel document, you do this:

PHPExcel_Shared_Font::setAutoSizeMethod(PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT);

//We get the util used space on worksheet. Change getActiveSheet to setActiveSheetIndex(0) to choose the sheet you want to autosize. Iterate thorugh'em if needed.
//We remove all digits from this string, which cames in a form of "A1:G24".
//Exploding via ":" to get a 2 position array being 0 fisrt used column and 1, the last used column.
$cols = explode(":", trim(preg_replace('/\d+/u', '', $objPHPExcel->getActiveSheet()->calculateWorksheetDimension())));

$col = $cols[0]; //first util column with data
$end = ++$cols[1]; //last util column with data +1, to use it inside the WHILE loop. Else, is not going to use last util range column.
while($col != $end){
    $objPHPExcel->getActiveSheet()->getColumnDimension($col)->setAutoSize(true);

    $col++;
}

//Saving.
$objWriter->save('php://output');
1
répondu Lightworker 2016-03-18 12:14:40

Vous devez également identifier les colonnes pour définir les dimensions:

foreach (range('A', $phpExcelObject->getActiveSheet()->getHighestDataColumn()) as $col) {
$phpExcelObject
        ->getActiveSheet()
        ->getColumnDimension($col)
        ->setAutoSize(true);
}
1
répondu Bhavik Hirani 2016-06-08 07:56:59
$col = 'A';
while(true){
    $tempCol = $col++;
    $objPHPExcel->getActiveSheet()->getColumnDimension($tempCol)->setAutoSize(true);
    if($tempCol == $objPHPExcel->getActiveSheet()->getHighestDataColumn()){
        break;
    }
}
1
répondu Prashant Khanderia 2016-08-31 11:04:36

Pour Spreedsheet + PHP 7, vous devez écrire au lieu de PHPExcel_Cell::columnIndexFromString, \PhpOffice\PhpSpreadsheet\Cell::columnIndexFromString. Et à la boucle est une erreur, là vous devez {[2] } Ne pas travailler avec <=. Sinon, il prend une colonne trop dans la boucle.

1
répondu GSI One 2017-02-22 09:22:02