Spreadsheet_Excel_Reader campo fecha [SOLUCIONADO]

Cuando trabajamos con hojas de cálculo y tenenos que interpretar y gestionar de manera adecuada datos en PHP, es una práctica común utilizar herramientas como **Spreadsheet_Excel_Reader**. Esta biblioteca permite leer archivos Excel, y una de las tareas más comunes y a la vez complicadas es la gestión de fechas.

### La Problemática de los Campos de Fecha en Excel

Excel maneja los campos de fecha de una manera muy particular: los almacena como números flotantes donde la parte entera representa los días desde una fecha de inicio (usualmente el 1 de enero de 1900) y la parte decimal representa la fracción de un día. Esto puede causar confusión cuando se lee un archivo de Excel en PHP, pues el formato no es directamente interpretable como una fecha.

### Interpretación de Fechas con Spreadsheet_Excel_Reader

Para leer estos campos y convertirlos en un formato legible y utilizable en PHP, necesitamos realizar unos pasos de conversión. Primero, veamos un fragmento de código básico donde utilizamos **Spreadsheet_Excel_Reader** para leer un archivo Excel con campos de fecha.

require_once 'Spreadsheet/Excel/Reader.php';
$data = new Spreadsheet_Excel_Reader("miarchivo.xls");

El código anterior carga el archivo `miarchivo.xls` para su lectura. Ahora, accedemos a las celdas que contienen fechas:

$sheet_index = 0; // Primer hoja
$row = 1; // Primera fila
$col = 1; // Primera columna
$fecha_excel = $data->sheets[$sheet_index]['cells'][$row][$col];

El valor que obtendremos en `$fecha_excel` es el número de días desde la fecha de inicio con la parte fraccional del día. Para manejarlo correctamente, necesitamos utilizar una función que pueda interpretar ese número y convertirlo en una fecha con sentido para PHP.

### La Conversión en PHP con mktime() y PHPExcel_Shared_Date

Una solución eficiente es usar la función `mktime()` de PHP, pero para ello, primero calculemos el número de días desde la época Unix (1 de enero de 1970), ya que `mktime()` genera un timestamp Unix.

function ExcelToPHP($fecha_excel) {
    $unix_date = ($fecha_excel - 25569) * 86400;
    return $unix_date;
}

$fecha_php = ExcelToPHP($fecha_excel);

Luego, con el timestamp de Unix, podemos obtener la fecha en un formato legible y adecuado para nuestro desarrollo PHP:

$fecha_legible = date("Y-m-d H:i:s", $fecha_php);

Con eso, `$fecha_legible` se convierte en una cadena de caracteres que representa la fecha extraída del archivo Excel y que podemos utilizar en PHP.

### Uso de PHPExcel para Mayor Flexibilidad con Fechas

Un enfoque alternativo es utilizar la librería PHPExcel, que posee funcionalidades mejoradas y manejo de fechas más sofisticado que Spreadsheet_Excel_Reader. Veamos cómo sería un ejemplo de código para manejar fechas utilizando PHPExcel.

require_once 'PHPExcel/IOFactory.php';

$objReader = PHPExcel_IOFactory::createReader('Excel5');
$objPHPExcel = $objReader->load("miarchivo.xls");

$cell_value = $objPHPExcel->getActiveSheet()->getCell('A1')->getValue();
if(PHPExcel_Shared_Date::isDateTime($objPHPExcel->getActiveSheet()->getCell('A1'))) {
    $fecha_php = date($format = "Y-m-d H:i:s", PHPExcel_Shared_Date::ExcelToPHP($cell_value));
}

Este fragmento de código realiza la lectura similar al primer ejemplo pero lleva a cabo la conversión de la fecha de manera más explícita y orientada a objetos que con Spreadsheet_Excel_Reader.

### Gestión de Zonas Horarias en PHP

Al trabajar con fechas, es inevitable tener que lidiar con zonas horarias. En PHP, es fundamental asegurarse de que la configuración de la **zona horaria** sea la correcta antes de realizar operaciones con fechas:

date_default_timezone_set('America/Mexico_City');

Al establecer la zona horaria, nos aseguramos de que todas las fechas manejadas en el código PHP concuerden con nuestra zona horaria local, evitando así posibles complicaciones o errores.

### Problemas Comunes y su Resolución

Entre los desafíos más comunes se encuentran las fechas que Excel reconoce como texto. Este escenario puede ocurrir si el archivo de Excel proviene de un sistema con una configuración regional diferente. En estos casos, es posible que tengamos que realizar manipulaciones adicionales de los datos recibidos para garantizar una lectura correcta.

Una estrategia consiste en intentar detectar el patrón de la fecha como cadena y luego, a través de funciones como `strtotime()` y `DateTime::createFromFormat()`, convertirla al formato adecuado.

$fecha_excel_texto = '01/31/2021'; // Asumiendo que es una fecha como texto
$fecha_php_objeto = DateTime::createFromFormat('m/d/Y', $fecha_excel_texto);
$fecha_php = $fecha_php_objeto->format('Y-m-d H:i:s');

En resumen, la manipulación de campos de fecha en PHP cuando se leen desde archivos Excel representa un desafío de programación común pero superable. Con la opción de herramientas como **Spreadweather_Excel_Reder** y PHPExcel, y con las funciones adecuadas de PHP para manejar fechas, los desarrolladores pueden gestionar los datos con eficacia, garantizando la integridad y la aplicabilidad de la información. Cabe destacar que la documentación y el entendimiento profundo de las bibliotecas utilizadas juegan un rol crucial en la solución de problemas y en la optimización de procesos en el desarrollo de proyectos en PHP que involucren manejo de hojas de cálculo y datos de fecha.

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad