todos texto los justificar getcolumndimension formato condicional columna centrar celda bordes ancho ajustar php resize size phpexcel

texto - Ancho de columna de tamaño automático de PHPExcel



phpexcel centrar texto (13)

Estoy tratando de dimensionar automáticamente las columnas de mi hoja. Estoy escribiendo el archivo y al final trato de cambiar el tamaño de todas mis columnas.

// 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();

El código anterior no funciona. No cambia el tamaño de la columna para que se ajuste al texto

ACTUALIZAR El escritor que estoy usando $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, ''Excel5'');


Aquí una variante más flexible basada en la publicación de @Mark Baker:

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

Espero que esto ayude ;)


En caso de que alguien estuviera buscando esto.

La siguiente resolución también funciona en PHPSpreadsheet , su nueva versión 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); }

Nota: getHighestColumn() se puede reemplazar por getHighestDataColumn() o la última columna real.

Qué hacen estos métodos:

getHighestColumn($row = null) - Obtenga la columna de la hoja de trabajo más alta.

getHighestDataColumn($row = null) - Obtenga la columna de la hoja de trabajo más alta que contenga datos.

getHighestRow($column = null) - Obtenga la fila más alta de la hoja de trabajo

getHighestDataRow($column = null) - Obtenga la fila más alta de la hoja de trabajo que contiene datos.


Este es un ejemplo de cómo usar todas las columnas de la hoja de trabajo:

$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 ); }


Este fragmento de código dimensionará automáticamente todas las columnas que contienen datos en todas las hojas. No es necesario utilizar el activador y el activador de 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); } }


Lleguen tarde, pero después de buscar en todas partes, he creado una solución que parece ser "la única".

Siendo conocido que hay un iterador de columna en las últimas versiones de la API, pero no sé cómo ajustar el objeto de la columna en sí mismo, básicamente he creado un bucle para pasar de la primera columna usada real a la última usada realmente.

Aquí 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'');


Para Spreedsheet + PHP 7, debe escribir en lugar de PHPExcel_Cell::columnIndexFromString , /PhpOffice/PhpSpreadsheet/Cell::columnIndexFromString . Y en el ciclo es un error, allí no debes < trabajar con <= . De lo contrario, toma una columna demasiado en el bucle.


Si intenta iterar con for ($col = 2; $col <= ''AC''; ++ $col){...} , o con foreach(range(''A'',''AC'') as $col) {...} funcionará para las columnas de la A a la Z, pero no pasa la Z (por ejemplo, iterar entre ''A'' y ''AC'').

Para iterar pase ''Z'', necesita convertir la columna a un entero, incrementarla, compararla y obtenerla nuevamente como cadena:

$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); }

Con esto, es fácil iterar pasar la columna ''Z'' y establecer autosize en cada columna.


Si necesita hacer eso en varias hojas, y varias columnas en cada hoja, aquí es cómo puede recorrer todas ellas:

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


Si una columna está configurada en Tamaño automático, PHPExcel intenta calcular el ancho de la columna en función del valor calculado de la columna (por lo tanto, del resultado de cualquier fórmula) y cualquier carácter adicional agregado por las máscaras de formato, como los separadores de miles.

Por defecto, este es un ancho estimated : hay disponible un método de cálculo más preciso, basado en el uso de GD, que también puede manejar características de estilo de fuente como negrita y cursiva; pero esta es una sobrecarga mucho mayor, por lo que está desactivada por defecto. Puede habilitar el cálculo más preciso usando

PHPExcel_Shared_Font::setAutoSizeMethod(PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT);

Sin embargo, el auto-tamaño no se aplica a todos los formatos de Writer ... por ejemplo, CSV. No mencionas qué escritor estás usando.

Pero también necesita identificar las columnas para establecer las dimensiones:

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

$objPHPExcel->getActiveSheet()->getColumnDimension() espera una ID de columna.

$objPHPExcel->getActiveSheet()->getColumnDimensions() devolverá una matriz de todos los registros de dimensión de columna definidos; pero a menos que se haya creado un registro de dimensión de columna explícitamente (tal vez cargando una plantilla, o llamando manualmente a getColumnDimension() ) entonces no existirá (almacenamiento de memoria).


también necesita identificar las columnas para establecer las dimensiones:

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; } }


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


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