leer guardar ejemplos desde datos avanzados archivo php phpexcel

guardar - ¿Cómo saber cuántas filas y columnas leer desde un archivo de Excel con PHPExcel?



php leer excel xlsx (5)

Con el siguiente código, puedo leer las celdas de un archivo de Excel con PHPExcel.

Actualmente, defino manualmente cuántas filas y columnas leer.

¿Hay alguna manera de que PHPExcel me diga cuántas filas y columnas tengo que leer para obtener todos los datos de la hoja de trabajo, por ejemplo, incluso si algunas filas y columnas se dejan en blanco?

$file_name = htmlentities($_POST[''file_name'']); $sheet_name = htmlentities($_POST[''sheet_name'']); $number_of_columns = htmlentities($_POST[''number_of_columns'']); $number_of_rows = htmlentities($_POST[''number_of_rows'']); $objReader = PHPExcel_IOFactory::createReaderForFile("data/" . $file_name); $objReader->setLoadSheetsOnly(array($sheet_name)); $objReader->setReadDataOnly(true); $objPHPExcel = $objReader->load("data/" . $file_name); echo ''<table border="1">''; for ($row = 1; $row < $number_of_rows; $row++) { echo ''<tr>''; for ($column = 0; $column < $number_of_columns; $column++) { $value = $objPHPExcel->setActiveSheetIndex(0)->getCellByColumnAndRow($column, $row)->getValue(); echo ''<td>''; echo $value . ''&nbsp;''; echo ''</td>''; } echo ''</tr>''; } echo ''</table>'';

Solución:

Gracias, Mark, aquí está la solución completa con esas funciones:

$file_name = htmlentities($_POST[''file_name'']); $sheet_name = htmlentities($_POST[''sheet_name'']); $number_of_columns = htmlentities($_POST[''number_of_columns'']); $number_of_rows = htmlentities($_POST[''number_of_rows'']); $objReader = PHPExcel_IOFactory::createReaderForFile("data/" . $file_name); $objReader->setLoadSheetsOnly(array($sheet_name)); $objReader->setReadDataOnly(true); $objPHPExcel = $objReader->load("data/" . $file_name); $highestColumm = $objPHPExcel->setActiveSheetIndex(0)->getHighestColumn(); $highestRow = $objPHPExcel->setActiveSheetIndex(0)->getHighestRow(); echo ''getHighestColumn() = ['' . $highestColumm . '']<br/>''; echo ''getHighestRow() = ['' . $highestRow . '']<br/>''; echo ''<table border="1">''; foreach ($objPHPExcel->setActiveSheetIndex(0)->getRowIterator() as $row) { $cellIterator = $row->getCellIterator(); $cellIterator->setIterateOnlyExistingCells(false); echo ''<tr>''; foreach ($cellIterator as $cell) { if (!is_null($cell)) { $value = $cell->getCalculatedValue(); echo ''<td>''; echo $value . ''&nbsp;''; echo ''</td>''; } } echo ''</tr>''; } echo ''</table>'';


Desde la PHPExcel 1.7.6 y las versiones de PHPExcel , es posible obtener información de la hoja de trabajo sin leer todo el archivo:

$objReader = PHPExcel_IOFactory::createReader("Excel2007"); $worksheetData = $objReader->listWorksheetInfo($uploadedfile); $totalRows = $worksheetData[0][''totalRows'']; $totalColumns = $worksheetData[0][''totalColumns''];


No creo que puedas hacer eso, tendrías que pasar a partir de digamos 1000 e ir hacia atrás hasta que toques la primera celda que no esté en blanco y esa sería tu última fila o columna.

Puede escribir una macro para hacer esto en Excel que puede ayudar, pero no sé si puede ejecutarlo con PHPExcel.


Puede hacer mucho menos lecturas de celda que iterar todas las filas (columnas).

En mi caso, la primera columna es SKU del artículo y es obligatorio.

Si espera un archivo con muchas filas, en mi caso puede ser de 100 000 filas o más, estoy leyendo el valor de la primera columna en cada 10 000 filas.

Si la celda A10000 no está vacía, lea A20000 y así sucesivamente.

De esta forma, para un archivo con 100 000 filas, necesito un máximo de 10 lecturas de una sola celda para decidir en qué segmento de 10 000 filas termina el archivo.

Por ejemplo, digamos que está entre 30 000 y 40 000 filas.

Ahora obtenga el promedio del valor anterior: 35 000. Una lectura de la celda A35000 reducirá aún más el alcance a 5000 filas. El promedio siguiente (y la lectura de celda única) reducirá aún más el alcance a 2500 y así sucesivamente.

Aproximadamente necesitará alrededor de 13-14 lecturas de celda única, si sabe en qué segmento de 10 000 es el final del archivo. Si espera un archivo con 100 000 filas, agregue un máximo de 10 lecturas de celda para determinar el segmento exacto de 10 000 filas. Esto significa un máximo de alrededor de 25 lecturas de celda para archivos con 100 000 filas.

Editar: si espera filas vacías, lea un poco más de celdas, por ejemplo, si espera no más de 1 fila vacía consecuente, lea 2 celdas consecutivas cada vez, por ejemplo A10000 y A10001, una de ellas no debe estar vacía, o estás más allá del final del archivo. Si no espera más de 2 filas vacías consecutivas, lea 3 celdas cada vez, por ejemplo A10000, A10001 y A10002, y así sucesivamente.


Siguiendo pensamiento de respuesta anterior, decidí hacer obligatoria la primera celda de cada fila. De esta manera, solo miro cada celda de cada fila primero para descubrir cuántas filas realmente tienen datos, dependiendo de la primera fila.

$uploadedfile = /PHPExcel_IOFactory::load(Yii::getAlias(''uploads'').''/''.$file_location); $uploadeddata = $uploadedfile->getActiveSheet()->toArray(null, true, true, true); //we need to first know how many rows actually have data //my first two rows have column labels, so i start with the third row. $row_count = 3; // read through the data and see how many rows actually have data //the idea is that for every row, the first cell should be mandatory... //if we find one that is not, we stop there... do { $row_count++; } while($uploadeddata[$row_count][''A''] == "null"); //get the actual number of rows with data, removing the column labels $actual_rows = $row_count-3;


$objPHPExcel->setActiveSheetIndex(0)->getHighestColumn();

y

$objPHPExcel->setActiveSheetIndex(0)->getHighestRow();

o

$objPHPExcel->setActiveSheetIndex(0)->calculateWorksheetDimension();

que devuelve un rango como una cadena como A1: AC2048

aunque se incluyen columnas y filas en blanco al final.

EDITAR

o puede usar los iteradores para recorrer las filas y columnas existentes para obtener cada celda dentro del rango de hojas de cálculo utilizadas. Consulte /Tests/28iterator.php en la distribución de producción para ver un ejemplo. Los iteradores se pueden configurar para ignorar espacios en blanco.