[SOLUCIONADO] Problemas para usar la clase phpExcel

Muchachos, se me bloqueó el cerebro.
Quiero leer un archivo excel para procesarlo.

No entiendo por qué, pero cuando pongo la siguiente sentencia
require_once(toba_dir().‘\php\3ros\phpExcel\PHPExcel.php’);

da un error de php.

Es como si no encontrara el archivo. Supongo que debe ser por alguno de los includes del PHPExcel.php

Si es así, hay alguna forma de solucionarlo sin tocar el código original??

¿Que estoy haciendo mal??

Gracias por la atención

Hola Claudio,

creo que el problema puede estar en las barras que utilizaste para indicar la ruta. En un ppio cuando lo inclui tambien me dio un error, sin embargo al cambiar la direccion de las barras funciono correctamente.

require_once(toba_dir().'/php/3ros/phpExcel/PHPExcel.php');

Igualmente, tene en cuenta que a partir de la version 2.0 de Toba se utiliza un esquema de autoload, por lo que no es estrictamente necesario que pongas los includes/requires al ppio del archivo.

Saludos

No, che.
Por las dudas, le cambié la dirección de las barritas como me indicas, y se sigue colgando.

Dudé, te decía, porque en este mismo formulario -de prueba- tengo otro require con las barras para el otro lado, incluso mezcladas (para probar), y no tiene problemas. De hecho que es como tu dices en un entorno linux, pero en este caso, estoy probando en un entorno windows con toba 1.4.4

La verdad es que no hay muchas cosas para cambiar.

Estoy medio desorientado con este asunto.

Claudio,

puntualmente cual es el error que te tira?, puede que de ahi saquemos mas informacion concreta que cualquier elucubracion que hagamos en el aire.
El resto de las operaciones te funcionan correctamente?.. la variable de entorno ‘TOBA_DIR’ esta seteada correctamente en el alias en toba.conf?

Saludos

Hola Richard, yo se que abuso de tu paciencia.
No puedo ver el error php específico, ya que el toba, cuando hay un error php, solo cuelga la operación. Estuve intentando ver algun log con los errores de php, pero no tengo acceso y los muchachos que administran el servidor no están.

Te pongo tres lineas que tengo en la misma página:

require_once (toba_dir().‘\php\3ros\todofpdf/fpdf.php’);
//require_once (toba_dir().‘/php/3ros/phpExcel/PHPExcel.php’);
require_once (toba_dir().‘/php/3ros/phpExcel/phpExcel/Reader/IReader.php’);

La primera y la tercera, funcionan.
La que está comentada es la que da error. El resto de las operaciones funcionan bien.

Fijate, en el caso de la tercera, que lo único que hice fue ver si llega bien al destino levantando un php que estuviera más profundo, y no hay problemas.

Posiblemente no le esté gustando algo de lo que pasa dentro del PHPExcel.php

Voy a seguir investigando. Si se te ocurre algo, agradecido.

Richard, le agregué lo siguiente, y levanta bien.
Vamos a ver como se usa la clase ahora.

set_include_path(get_include_path() . PATH_SEPARATOR . toba_dir().‘/php/3ros/PHPExcel/’);

No se si se chispoteara algo en otro lado.
Dame tu opinión, y si crees que es mejor hacerlo de otro modo.

Saludos

Hola Claudio,

La realidad es que Toba no puede pasar por encima de PHP… en el caso de los Fatal Errors no tenemos forma de capturarlos, por otro lado siendo un servidor de desarrollo el mismo deberia estar configurado para que PHP muestre todos los errores por pantalla display_errors = On. Ya que no les brindan acceso a los logs de Apache, seria importante que al menos pudieras verlos por pantalla.

Te pongo tres lineas que tengo en la misma página:

require_once (toba_dir().‘\php\3ros\todofpdf/fpdf.php’);
//require_once (toba_dir().‘/php/3ros/phpExcel/PHPExcel.php’);
require_once (toba_dir().‘/php/3ros/phpExcel/phpExcel/Reader/IReader.php’);

La primera y la tercera, funcionan.
La que está comentada es la que da error. El resto de las operaciones funcionan bien.


Debe haber algun include/require en la libreria que esta mal ruteado o quedo hardcodeado.

Con respecto al agregado al include_path… esta bien, igualmente solo tapa el sintoma, habria que encontrar cual es el punto en el que falla.

Saludos

Richard, espero que leas esto. (para que veas que cuando vengo con un lio, es un lio)

Ya me está irritando este baile.

Te comento, a ver si me desasnás:

Una vez resuelto el tema de los includes, me encuentro con dos problemas.
Aclaro que uso el excel 2003.

Código:
$xls = toba::proyecto()->get_www_temp($datos[‘archivo’][‘name’]);
move_uploaded_file($datos[‘archivo’][‘tmp_name’], $xls[‘path’]);

Esto funciona bien, levanto el archivo con un ef_upload, y lo guardo en la carpeta temp del proyecto.
El drama aquí, es que no me permite abrirlo, me dice que está protegido o cifrado (intento de abrirlo desde el navegador de windows o con el excel)

Para seguir la prueba, copio manualmente el archivo desde su carpeta origen, a la temp del proyecto.

Ejecuto el siguiente código:

    if(file_exists('temp/nomina.xls')) 
             echo('existe');
    
    $objReader = new PHPExcel_Reader_Excel2007(); 
    $objPHPExcel = $objReader->load('temp/nomina.xls');

El if me devuelve verdadero, el php encuentra el archivo
La creación del objeto $objReader se ejecuta bien.

La tercer sentencia, la carga del archivo y creación del objeto $objPHPExcel, se cuelga, o sea: da un error en php.

Si no le pongo el archivo o le pongo cualquier cosa, se cuelga pero informando que el archivo no existe.

No se cual puede ser el error

Un abrazo.

Pude entrar al log de errores, y me arroja el siguente error:

[Thu Mar 08 09:01:37 2012] [error] [client 192.168.50.11] PHP Fatal error: Class ‘ZipArchive’ not found in C:\toba_1.4.4\php\3ros\phpExcel\PHPExcel\Reader\Excel2007.php on line 113, referer: http://192.168.10.10/prclaudio/1.0/aplicacion.php?tm=1&tcm=previsualizacion&ai=prclaudio||1000398

Pregunto si esa clase a la que se refiere tendría que buscarla e instalarla yo por mi cuenta, o si toba ya tiene ese asunto resuelto.

Yo no le encuentro el agujero al mate.

Saludos.

Jajajaja, me parece perfecto… los lios, lios deben ser.

Código: $xls = toba::proyecto()->get_www_temp($datos['archivo']['name']); move_uploaded_file($datos['archivo']['tmp_name'], $xls['path']);

Esto funciona bien, levanto el archivo con un ef_upload, y lo guardo en la carpeta temp del proyecto.
El drama aquí, es que no me permite abrirlo, me dice que está protegido o cifrado (intento de abrirlo desde el navegador de windows o con el excel)


Una consulta… verificaste que $datos[‘archivo’][‘error’] no tenga nada no?.. por si acaso se subio mal el archivo.
De todas maneras, si el archivo se subio bien… moverlo a otra carpeta no tiene porque generarle ningun inconveniente, eso es una llamada a sistema no es que se copia a mano… donde un warning podria romper el formato.

La otra es que este quedando lockeado por el web server, seria medio loco el caso… pero no es la primera vez que veo que el web server queda colgado en windows.

Pude entrar al log de errores, y me arroja el siguente error:

[Thu Mar 08 09:01:37 2012] [error] [client 192.168.50.11] PHP Fatal error: Class ‘ZipArchive’ not found in C:\toba_1.4.4\php\3ros\phpExcel\PHPExcel\Reader\Excel2007.php on line 113, referer: http://192.168.10.10/prclaudio/1.0/aplicacion.php?tm=1&tcm=previsualizacion&ai=prclaudio||1000398

Pregunto si esa clase a la que se refiere tendría que buscarla e instalarla yo por mi cuenta, o si toba ya tiene ese asunto resuelto.

Yo no le encuentro el agujero al mate.

Por lo que vi en la pagina de PHP, supuestamente en versiones > 5.2.0 la libreria podria venir incluida… aunque aparentemente no esta del todo oficializada, por el momento esta en PECL.
Otra forma es instalarla por linea de comandos con PEAR, quizas sea mas directa esta forma, por desgracia PHPExcel no usa Zlib que es una extension estandar.

Saludos

Hola Richard, vamos a encanecer juntos

Te comento:
Reinstalé el php activando la opción de que me incluya php_zip. Esto agrega unas dll (al php) y las siguientes lineas en el php.ini

[PHP_BZ2]
extension=php_bz2.dll
[PHP_ZIP]
extension=php_zip.dll
[PHP_BZ2_FILTER]
extension=php_bz2_filter.dll
[PHP_ZLIB_FILTER]
extension=php_zlib_filter.dll

Bueno. Hecho esto, carga el archivo sin error, o sea el método “load” no da error.

Ahora me está pateando cuando quiero setear la página activa.

$objReader = new PHPExcel_Reader_Excel2007();
$objPHPExcel = $objReader->load(‘temp/nomina.xls’);

$objPHPExcel->setActiveSheetIndex(0);

$valor_celda=$objPHPExcel->getActiveSheet()->getCell(“A1”)->getValue();

La resaltada es la que da error ahora, me dice que el ínice está fuera de alcance. Por supuesto, ahí se cuelga.

Jaja, lindo baile. Pero cuando se resuelva, vamos a poder leer archivos excel y procesarlos.

Si le encontrás la vuelta, avisame, por favor.

Gracias por tu tiempo.

Bueno, colegas.
Después de 4 o 5 días de baile, he logrado desentrañar este asunto para leer un archivo excel desde el php.

El problema con la clase que trae el toba, es que está reducida. Le han eliminado un montón de clases que toba no utiliza.
Me percaté de esto buscando por internet y observando que hacian referencia a clases y métodos que no están en la carpeta de PHPExcel que provee toba.
Dada esta situación probé bajando la clase desde internet y creando dentro de la carpeta 3ros, una llamada miphpexcel donde puse la carpeta PHPExcel que bajé completa.

Luego, escribí lo siguiente y funciona:

(fuera de la clase de mi aplicación)
require_once toba_dir().‘/php/3ros/miphpExcel/PHPExcel/IOFactory.php’;

(dentro de la clase de mi aplicación)
/** Pruebas de lectura desde un archivo excel*/

    $xls = toba::proyecto()->get_www_temp($datos['archivo']['name']); #--esto viene de un ef_upload
    
    move_uploaded_file($datos['archivo']['tmp_name'], $xls['path']);

   $objPHPExcel = PHPExcel_IOFactory::load($xls['path']);
  
ei_arbol($objPHPExcel->getSheetCount());

    $objPHPExcel->setActiveSheetIndex(0);
    $valor_celda=$objPHPExcel->getActiveSheet()->getCell("B2")->getValue();
    
 echo("valor celda: ".$valor_celda);

Me muestra lo que tiene la celda. De allí a procesar todo un archivo, es cuestión de estudiar un poquito la clase y sus métodos.

Espero que sirva, y si puede mejorarse el acceso soy todo oidos.

Un cordial saludo a todos, y gracias a aquellos que dedicaron su tiempo a ayudarme en la búsqueda de la solución.

Hola Claudio,

me alegro que lo hayas podido resolver, en gral con cada nueva version de Toba intentamos ir actualizando las librerias que usamos.
No solemos modificar las librerias, salvo para remover algun archivo señalado explicitamente por el autor como desechable o en algun caso dejar solo los lenguajes mas utilizados por aqui.
Por eso me llama la atencion que te falten archivos, tenes la Working Copy de toba correcta?, hemos sufrido casos de actualizaciones falsas.

De todas formas, si hiciste una lista de los archivos faltantes me la podrias pasar? te lo agradeceria, asi voy verificando y restaurando aquellos que no esten efectivamente en dicha version.

Con respecto al error, por lo que pude ver al momento de hacer el load se hace una llamada a $excel->setActiveSheetIndex(0); (linea 1518), estimo que esa es la llamada que te esta fallando.
Lo mas loco es que por defecto se esta creando una hoja cuando el excel resultante no tiene nada, es decir… en teoria no deberia fallar nunca esa llamada.

Me intriga tu caso, cual es el error especifico que te tira?.
Asumo que estas en la version 2.1 de Toba no?

Saludos :slight_smile:

Hola Richard. Estás en lo cierto, esa es la llamada que falta, y ese es el error que me arroja. Algo completamente surrealista.

Esta tarde armo la lista, y te la mando. Pero, a titulo de anticipo, el php que contiene la clase que uso en el ejemplo de la solución, es uno de ellos.

El toba que estoy usando, aún, es el 1.4.4

Quiero migrar, pero estoy sin tiempo.

Un abrazo.

Comparto finalmente como subir los datos de un archivo de excel, a un cuadro de toba:

  • Con la libreria phpExcel que viene con toba tenemos
  • copiar el archivo en el www/temp del proyecto
  • Para llenar el cuadro llamamos la siguiente función

function get_celdas() {
//ejemplo http://bayu.freelancer.web.id/2010/07/16/phpexcel-advanced-read-write-excel-made-simple/
require_once toba_dir().‘/php/3ros/phpExcel/PHPExcel.php’;
$datos = array();
$objPHPExcel = new PHPExcel();
$objReader = new PHPExcel_Reader_Excel5();
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load(‘temp/libro.xls’);
$rowIterator = $objPHPExcel->getActiveSheet()->getRowIterator();
$array_data = array();
foreach($rowIterator as $row){
echo "fila ".$row->getRowIndex ();
$cellIterator = $row->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(false); // Loop all cells, even if it is not set
if(1 == $row->getRowIndex ()) continue; //skip first row la del encabezado
$rowIndex = $row->getRowIndex ();
$array_data[$rowIndex] = array(‘A’=>‘’, ‘B’=>‘’,‘C’=>‘’,‘D’=>‘’);

        foreach ($cellIterator as $cell) {
            if('A' == $cell->getColumn()){
                $array_data[$rowIndex][$cell->getColumn()] = $cell->getCalculatedValue();
                $datos[$rowIndex]['pac_identificacion'] = $cell->getCalculatedValue();
            } else if('B' == $cell->getColumn()){
                $array_data[$rowIndex][$cell->getColumn()] = $cell->getCalculatedValue();
                $datos[$rowIndex]['pac_nombre'] = $cell->getCalculatedValue();
            } else if('C' == $cell->getColumn()){
                $array_data[$rowIndex][$cell->getColumn()] = PHPExcel_Style_NumberFormat::toFormattedString($cell->getCalculatedValue(), 'YYYY-MM-DD');
                $datos[$rowIndex]['pac_fecha'] = PHPExcel_Style_NumberFormat::toFormattedString($cell->getCalculatedValue(), 'MM-DD-YYYY');
            } else if('D' == $cell->getColumn()){
                $array_data[$rowIndex][$cell->getColumn()] = $cell->getCalculatedValue();
            }
        }
    }
    //print_r($array_data); 
    return $datos;  //retornamos los datos que alimentan el cuadro
}