alternative - phpoffice/phpexcel yii2
PHPExcel Column Loop (6)
¿Cómo puedo hacer un bucle basado en las columnas de la hoja de cálculo de Excel? Encontré (y utilicé) WorkWeetIterator, RowIterator y CellIterator pero nada sobre columnas.
¡Prueba esto! ¡Trabajo!
$limit = 10000;
$value=''sua mensagem''
for($i=0,$j=''A'';$i<$limit;$i++,$j++) {
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue($j.$i, $value);
}
establece en $ valor lo que quieres imprimir.
Esta es la solución para el método getColumnLetter del último mensaje, le permite obtener las "letras" de las columnas, independientemente del número de columnas que tenga.
function getColumnLetter( $number ){
$prefix = '''';
$suffix = '''';
$prefNum = intval( $number/26 );
if( $number > 25 ){
$prefix = getColumnLetter( $prefNum - 1 );
}
$suffix = chr( fmod( $number, 26 )+65 );
return $prefix.$suffix;
}
Este breve fragmento de código proporciona filas de columnas en bucle. Obtiene los índices de la última columna no vacía (y su fila) y los bucles a esos índices, así que tenga en cuenta los valores olvidados en Excel.
El código pasa por las filas de la columna A, luego las filas de la columna B ...
$objReader = new PHPExcel_Reader_Excel2007();
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load($file);
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet)
{
$worksheetTitle = $worksheet->getTitle();
$highestColumn = $worksheet->getHighestColumn();
$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
// expects same number of row records for all columns
$highestRow = $worksheet->getHighestRow();
for($col = 0; $col < $highestColumnIndex; $col++)
{
// if you do not expect same number of row records for all columns
// get highest row index for each column
// $highestRow = $worksheet->getHighestRow();
for ($row = 1; $row <= $highestRow; $row++)
{
$cell = $worksheet->getCellByColumnAndRow($col, $row);
$val = $cell->getValue();
// do what you want with cell value
}
}
}
Este método recursivo fue diseñado y le permite obtener las "letras" de las columnas, cualquiera que sea el número de columnas que tenga, de "A" a "ZZZZZZZZZZ ...":
function getColumnLetter( $number )
{
$prefix = '''';
$suffix = '''';
$prefNum = intval( $number/26 );
if( $prefNum > 25 )
{
$prefix = getColumnLetter( $prefNum );
}
$suffix = chr( fmod( $number, 26 )+65 );
return $prefix.$suffix;
}
Así que puede hacer un bucle de las columnas de una matriz de PHP en el número de índice y convertirlo en una cadena de letras y usarlo en métodos PHPExcel, como "setCellValue" ... ¡Pero las soluciones anteriores son seguramente más rápidas si las puede usar!
No hay ColumnIterator, así que tendrás que hacerlo a mano.
Para cualquier hoja de trabajo dada:
Para hacer un bucle en las filas de una columna:
$column = ''A'';
$lastRow = $worksheet->getHighestRow();
for ($row = 1; $row <= $lastRow; $row++) {
$cell = $worksheet->getCell($column.$row);
// Do what you want with the cell
}
Para hacer un bucle de columnas en una fila, puede aprovechar la capacidad del estilo Perls de PHP para incrementar caracteres:
$row = 1;
$lastColumn = $worksheet->getHighestColumn();
$lastColumn++;
for ($column = ''A''; $column != $lastColumn; $column++) {
$cell = $worksheet->getCell($column.$row);
// Do what you want with the cell
}
Tenga en cuenta que al comparar letras de columna para probar la última columna en el bucle, no podemos simplemente usar <o <= porque estamos comparando cadenas, y "B"> "AZ" en la comparación de cadenas estándar, así que usamos una ! = comparación, habiendo incrementado el valor de columna más alto para dar el primer ID de columna más allá del punto final.
También puedes usar
$worksheet->cellExists($column.$row);
en el bucle para probar la existencia de una celda antes de acceder a ella usando getCell () (o no) para emular el comportamiento del iterador getIterateOnlyExistingCells ()
Los iteradores son en realidad bastante lentos, por lo que puede encontrar estos simples bucles que son más rápidos que los iteradores.
ACTUALIZACIÓN (2015-05-06)
PHPExcel versión 1.8.1 ha introducido un nuevo iterador de columna. Los iteradores de filas y columnas también le permiten especificar un rango de filas o columnas para iterar, y le permiten usar prev () y también como next () cuando se realiza un bucle
columnas de bucle como rango
foreach ( range(''A'', $Excel->getActiveSheet()->getHighestColumn()) as $column_key) {
}