Autor Tema: Crear archivos Excel con PHP uso de la librería PHPExcel para leer y escribir  (Leído 23298 veces)

EscobarCamilo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Buenos días: Agradezco quien me pueda colaborar con esta inquietud.

Usando phpExcel y mysql, necesito hacer una consulta y el resultado me lo coloque en una sola celda de excel que yo le indique, de un archivo plantilla que tengo.

Ej. El resultado de la consulta es: Camilo, Andres, Gustavo. Necesito que estos tres nombres o los que sean, me los guarde en por ejemplo la celda E1 de un archivo de excel. (No que me ponga los datos uno en cada celda.) Lo he intentado, y me genera el excel pero no me coloca nada en la casilla, pero cuando hago un echo $resultado, si me muestra bien la consulta. Agradezco si me puedne dar una luz. Este es el código que estoy utilizando.

Código: [Seleccionar]
require_once('../../../prod/third/phpexcel/PHPExcel.php');
 require_once('../../../prod/third/phpexcel/PHPExcel/IOFactory.php');

//Utilizo un excel plantilla que tengo.

$objTpl = PHPExcel_IOFactory::load("../../../app/MRE/doc/MRE.xls"); $objTpl->setActiveSheetIndex(0);

 //set first sheet as active

$query = "SELECT nombre FROM tabla where apellido = 'Escobar'"; $resultado = mysql_query($query);
$total = mysql_num_rows($resultado); while($row = mysql_fetch_array($resultado)) {

// Si dejo este código hasta aqui.. me sale en pantalla el resultado deseado.

//echo $dato ['nombre']; }


//aqui deberia colocarme en la celda E12 los tres nombres del resultado, pero me genera el excel y la casilla está en blanco.

$objTpl->getActiveSheet()->setCellValue('E12' . $row['nombre']);

Quiero que en la celda me quede por ejemplo:

Andres
Juan
Camilo

Bien agradezco sus sugerencias y colaboración. Un abrazo.
« Última modificación: 16 de Julio 2015, 17:40 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Ejercicio CU00828B del curso de PHP: funciones de cadenas, count_chars
« Respuesta #1 en: 16 de Julio 2015, 17:40 »
Hola, supongo que estás usando PHPExcel de https://phpexcel.codeplex.com/releases/view/119187

No puedo hacer comprobaciones porque no tengo el código completo con el que estás trabajando. Habría diversas comprobaciones que realizar.

A primera vista parece que no estás usando la sintaxis adecuada.

Esto es un ejemplo de sintaxis básica:

Código: [Seleccionar]
/** Include PHPExcel */
require_once 'PHPExcel.php';
 
 
// Create new PHPExcel object
$objPHPExcel = new PHPExcel();
 
 
// Set document properties
$objPHPExcel->getProperties()->setCreator("Thouhedul islam")
     ->setLastModifiedBy("Thouhedul islam")
     ->setTitle("PHPExcel Tutorial from tisuchi.com")
     ->setSubject("PHPExcel Tutorial from tisuchi.com")
         ->setDescription("This is the tutorial for PHP Excel from tisuchi.com")
      ->setKeywords("office PHPExcel php")
           ->setCategory("Tutorial Result");
 
 
// Add Data in your file
 
$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('A1', 'Visit ')
            ->setCellValue('B1', 'tisuchi.com')
            ->setCellValue('C1', 'for interesting')
            ->setCellValue('D1', 'tutorail');
 
 
 
$objPHPExcel->getActiveSheet()->setCellValue('A8',"Posted in \n tisuchi.com");
$objPHPExcel->getActiveSheet()->getRowDimension(8)->setRowHeight(-1);
$objPHPExcel->getActiveSheet()->getStyle('A8')->getAlignment()->setWrapText(true);
 
 
 
// Rename worksheet
$objPHPExcel->getActiveSheet()->setTitle('tisuchi.com');
 
 
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);
 
 
// Save Excel 2007 file
 
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save(str_replace('.php', '.xlsx', __FILE__));
$callEndTime = microtime(true);
$callTime = $callEndTime - $callStartTime;
 
echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, 'http://localhost/php')) , EOL;
 
 
 
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save(str_replace('.php', '.xls', __FILE__));
$callEndTime = microtime(true);
$callTime = $callEndTime - $callStartTime;
 
 
// Echo done
echo " Done writing files" , EOL;


Si te fijas por ejemplo en esta línea $objPHPExcel->getActiveSheet()->setCellValue('A8',"Posted in \n tisuchi.com");

ves que no se corresponde con $objTpl->getActiveSheet()->setCellValue('E12' . $row['nombre']);

Tienes un punto en lugar de una coma.

Para ver si el código es correcto hasta el momento de la escritura prueba a poner esta instrucción:


$objTpl->getActiveSheet()->setCellValue('E12' , "prueba de escritura");

Comprueba si te escribe correctamente la frase "prueba de escritura" en el archivo excel antes de tratar de introducir los datos.

Saludos

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Otra cosa, el título del tema debe referirse a aquello que consultas, en este caso has hecho referencia al ejercicio CU00828B del curso PHP pero la consulta no tiene nada que ver con esto ¿?

EscobarCamilo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Hola Alex, disculpa, te iba a responder y di por equivocación en reportar al moderador. Lo siento. Quería decirte que la sintaxis parece rara, pero está bien porque lo estoy haciendo por medio del scriptcase y tiene sus librerías de phpexcel en esa ruta.

Disculpa por lo de la ubicación del foro y tema, es la primera vez que lo hago y andaba medio perdido.

Al hacer prueba de escribir manualmente si me escribe en la celda, el problema es que al querer escribir el resultado de la consulta no me pone nada. He probado con punto, con coma, e igual no me pone el resultado. Si por ejemplo coloco manualmente que me escriba 'prueba' en una celda, me lo escribe sin problemas. No logro plasmar el resultado de la consulta en la celda. El resultado de mi consulta son digamos 3 registros, Juan, Andres y Camilo, y quiero que estos 3 nombres me los coloque en la misma celda que yo le indique. Cabe anotar que lo hago no en un nuevo excel sino en una plantilla que tengo.
Gracias amigo.

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola de nuevo, si el resultado son tres registros ( o n registros) tendrás que recorrerlos usando un bucle, introducir cada uno de los registros en una cadena usando concatenación, y esa cadena insertarla en el Excel.

Es decir, suponiendo que con $row['nombre'] extraigas los tres nombres correctamente dentro del bucle deberías hacer

$cadena = $cadena.$row['nombre'].'-';

Una vez sales del bucle hacer la inserción:


$objTpl->getActiveSheet()->setCellValue('E12' , $cadena);

Referencia para recorrer los items de la consulta: http://aprenderaprogramar.com/index.php?option=com_content&view=article&id=613:ejemplo-consulta-php-mysql-select-bucle-while-mysqlifetcharray-recorrer-resultados-query-cu00842b&catid=70:tutorial-basico-programador-web-php-desde-cero&Itemid=193

Referencia para concatenar cadenas: http://aprenderaprogramar.com/index.php?option=com_content&view=article&id=563:concatenar-cadenas-strings-php-strlen-longitud-caracteres-y-substr-extraer-subcadenas-cu00821b&catid=70:tutorial-basico-programador-web-php-desde-cero&Itemid=193

Todo el curso PHP: http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=70&Itemid=193

Saludos

EscobarCamilo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Hola, me sale variable $cadena no definida. Pregunto, en el caso que el resultado de mi consulta sea un solo registro (no tendría que concatenar nada), debería ponerlo sin problema no? y aun así no lo coloca. Y lo raro es que cuando hago
Código: [Seleccionar]
echo $dato ['nombre']; si me muestra el resultado en pantalla como es. Disculpa pero la verdad es que soy muy nuevo.

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola inicializa $cadena antes del bucle como $cadena = ""; //Cadena vacía

Por un lado estás haciendo referencia a $dato ['nombre'] y por otro a $row['nombre'] pero no veo dónde tienes definida la variable $dato posiblemente en otra parte del código ¿?

Si el resultado de la consulta es un solo registro el tipo de dato no coincide o no es reconocido como cadena, debes asegurarte de que sea tratado como una cadena para poder trabajar con él.

Saludos

EscobarCamilo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Hola, ya no me sale lo de definir la variable, lo inicialice como dices.
Ahora lo de dato y row, fue que le cambie el nombre, pero ya lo unifiqué. es $row.

Hice la prueba, y me escribe en la celda solamente esto: - que es la linea que está en

Código: [Seleccionar]
$cadena = $cadena.$row['nombre'].'-'; 

Pero no me pone el resultado. :(    (Será que hay que convertir el resultado en algo?).

Si yo hago la prueba escribiendo:

Código: [Seleccionar]
echo $row ['nombre'];
Me arroja el resultado de la consulta bien.

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Puedes tener un conflicto con las comillas

$cadena = $cadena.$row['nombre'].'-'; parece un mal cierre de comillas.

Prueba con

$cadena = $cadena.$row['nombre']."-";

Esto elimina la ambiguedad en las comillas al quedar la comilla simple como delimitador del índice del array asociativo y las comillas dobles como delimitadoras para concatenación de la cadena.

Para descartar otros problemas sube esto en un archivo al servidor y comprueba el resultado:

Código: [Seleccionar]
<?php

$cadena 
'';
$txt1 'pablo';
$txt2 'juan';

$cadena $cadena.$txt1.' - ';

$cadena $cadena.$txt2' y fin';

echo 
'Resultado: '.$cadena;

?>

¿Qué resultado obtienes?

Saludos

EscobarCamilo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Hola, el resultado es este:

Resultado: pablo - juan y fin

Probé lo de las comillas "" y ''  y de todas fomras solo me pone en la celda esto: -
Es como si no reconociera el valor que hay dentro de $row['nombre']

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Es extraño. ¿Tienes activado el depurador php en el servidor? Es decir, si tienes alguna incorrección en la sintaxis te muestra por pantalla el mensaje de error y la línea donde el analizador sintáctico detecta el error?

EscobarCamilo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Hola, gracias por responder. Si claro, el me muestra cuando hay error, y en que linea. Pero no me dice nada. Solo me ejecuta el código, me abre el excel, y sorpresa.. :( en la celda no hay nada. Ya no se que hacer.....

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola prueba con

Código: [Seleccionar]
$objTpl->getActiveSheet()->setCellValueExplicit('E12', $row['nombre'], PHPExcel_Cell_DataType::TYPE_STRING);

EscobarCamilo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Me genera el excel, no me saca ningún error pero sigue saliendo la casilla en blanco. No me coloca nada. Me da pena contigo que debes andar bien ocupado. Tu podrías hacer una prueba tuya localmente?  Una tabla consultas algo que te arroje varios resultados y lo guardes a una celda de excel? (con phpExcel).  Y lo que pasa es que si soluciono eso puedo salir adelante con mi trabajo, de lo contrario me van a sacar del puesto :(

EscobarCamilo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Alex, amigo. Gracias por tu ayuda. Mágicamente se me iluminó la mente, y me dio por cambiar un }. Sabes que ocurría? que hacía la consulta y cerraba con } y luego hacia la instrucción de pasar el resultado a excel. No sé pero seguro al cerrar con } antes de hacer la copia al excel el cerraba la consulta y borraba los resultados. No sé.

Ya me aparecen los resultados en la celda que necesito. :) Te mando un abrazo y gracias por toda tu buena actitud y colaboración.

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Pues me alegro que se haya resuelto, a veces pequeños detalles causan grandes problemas, igualmente un abrazo. Hablamos por los foros! Saludos

EscobarCamilo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Si amigo, de nuevo muchas gracias por tu paciencia.  Como hago para cerrar el tema o darlo como resuelto?

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola, para dar un tema como resuelto no solemos hacer ninguna acción específica, simplemente indicarlo en la propia conversación. Una vez la conversación se cierra el tema ya va pasando a un segundo plano a medida que llegan nuevos mensajes a los foros. Saludos.

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".