Excel y PHP

Imagen de Nelson Hereveri

Bueno probé con el Excel nativo y me va muy bien. Bueno luego de manipular algunas líneas referentes a los formatos. Ya que como está solo considera algun os de estos formatos (definidos en $dateFormat y $numberFormat), el caso era que no es lo mismo para todas las personas ni aplicaciones. Comprobé que el formato se registraba en otro lugar (con elementos como GENERAL, @, HH:MM:SS, MM/DD/YYYY, y cosas por el estilo), con una búsqueda probabilistica social defini reglas de transformación de tipos (si el campo es date con el rawValue <= 1 probablemente sea una hora). Da lo mismo como se vea en el archivo xls ya que realmente se almacena con un punto flotante.

Ahora como supondrán con las líneas siguientes el cálculo es algo simple. Demasiado. El problema se origina en el formato de almacenamiento de una fecha. Un día es equivalente a una unidad, por lo que un valor 0,5 en el raw de una determinada casilla se ve en el xls como 12:00:00 (medio día). El problema es que debido a la manipulación de decimales para calcular horas, minutos y segundos estos se calculan con multiplicaciones por 24, 60 y múltiplos. Con lo cual se pierden algunos decimales "poco significativos" para PHP. Haciendo que horas como las 17:00 hrs se vea como 16:59:59. Traté de hacer que me añadiera ese segundo (lo que acarrea el problema de si en realidad el valor es 16:59:59) con los IFs anidados, pero nada. Tambien intenté quitar el floor, pero nada.

¿alguien sabe cómo manipular esos decimales o cómo rescatarles más precisamente desde el xls?

PD: También he intentado con las funciones BC Math.


function createDate($numValue)

    ...

        $rawD = $parteDecimal;
        $hours = floor($parteDecimal * 24);
        $mins = floor($parteDecimal * 24 * 60) - $hours * 60;
        $secs = floor($parteDecimal * SPREADSHEET_EXCEL_READER_MSINADAY) - $hours * 60 * 60 - $mins * 60;
        if($secs == 59) {
            $mins++;
            $secs = 0;
            if($mins == 60) {
                $hours++;
                $mins = 0;
            }
        }
        $stringD = date (AIRVIRO_HOUR_FORMAT , mktime($hours, $mins, $secs));

    ...

PD: AIRVIRO_HOUR_FORMAT es 'Hi', si el valor de raw es 0,75 entonces imprime 1800. ¡Entiende!

Gracias de antemano.

PD: También les señalo que habia problemas con archivos generados con Gnumeric. Al parecer no aplica bien el formato correspondiente al número de columnas o filas por hoja. Me dio bastantes problemas, ya con OpenOffice o Microsoft Office funciona como debe. Una pena por este ya que es mucho más liviano que el OpenOffice.

Enviado por Nelson Hereveri (no verificado) el Mié, 05/11/2008 - 11:46.

Enviar un comentario nuevo

El contenido de este campo se mantiene como privado y no se muestra públicamente.
If you have a Gravatar account, used to display your avatar.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Saltos automáticos de líneas y de párrafos.

Más información sobre opciones de formato