Foros del Web » Programando para Internet » PHP »

Problema con PHPExcel (clase Excel2007)

Estas en el tema de Problema con PHPExcel (clase Excel2007) en el foro de PHP en Foros del Web. Hola a todos. Estoy trabajando con php y la librería de PHPExcel. Llevo unos días atascado en un par de cosas que no soy capaz ...
  #1 (permalink)  
Antiguo 01/08/2012, 04:42
 
Fecha de Ingreso: junio-2012
Mensajes: 46
Antigüedad: 11 años, 9 meses
Puntos: 0
Problema con PHPExcel (clase Excel2007)

Hola a todos.

Estoy trabajando con php y la librería de PHPExcel. Llevo unos días atascado en un par de cosas que no soy capaz de solventar.

Este es el código:

Código PHP:
<?php
include("/../prueba.php");  
/* Obtenemos datos del usuario de Joomla */
$user JFactory::getUser();
$id $user->id;
$name $user->name;
$username $user->username;
$email $user->email;
/* Incluimos la ruta */
set_include_path(get_include_path() . PATH_SEPARATOR './Classes/');
/* Obtenemos la clase para archivos .xlsx */
require_once('PHPExcel/IOFactory.php');
set_time_limit(0);
ini_set('memory_limit','64M');
$objReader PHPExcel_IOFactory::createReader('Excel2007');
/* Nombre del archivo .xlsx */
$nombre_archivo="notas.xlsx";
$objPHPExcel $objReader->load($nombre_archivo);
/* Inicializamos las variables de columnas y filas */
$col 0;
$row 0;
/* Obtenemos el numero maximo de filas y columnas */
$highestRow $objPHPExcel->getActiveSheet()->getHighestRow();
$highestColumn $objPHPExcel->getActiveSheet()->getHighestColumn();
/* Comprobamos que el ID de usuario existe en la hoja de calculo */
    
for ($row 0$row <= $highestRow$row++) {
        
$usuario $objPHPExcel->getActiveSheet()->getCell('A'.$row)->getValue();
        if (
$id == $usuario) {
            
$expediente $objPHPExcel->getActiveSheet()->getCell('B'.$row)->getValue();
            echo 
"<h2>Notas</h2>";
            echo 
"&nbsp;&nbsp;&nbsp;Nombre del alumno: " "<b>$name</b>";
            echo 
"<br>&nbsp;&nbsp;&nbsp;Nombre de acceso: " "<b>$username</b>";
            echo 
"<br>&nbsp;&nbsp;&nbsp;Dirección de correo: " "<b>$email</b>";
            echo 
"<br>&nbsp;&nbsp;&nbsp;Número de expediente: " "<b>$expediente</b>";
            
$col 2;?>
            <div align="center"><br>
                    <table align="center">
                        <tr align="center">
                        <?php
            
for ($col 2$col <= [B]$highestColumn[/B]; $col++) {
                
$notas $objPHPExcel->getActiveSheet()->getCellByColumnAndRow($col,$row)->getValue(); 
                
$materias $objPHPExcel->getActiveSheet()->getCellByColumnAndRow($col,0)->getValue();?>
                            
                            <th width="75"><?php echo $materias ?></th>
                            <td width="75"><?php echo $notas ?></td>
                        <?php }?>
                        </tr>
                    </table>
                </div><?php
        
}
    }
Los problemas que tengo son:

1- En el segundo for, donde hago la pasada por las columnas. Si utilizo la variable $highestColumn (que creo que está bien definida) no entra nunca en el for, cuando el valor que me devuelve ésa variable es 'J'. Supongo que tiene algo que ver conque $col devuelve un entero y ésa variable un carácter pero no soy capaz de encontrar la solución.

2- Dentro del bucle for necesito que me muestre la primera fila con todas las columnas:

Código PHP:
$materias $objPHPExcel->getActiveSheet()->getCellByColumnAndRow($col,0)->getValue(); 
Sin embargo no obtengo dato alguno. He probado con getCellByColumnAndRow($col,'0'), getCell($col.0) y otras posibilidades sin conseguirlo, siempre obtengo celda vacía, cuando la fila 0 de mi archivo .xlsx tiene los nombres de las asignaturas de cada alumno (historia, matemáticas, etc).
Si por ejemplo logueo a la página con un usuario que se encuentra en mi archivo en la fila '2' y pongo lo siguiente:

Código PHP:
$materias $objPHPExcel->getActiveSheet()->getCellByColumnAndRow($col,$row-2)->getValue(); 
Si me dá los nombres de las asignaturas, pero obviamente ése código no me vale.

Espero haberme explicado bien y podáis guiarme como llevarlo a cabo.

Un saludo.
  #2 (permalink)  
Antiguo 01/08/2012, 10:10
 
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 389
Antigüedad: 13 años, 1 mes
Puntos: 16
Respuesta: Problema con PHPExcel (clase Excel2007)

Bicho No veo bien esta sintaxis.
Código PHP:
Ver original
  1. for ($col = 2; $col <= [B]$highestColumn[/B]; $col++) {
puedes indicarme que es la B entre corchetes? estoy analizando el codigo... unos minutos..
__________________
Lo imposible es lo posible visto por los ojos de un incapaz.
Si te sirve la respuesta. dale + al karma.
Saludos
  #3 (permalink)  
Antiguo 01/08/2012, 10:20
 
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 389
Antigüedad: 13 años, 1 mes
Puntos: 16
Respuesta: Problema con PHPExcel (clase Excel2007)

Bueno. Espero esto te ayude. Creo que es mas facil asi
Código PHP:
Ver original
  1. $hoja = $arcexcel->setActiveSheetIndex(0);
  2. $totalColm=$hoja->getHighestColumn();
  3. $filas= $hoja->getHighestRow();
  4. $loqueQuieresImprimir="<table><tr>";
  5. if($filas==0){
  6.         for($columna=0;$columna<=4;$columna++){
  7.                 $valor = $hoja->getCellByColumnAndRow($columna,$fil)->getvalue();
  8.                 $loqueQuieresImprimir.="<td>$valor</td>";
  9.         }
  10. }//fin del if
  11. $loqueQuieresImprimir="</tr></table>";
No recuerdo pero creo que el contador de las filas en phpexcel empieza en 1. en ese caso cambiarias en el IF la comparacion de 0 por uno.
Eso en caso de que nada mas quieras la primera fila. si quieres imprimir todo el documento, te la juegas con un for en vez del if, que recorra las filas. y lo anidas con el que ya esta. SI entendi tu pregunta. esa es la respuesta. Espero te sirva....!
__________________
Lo imposible es lo posible visto por los ojos de un incapaz.
Si te sirve la respuesta. dale + al karma.
Saludos
  #4 (permalink)  
Antiguo 01/08/2012, 14:10
 
Fecha de Ingreso: junio-2012
Mensajes: 46
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Problema con PHPExcel (clase Excel2007)

Gracias rjulio21.

Conseguí arreglar ése punto con tu ayuda, cosa que te agradezco. Tenías razón, las filas empiezan desde 1. No hacía falta siquiera el "if", sólo getCellByColumnAndRow($col,1).

He arreglado varias cosas, entre ellas la creación de la tabla que lo hacía con html y estaba mal estructurada. El código PHP que tengo ahora es el siguiente:

Código PHP:
<?php
include("/homepages/42/d413216804/htdocs/calderondelabarca/prueba.php");  
/* Obtenemos datos del usuario de Joomla */
$user JFactory::getUser();
$id $user->id;
$name $user->name;
$username $user->username;
$email $user->email;
/* Incluimos la ruta */
set_include_path(get_include_path() . PATH_SEPARATOR './Classes/');
/* Obtenemos la clase para archivos .xlsx */
require_once('PHPExcel/IOFactory.php');
set_time_limit(0);
ini_set('memory_limit','64M');
$objReader PHPExcel_IOFactory::createReader('Excel2007');
/* Nombre del archivo .xlsx */
$nombre_archivo="notas.xlsx";
$objPHPExcel $objReader->load($nombre_archivo);
/* Inicializamos las variables de columnas y filas */
$col 0;
$row 0;
/* Obtenemos el numero maximo de filas y columnas */
$highestRow $objPHPExcel->getActiveSheet()->getHighestRow();
$highestColumn $objPHPExcel->getActiveSheet()->getHighestColumn();
            echo 
"<h2>Notas</h2>";
            echo 
"&nbsp;&nbsp;&nbsp;Nombre del alumno: " "<b>$name</b>";
            echo 
"<br>&nbsp;&nbsp;&nbsp;Nombre de acceso: " "<b>$username</b>";
            echo 
"<br>&nbsp;&nbsp;&nbsp;Dirección de correo: " "<b>$email</b>";
/* Comprobamos que el ID de usuario existe en la hoja de calculo */    
$cont = -1;                
    for (
$row 0$row <= $highestRow$row++) {
        
$usuario $objPHPExcel->getActiveSheet()->getCell('A'.$row)->getValue();
        
        if (
$id == $usuario) {
            
$expediente $objPHPExcel->getActiveSheet()->getCell('B'.$row)->getValue();
            echo 
"<br>&nbsp;&nbsp;&nbsp;Número de expediente: " "<b>$expediente</b>";
            
$col 2;
            
$table "<div align='center'><br>";
            
$table .= "<table>";
            
$table .= "<tr align='center'>";
            for (
$col 2$col <= 10$col++) { 
                
$materias $objPHPExcel->getActiveSheet()->getCellByColumnAndRow($col,1)->getValue();
                
$table .= "<th width='75'>$materias</th>";                    
            }
            
$table .= "<tr align='center'>";
            for (
$col 2$col <= 10$col++) {    
                
$notas $objPHPExcel->getActiveSheet()->getCellByColumnAndRow($col,$row)->getValue();         
                
$table .= "<td width='75'>$notas</td>";
            }
            
$table .= "<tr>";
        }        
    }
        if (
$id != $usuario) {
                
$table1 "<div align='center'><br>";
                
$table1 .= "<table>";
                
$table1 .= "<tr align='center'>";
                
$table1 .= "<th width='400'>No hay notas disponibles</th>";
                
$table1 .= "</tr>";
                
$table1 .= "</table>";
                
$table1 .= "</div>";
                echo 
$table1;
        }
    
    
$table .= "</tr>";
    
$table .= "</table>";
    
$table .= "</div>";
echo 
$table;

?>
Me gustaría no tener que dar un número entero de columnas, sino que lo cogiera a través de getHighestColumn();. Sin embargo si pongo:

Código PHP:
for ($col 2$col <=$ highestColumn $col++) { 
no me lo coge y no sé como debería hacerlo, ni siquiera he conseguido encontrar información al respecto.

Otra cosa importante es el control que trato de hacer para que si el usuario logueado no se encuentra en el archivo .xlsx muestre un mensaje que en este caso lo muestro en tabla:

Código PHP:
if ($id != $usuario) {
                
$table1 "<div align='center'><br>";
                
$table1 .= "<table>";
                
$table1 .= "<tr align='center'>";
                
$table1 .= "<th width='400'>No hay notas disponibles</th>";
                
$table1 .= "</tr>";
                
$table1 .= "</table>";
                
$table1 .= "</div>";
                echo 
$table1;

Pero que ocurre, que al hacer el bucle las pasadas por la columna 'A', en el momento que llega a un usuario que no corresponda con el id del usuario logueado me salta el mensaje y he probado y probado y no encuentro la forma adecuada de hacerlo. A ver si alguien me ilumina.

Un saludo.
  #5 (permalink)  
Antiguo 01/08/2012, 14:27
 
Fecha de Ingreso: junio-2012
Mensajes: 46
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Problema con PHPExcel (clase Excel2007)

Me ha venido la inspiración, parece que ya controlo los mensajes tanto si existe en el fichero o viceversa:

Código PHP:
    $prueba false;            
    for (
$row 0$row <= $highestRow$row++) {
        
$usuario $objPHPExcel->getActiveSheet()->getCell('A'.$row)->getValue();
        
        if (
$id == $usuario) {
            
$expediente $objPHPExcel->getActiveSheet()->getCell('B'.$row)->getValue();
            echo 
"<br>&nbsp;&nbsp;&nbsp;Número de expediente: " "<b>$expediente</b>";
            
$col 2;
            
$table "<div align='center'><br>";
            
$table .= "<table>";
            
$table .= "<tr align='center'>";
            for (
$col 2$col <= 10$col++) { 
                
$materias $objPHPExcel->getActiveSheet()->getCellByColumnAndRow($col,1)->getValue();
                
$table .= "<th width='75'>$materias</th>";                    
            }
            
$table .= "<tr align='center'>";
            for (
$col 2$col <= 10$col++) {    
                
$notas $objPHPExcel->getActiveSheet()->getCellByColumnAndRow($col,$row)->getValue();         
                
$table .= "<td width='75'>$notas</td>";
            }
            
$table .= "<tr>";
            
$prueba true;
        }        
    }
    if (
$prueba == false) {
        if (
$id != $usuario) {
                
$table1 "<div align='center'><br>";
                
$table1 .= "<table>";
                
$table1 .= "<tr align='center'>";
                
$table1 .= "<th width='400'>No hay notas disponibles</th>";
                
$table1 .= "</tr>";
                
$table1 .= "</table>";
                
$table1 .= "</div>";
                echo 
$table1;
                
$prueba true;
        }
    } 
De todas formas si veis algún error no dudeis en decírmelo.

Quedaría el tema para que en el for no tenga que poner un número entero, sino que lo cogiera desde la variable $highestColumn.

Un saludo.
  #6 (permalink)  
Antiguo 01/08/2012, 14:51
 
Fecha de Ingreso: enero-2011
Ubicación: DF
Mensajes: 898
Antigüedad: 13 años, 2 meses
Puntos: 155
Respuesta: Problema con PHPExcel (clase Excel2007)

Cita:
Iniciado por El_LoBooo Ver Mensaje
Me ha venido la inspiración, parece que ya controlo los mensajes tanto si existe en el fichero o viceversa:

Código PHP:
    $prueba false;            
    for (
$row 0$row <= $highestRow$row++) {
        
$usuario $objPHPExcel->getActiveSheet()->getCell('A'.$row)->getValue();
        
        if (
$id == $usuario) {
            
$expediente $objPHPExcel->getActiveSheet()->getCell('B'.$row)->getValue();
            echo 
"<br>&nbsp;&nbsp;&nbsp;Número de expediente: " "<b>$expediente</b>";
            
$col 2;
            
$table "<div align='center'><br>";
            
$table .= "<table>";
            
$table .= "<tr align='center'>";
            for (
$col 2$col <= 10$col++) { 
                
$materias $objPHPExcel->getActiveSheet()->getCellByColumnAndRow($col,1)->getValue();
                
$table .= "<th width='75'>$materias</th>";                    
            }
            
$table .= "<tr align='center'>";
            for (
$col 2$col <= 10$col++) {    
                
$notas $objPHPExcel->getActiveSheet()->getCellByColumnAndRow($col,$row)->getValue();         
                
$table .= "<td width='75'>$notas</td>";
            }
            
$table .= "<tr>";
            
$prueba true;
        }        
    }
    if (
$prueba == false) {
        if (
$id != $usuario) {
                
$table1 "<div align='center'><br>";
                
$table1 .= "<table>";
                
$table1 .= "<tr align='center'>";
                
$table1 .= "<th width='400'>No hay notas disponibles</th>";
                
$table1 .= "</tr>";
                
$table1 .= "</table>";
                
$table1 .= "</div>";
                echo 
$table1;
                
$prueba true;
        }
    } 
De todas formas si veis algún error no dudeis en decírmelo.

Quedaría el tema para que en el for no tenga que poner un número entero, sino que lo cogiera desde la variable $highestColumn.

Un saludo.

aaaay we lo que es que nomas ordenes tantito el codigo hasta te iluminate's' vieentos como observación , poner un método o función dentro de un bucle for es una mala practica , por que cada vez que se ejecute el for , se ejecutara ese método o función , impactando así directamente en el rendimiento de tu aplicación, asi con el dato guardado en una variable esta bien
__________________
No me interesan ni las gracias ni los karmas , pero si que se genere conocimiento, si se dio con la respuesta por favor confirmalo
  #7 (permalink)  
Antiguo 02/08/2012, 07:56
 
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 389
Antigüedad: 13 años, 1 mes
Puntos: 16
Respuesta: Problema con PHPExcel (clase Excel2007)

No se de donde tomas el id. pero creo que puedes mejorar un poco el codigo.
Cosas como
Código PHP:
Ver original
  1. $objPHPExcel->getActiveSheet()->getCell('B'.$row)->getValue();
Puedes capturarlos en variables como en el ejemplo que te di, que cree la variable "$hoja", simplificando que tengas que escribir tanto, y creo que no son necesarios los dos for adentro del if. puedes crear todo en uno solo.

Otra recomendacion es que no le des esos atributos de estilo con HTML, sino que crees un archivo CSS que los maneje. asi el codigo HTML se te hara mucho mas limpio y facil de manejar.
__________________
Lo imposible es lo posible visto por los ojos de un incapaz.
Si te sirve la respuesta. dale + al karma.
Saludos

Etiquetas: clase, phpexcel, variables, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:51.