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