Explicación de hoja de cálculo para leer con PHP

Leer archivo de Excel con PHP y PHPSpreadSheet

Obtener contenido de hoja de cálculo con formato XLSX en PHP

Ya vimos cómo escribir a una hoja de cálculo usando PHPSpreadSheet; hoy veremos el proceso “inverso” y es leer el contenido de todo un documento de Excel.

Lo que haremos será leer todas las hojas (llamadas sheets) de un documento con extensión XLSX, así como iterar por todas las filas y leer cada celda de tres maneras:

  1. Valor crudo
  2. Valor formateado
  3. Valor calculado

Esta última manera permite calcular la fórmula en determinada columna y celda; pues si solamente obtenemos el valor crudo se mostrará la fórmula, no el resultado de la misma.

También vamos a ver cómo obtener la fila (es decir, el número, como 1) y la columna como letra (es decir, algo como A o B).

Libro de Excel

Por cierto, para trabajar con Excel y PHP vamos a usar un documento que tiene dos hojas de cálculo que he preparado especialmente para demostrar la lectura de un archivo XLSX con PHPSpreadSheet y PHP.

Explicación de hoja de cálculo para leer con PHP
Explicación de hoja de cálculo para leer con PHP

Eres libre de descargarlo: click aquí para ver el documento.

Recuerda que siempre trato de dar los ejemplos más simples y a la vez completos; para que puedas adaptarlos a tu proyecto.

Nota: primero explicaré cada cosa y después pondré el código, no te desesperes y lee todo cuidadosamente.

Lecturas recomendadas

Por favor mira el tutorial anterior, pues en el mismo se muestra cómo instalar la librería, sus requisitos y otras cosas.

Código fuente y descargas

El código fuente lo voy a ir exponiendo a través del post, pero también puedes visitar el repositorio en GitHub por si en el futuro hago cambios.

Si quieres descargar el código para probarlo sin configurar nada, visita la página de releases, descarga el zip y ponlo en tu carpeta pública.

En caso de clonar el repositorio recuerda instalar las dependencias con composer install.

Por cierto, si no tienes XAMPP mira cómo instalarlo aquí.

Abrir archivo de Excel con PHP

Para leer una hoja de cálculo primero necesitamos leer el archivo del disco duro. Para ello se llama a IOFactory::load("ruta_del_archivo.xlsx")

En este caso voy a trabajar con un archivo con extensión xlsx, aunque se podría con otros formatos pero se recomienda este último. Lo que devuelve load es el documento listo para trabajar.

Las hojas del documento de Excel

Una hoja de cálculo puede tener múltiples hojas, por eso es que a veces a los documentos se les dice “libros”.

El número de hojas en un libro puede ser determinado con $documento->getSheetCount() que devuelve un número entero; y para ir cambiando entre hojas podemos hacer esto:

$hojaActual = $documento->getSheet($indice);

Es decir, obtener una hoja por su índice, comenzando en 0. Para dejar claras las cosas, la hoja con índice 0 es la primer hoja.

El tipo de dato celda o Cell

Podemos obtener una celda de distintas maneras. Una vez que tenemos la hoja, podemos llamar a getCell o a getCellByColumnAndRow.

Cuando llamamos a getCell le pasamos las coordenadas como cadena, de la forma “LetraNúmero”. Por ejemplo A1, B2, etcétera.

En cambio, cuando llamamos a getCellByColumnAndRow le pasamos dos argumentos: el número de columna (comenzando en 1, no en 0) y el número de fila (igualmente comenzando en 1, no en 0).

Valores de una celda

Como lo dije, hay 3 tipos de valores. El valor crudo o así como está, sin formatear (también devuelve la fórmula) se obtiene con $celda->getValue()

El valor formateado (por ejemplo, si está formateado como dinero o con decimales) se obtiene llamando a $celda->getFormattedValue()

Para obtener el valor calculado (esto es útil en las celdas con fórmulas) en lugar del valor normal, se llama a $celda->getCalculatedValue()

Iterar o recorrer filas y columnas de un documento

Lo que normalmente vamos a querer hacer es iterar por todas las filas y columnas del documento, la librería ya proporciona unos iteradores.

Una vez que tenemos la hoja, podemos obtener el iterador de las filas con $hojaActual->getRowIterator() y a su vez recorrerlo con un foreach. Algo así:

foreach($hojaActual->getRowIterator() as $fila){}

Una vez que tenemos la fila, podemos obtener el iterador de las celdas. Para ello se llama a $fila->getCellIterator() e igualmente se puede usar en un foreach:

foreach($fila->getCellIterator() as $celda){}

Nota: es get cell iterator, puede ser confuso por la letra ele (L) y la letra (I). Cuando ya tenemos la celda podemos obtener sus valores como lo explico arriba.

Recorrer todas las filas y columnas del documento con índices

Adicionalmente esta librería permite acceder a las filas y columnas por índices, en un ciclo for normal con un entero como índice.

Para hacer el ciclo, necesitamos saber el número de filas y columnas; lo complicado es lo segundo, pues las columnas se identifican con letras y no con números.

Si se desea saber el número que tiene la fila mayor, es decir, la fila más grande o fila final, se llama a $hojaActual->getHighestRow() la cual devuelve un entero.

Y para saber el número más grande de columna, la última columna o la columna mayor, se llama a $hojaActual->getHighestColumn() la cual devuelve la letra de la columna.

Aquí podría haber un pequeño problema, ya que no podemos hacer un ciclo con comparando un número con letras; pero para nuestra fortuna la librería ya tiene un método que convierte la letra de la columna a un número:

De manera que ahora sí podemos hacer un ciclo y en cada iteración llamar a $hojaActual->getCellByColumnAndRow() pasándole el número de columna y fila como vimos anteriormente; en el ejemplo se ve a detalle.

Ejemplos de código

Ahora que ya expliqué cómo hacer cada cosa, veamos algunos ejemplos. Recuerda que ya dejé el documento al inicio, para que veas que la salida que muestro coincide con lo que existe en el libro de Excel.

Ejemplo 1: leer todas las hojas y obtener celda por coordenadas

Una vez que ya expliqué todo lo de arriba veamos cómo leer el documento hoja por hoja y obtener la primera celda obteniéndola por sus coordenadas A1.

La salida es esta:

Leer celda de documento de Excel por coordenadas usando PHP
Leer celda de documento de Excel por coordenadas usando PHP

Estamos obteniendo la celda que está en la esquina superior izquierda.

Ejemplo 2: leer todas las hojas y obtener celda por número columna y fila

Lo mismo que hicimos en el ejemplo 2 vamos a hacerlo con este ejemplo, pero ahora obteniendo la celda por número de columna y fila. El código es el siguiente:

La salida es la misma, pero ahora estamos obteniendo la celda por número de columna y fila.

Obtener celda de documento de Excel por columna y fila usando PHP
Obtener celda de documento de Excel por columna y fila usando PHP

Ejemplo 3: recorrer todas las hojas, filas y columnas de un documento de Excel

El ejemplo más completo es el que expongo a continuación. En él leemos todas las hojas y por cada una vamos iterando la fila y columna; de esta forma leemos todo el contenido de un libro de Excel usando PHP.

Así podríamos leer cualquier libro u hoja de cálculo sin importar el número de filas o columnas. Sin más que decir, aquí está el código:

Es como ver todo el contenido, pero usando PHP. La salida es la siguiente:

Iterar documento de Excel con PHP - Obtener todas las celdas con valores formateados y fórmulas
Iterar documento de Excel con PHP – Obtener todas las celdas con valores formateados y fórmulas

No se ve completa, pero en ella podemos observar que está obteniendo el valor formateado como dinero, así como el valor que resulta de calcular la fórmula.

Ejemplo 4: leer todo el contenido del documento usando índices enteros y ciclo for

El resultado es idéntico al de arriba, pero nos da la posibilidad de acceder a las celdas por sus índices, como si fuera un arreglo.

Gracias a esto tenemos dos maneras de iterar el documento y podemos aprovechar la que mejor nos convenga.

Conclusiones

Sé que tardé un poco en escribir la continuación del post anterior, pero con este quedan explicadas las formas básicas de leer y escribir archivos de Excel con PHP.

Esta librería es muy completa, pero a la vez compleja, por eso es que los ejemplos son un poco confusos a veces.

Recuerda que puedes deleitarte leyendo toda la documentación aquí. Por otro lado, te invito a que leas más sobre PHP.

Igualmente te animo a seguirme en mis redes sociales para cuando publique más contenido de este tema.

No olvides que el índice de las hojas empieza en 0, y el de las filas y columnas en 1.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

16 comentarios en “Leer archivo de Excel con PHP y PHPSpreadSheet”

  1. Hola tengo un problema, en mi documento Excel quiero obtener datos de manera dinámica me refiero a que una sección del documento puede contener 1 dato en la celda A1 o 100 datos de la celda A1:A100 entonces no siempre son la misma cantidad de datos y en el pie de la tabla hay mas datos que quiero recuperar pero es difil hacerlo sabiendo que se mueven de posición dependido que información tenga el documento, otro problema es el formato del Excel tiene filas y columnas vacías entonces me es muy complicado obtener datos que se mueven de posición dependiendo la cantidad de información que tenga el archivo como puedo solucionar ese problema.

  2. Primero, muy bueno el tutorial. Super útil.

    Segundo, te pido me ayudes con algo que no logré resolverlo. Mi archivo particular, “la tabla” con los datos no empieza en A1, pues el usuario tiene una personalizada. Digamos que empieza en B11.
    Como puedo hacerlo.

  3. Buenas tardes tengo instalado el paquete en otro subdirectorio, y no encuentra:

    use PhpOffice\PhpSpreadsheet\IOFactory;
    Comentas:
    # Recomiendo poner la ruta absoluta si no está junto al script
    No logro poner correctamente la ruta Absoulta, me podrías apoyar con algún ejemplo.
    Gracias

  4. ¿Hay alguna manera de que cada que alguien entre o mi web se pase a la siguiente casilla?
    Estoy desarrollando una web de códigos de descuentos, estos códigos van del 0001 hasta el 1550
    necesito que cada que alguien entre me de un código en orden ascendente, sin que se repitan

  5. Pingback: Crear documentos de Word con PHP y PHPWord - Parzibyte's blog

  6. Pingback: Crear archivos zip con PHP: agregar archivos y directorios, descargar zip y proteger con contraseña - Parzibyte's blog

  7. Pingback: Exportar datos de MySQL a Excel con PHP, PHPSpreadSheet y PDO - Parzibyte's blog

  8. Pingback: Crear archivo de Excel con PHP y PHPSpreadsheet - Parzibyte's blog

Dejar un comentario