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');
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).
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);
}
}
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 ;)
for ($i = 'A'; $i != $objPHPExcel->getActiveSheet()->getHighestColumn(); $i++) {
$objPHPExcel->getActiveSheet()->getColumnDimension($i)->setAutoSize(TRUE);
}
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 );
}
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);
}
}
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);
}
foreach(range('B','G') as $columnID)
{
$objPHPExcel->getActiveSheet()->getColumnDimension($columnID)->setAutoSize(true);
}
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é pargetHighestDataColumn()
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.
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.
$col = 'A';
while(true){
$tempCol = $col++;
$objPHPExcel->getActiveSheet()->getColumnDimension($tempCol)->setAutoSize(true);
if($tempCol == $objPHPExcel->getActiveSheet()->getHighestDataColumn()){
break;
}
}
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);
}
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');
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.