web-dev-qa-db-fra.com

PHPExcel largeur de colonne de taille automatique

J'essaie de redimensionner 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 change pas la taille de la colonne pour qu'elle tienne dans le texte

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

92
alkis

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 du résultat des formules) et de tout caractère supplémentaire ajouté 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, basée sur l'utilisation de Gd, peut également gérer les fonctionnalités de style de police telles que gras et 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 l'auteur que 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 identifiant de colonne.

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

181
Mark Baker

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

// 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);
    }
}
46
MrUpsidown

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

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

J'espère que cela t'aides ;)

16
Todor Todorov
for ($i = 'A'; $i !=  $objPHPExcel->getActiveSheet()->getHighestColumn(); $i++) {
    $objPHPExcel->getActiveSheet()->getColumnDimension($i)->setAutoSize(TRUE);
}
10
Nathan

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 );
}
9
dmi3x

Cet extrait de code redimensionne automatiquement toutes les colonnes contenant 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
Ronnie

pour phpspreadsheet:

$sheet = $spreadsheet->getActiveSheet(); // $spreadsheet is instance of PhpOffice\PhpSpreadsheet\Spreadsheet

foreach (
    range(
         1, 
         Coordinate::columnIndexFromString($sheet->getHighestColumn(1))
    ) as $column
) {
    $sheet
          ->getColumnDimension(Coordinate::stringFromColumnIndex($column))
          ->setAutoSize(true);
}
5
beck kuo
foreach(range('B','G') as $columnID)
{
    $objPHPExcel->getActiveSheet()->getColumnDimension($columnID)->setAutoSize(true);
}
3
Sadikhasan

Au cas où quelqu'un cherchait ç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 par la dernière colonne.

Que font ces méthodes:

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

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

getHighestRow($column = null) - Obtenir le rang le plus élevé de la feuille de calcul

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

2
Gabi Dj

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 ne réussira pas à passer le Z (ex. Itérer entre 'A' et 'AC').

Pour pouvoir passer 'Z', vous devez convertir la colonne en entier, l'incrémenter, la comparer et la récupérer 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);
}

Cela vous permet de parcourir facilement la colonne 'Z' et de définir la taille automatique sur chaque colonne.

2
Alejandro Silva
$col = 'A';
while(true){
    $tempCol = $col++;
    $objPHPExcel->getActiveSheet()->getColumnDimension($tempCol)->setAutoSize(true);
    if($tempCol == $objPHPExcel->getActiveSheet()->getHighestDataColumn()){
        break;
    }
}
1
Prashant Khanderia

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
Bhavik Hirani

Arrivez tard, mais après avoir cherché partout, j'ai créé une solution qui semble être "celle".

Sachant qu'il existe un itérateur de colonne sur les dernières versions de l'API, mais ne sachant pas comment ajuster l'objet de colonne lui-même, j'ai créé une boucle pour passer de la première colonne utilisée à la dernière.

Ici ça va:

//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
Lightworker

Pour Spreedsheet + PHP 7, vous devez écrire à la place de PHPExcel_Cell::columnIndexFromString, \PhpOffice\PhpSpreadsheet\Cell::columnIndexFromString. Et à la boucle est une erreur, il faut que < ne fonctionne pas avec <=. Sinon, il prend trop une colonne dans la boucle.

1
GSI One