last day (15 days later) » 

3:06 PM
0
Q: exportar excel con php y sql server

PierroBuenas Quisiera exportar excel de php con sql server : El error que me esta saliendo es este: sqlsrv_query() expects parameter 1 to be resource, string given in sqlsrv_fetch_array() expects parameter 1 to be resource, boolean given in Este es lo que he realizado. <?php $serverName =...

 
$dbc debe ser un objeto de conexión a la base de datos. ¿Dónde estás conectado y asignando a la conexión la variable $dbc? Revisa lo que dice el Manual al respecto, viendo los ejemplos de código.
 
@A.Cedano tienes razón por eso edite mi pregunta hermano igual me sale el error que coloque ahora
 
Como te decía, revisa la documentación. Estás pasando los parámetros al revés a sqlsrv_query, debes pasar primero la conexión y luego la consulta: $result =sqlsrv_query($conn,$sql);
 
@A.Cedano tienes razón ya me exporto pero ahora todo me sale como null y no los valores de la tabla
@A.Cedano coloque la imagen en mi pregunta
 
Haces un manejo extraño y confuso de los datos aquí: while ($finfo = sqlsrv_fetch_array($result)) ¿qué es lo que pretendes hacer ahí?
 
3:06 PM
@A.Cedano es extraer los datos que me debe arrojar mi query
 
No necesitas hacer todo ese lío que haces en while
Intenta algo así:
 
@A.Cedano entonces no necesito hacer eso . mas bien disculpe por mis errores soy nuevo en php y trabajando con sql server maestro
 
$arrResult=array();

while( $row = sqlsrv_fetch_array( $result, SQLSRV_FETCH_ASSOC) ) {
$arrResult[]=$row;
}
print_r($arrResult);
Ahí te pondrá en $arrResult todos los resultados que necesitas. Luego el siguiente paso será pasarlos a Excel. Eso no sé como se haría, pero si me dices la librería que estás usando puedo verificarlo, debería ser fácil pasar un array a Excel si la librería está bien escrita, sin demasiadas complicaciones.
 
@A.Cedano no estoy realizando en ninguna libreria
de excel pense que se podia realizar asi
 
Ah perdona, no había visto los header que tenías.
 
3:13 PM
@A.Cedano disculpame a mi maestro.
 
Primero, confírmame que con el código como te lo puse muestra al menos los datos correctamente en pantalla, o sea, muestra contenido con los datos.
 
si hermano me salio asi como la imagen que te mande en el excel
imagen maestro
 
ok ok vamos bien, ahora sólo hay que leer el array de forma adecuada para que lo muestre bien. Espera...
 
@A.Cedano mil gracias
 
No estoy seguro de que funcione, pero intenta esto en principio:
$out = fopen("php://output", 'w');
foreach ($arrResult as $row)
{
fputcsv($out, $row,"\t");
}
fclose($out);
Quita el print_r anterior, que era sólo de prueba.
 
3:24 PM
@A.Cedano es decir
que
esto lo borro
y coloco que me otorga
maestro pero como haria para que salga la cabecera con los nombres y este el numero se muestre todo y no como esta
$sql="select cast(fechadesembolso as varchar(250)) as fechadesembolso ,cast(fecharevision as varchar(250)) as fecharevision ,NumeroCredito,Zona,Equipo,jefeoperacion,Catalogo1,DescripcionCatalogo1,Catalogo2,DescripcionCatalogo2,Catalogo3,DescripcionCatalogo3,Catalogo4,DescripcionCatalogo4,comentario from reporteexcel_Gerente";




header("Content-Type: application/xls");
header("Content-Disposition: attachment; filename=Reporte_excel.xls");
header("Pragma: no-cache");
header("Expires: 0");
header("Content-Transfer-Encoding: binary ");
 
Vamos por parte
En cuanto a la columna C, ¿si la agrandas no se muestran los datos correctamente?
 
@A.Cedano esta bien mi docente.
@A.Cedano no maestro sigue igual mostrandose como si daria dar formato
 
dame un ejemplo de los datos reales de esa columna
 
@A.Cedano este es lo que debe aparecer : 1312001861412
en la columna c
 
Eso lo puedes resolver desde Excel, cambiando el formato de esa columna de Number a Text. No sé si eso se puede hacer desde PHP directamente. Pero es algo relativamente fácil.
 
3:39 PM
@A.Cedano aya hermano gracias y como haria para darle la cabecera maestro
ahora me sale en blanco.
 
¿qué te sale en blanco, la cabecera?
 
@A.Cedano si maestro
 
Bien, se me ocurre esto:
1. Obtienes las cabeceras tomando las llaves del array:
    $headers= array_keys($arrResult);
Y luego
Pones las cabeceras en el CSV que se ha creado antes:
    fputcsv($out, $headers);
Y luego, el código que te dije anteriormente:
    foreach ($arrResult as $row)
    {
         fputcsv($out, $row,"\t");
    }
    fclose($out);
Ahora te pongo todo completo:
$out = fopen("php://output", 'w');
$headers= array_keys($arrResult);
fputcsv($out, $headers);
foreach ($arrResult as $row)
{
     fputcsv($out, $row,"\t");
}
fclose($out);
 
@A.Cedano hermano
me sale todo numeros
 
Oh que desastre, perdona, cambia esto así:
    $headers= array_keys($arrResult[0]);
De ese modo buscará las claves solamente en el primer elemento del array, nos interesa sólo una vez para los encabezados
 
3:51 PM
@A.Cedano tienes razon ya salio la caberza
pero todo en la columna 1
$result =sqlsrv_query($conn,$sql);

print("\n");

$arrResult=array();

while( $row = sqlsrv_fetch_array( $result, SQLSRV_FETCH_ASSOC) ) {
$arrResult[]=$row;
}

$out = fopen("php://output", 'w');
$headers= array_keys($arrResult[0]);
fputcsv($out, $headers);
foreach ($arrResult as $row)
{
fputcsv($out, $row,"\t");
}
fclose($out);
 
Eso sí que es desastroso! pero estamos cerca de la solución, espera
 
si maestro eres un genio :D
 
Modifica la dichosa línea así:
fputcsv($out,explode(', ', $headers));
De ese modo, te pondrá cada clave en una columna
porque hará un explode usando la ,
 
@A.Cedano asi seria :
while( $row = sqlsrv_fetch_array( $result, SQLSRV_FETCH_ASSOC) ) {
$arrResult[]=$row;
}

$out = fopen("php://output", 'w');
$headers= array_keys($arrResult[0]);

fputcsv($out,explode(', ', $headers));
foreach ($arrResult as $row)
{
fputcsv($out, $row,"\t");
}
fclose($out);
 
 
3:57 PM
 
Eso sí que es desastroso, veamos entonces...
 
@A.Cedano no diga eso maestro , vamos bien
 
Había un estado anterior en el que debía funcionar
Probemos de nuevo:
¿Qué resultado da así?
while( $row = sqlsrv_fetch_array( $result, SQLSRV_FETCH_ASSOC) ) {
$arrResult[]=$row;
}

$out = fopen("php://output", 'w');
$headers= array_keys($arrResult[0]);

fputcsv($out,$headers);
foreach ($arrResult as $row)
{
fputcsv($out, $row,"\t");
}
fclose($out);
 
hemano me vota que la cabecera esta al inico
 
Me parece extraño, voy a revisar la doc en el Manual
 
4:12 PM
@A.Cedano yo tambien estoy leyendo para format pero no encuentro nada
 
4:29 PM
Parece que hay algún problema o conflicto con los encabezados, por eso no está reconociendo la primera línea del CSV, vamos a probar esto:
ob_start();

while( $row = sqlsrv_fetch_array( $result, SQLSRV_FETCH_ASSOC) ) {
$arrResult[]=$row;
}

$out = fopen("php://output", 'w');
$headers= array_keys($arrResult[0]);

fputcsv($out,$headers);
foreach ($arrResult as $row)
{
fputcsv($out, $row,"\t");
}
fclose($out);

$content = ob_get_contents();
ob_end_clean();
echo trim($content);
 
@A.Cedano lo puse pero igual me sale en la primer columna
 
¿Y si trasladas esto ob_start(); al principio del todo, antes de header("Content-Type: application/xls");
 
ob_start();
header("Content-Type: application/xls");
header("Content-Disposition: attachment; filename=Reporte_excel.xls");
header("Pragma: no-cache");
header("Expires: 0");
header("Content-Transfer-Encoding: binary ");

$sep = "\t"; //tabbed character

$result =sqlsrv_query($conn,$sql);

print("\n");

$arrResult=array();




while( $row = sqlsrv_fetch_array( $result, SQLSRV_FETCH_ASSOC) ) {
$arrResult[]=$row;
}

$out = fopen("php://output", 'w');
$headers= array_keys($arrResult[0]);

fputcsv($out,$headers);
igual sale hermano
 
Voy a hacer una prueba en local a ver qué pasa
 
@A.Cedano gracias hermano no se tambien que pasa
 
4:56 PM
@A.Cedano hermano lo hice de otra forma pero ahora mi excel me vota como si el excel esta malo
$sql ="EXEC Sp_RevCatalogo 13,'2','' ";
$params = array('$t4','$t5','$t6');
$resultado = sqlsrv_query($conn, $sql, $params);

$fila = 7; //Establecemos en que fila inciara a imprimir los datos

$gdImage = imagecreatefrompng('img/Qapaq.png');//Logotipo

//Objeto de PHPExcel
$objPHPExcel = new PHPExcel();

//Propiedades de Documento
$objPHPExcel->getProperties()->setCreator("Marko robles")->setDescription("Reporte de Productos");

//Establecemos la pestaña activa y nombre a la pestaña
$objPHPExcel->setActiveSheetIndex(0);
@A.Cedano ese procedimiento igual tiene el query solo select
 
Si usas la librería PHPExcel, puedes probar así:
$arrResult=array();

while( $row = sqlsrv_fetch_array( $result, SQLSRV_FETCH_ASSOC) ) {
$arrResult[]=$row;
}

$headers= array_keys($arrResult[0]);
$objPHPExcel->getActiveSheet()->fromArray($headers, NULL, 'A1');
$objPHPExcel->getActiveSheet()->fromArray($arrResult, NULL, 'A2');
 
@A.Cedano hermano te comento yo primero estoy probando en mi maquina y si ya funciona con el codigo que te mande
pero ese mismo codigo lo pongo en otro servidor
y no funciona me vota ese error
porque se debe eso maestro
por eso estaba haciendo de otra forma
como lo estabamos haciendo
 
Pues no sé... la librería PHPExcel está obsoleta, si te decides por esa solución deberás usar otra librería llamada PHPSpreadSheet. Puedes mirarlo luego aquí: es.stackoverflow.com/a/128583/29967 Yo veré si encuentro una solución basada en el código original, sin librerías.
 
sin el excel_php
 
5:28 PM
Lo tengo con el código original, en efecto era una tontería...
while( $row = sqlsrv_fetch_array( $result, SQLSRV_FETCH_ASSOC) ) {
$arrResult[]=$row;
}

$out = fopen("php://output", 'w');

$headers= array_keys($arrResult[0]);
fputcsv($out,$headers,"\t");

foreach ($arrResult as $row)
{
fputcsv($out, $row,"\t");
}
fclose($out);
Faltaba ponerle el delimitador en esta línea: fputcsv($out,$headers,"\t");
Por eso ponía todo en una sola columna. Lo he probado y funciona.
 
@A.Cedano aya con razon hermano
hermano en mi local funciona bien pero en el servidor window server
sale junto que extraño
 
5:44 PM
¿Con el código de mi respuesta o con la librería? Puede ser un problema del separador \t
 
@A.Cedano con el codigo de su respuestas maestro
$sql="select cast(fechadesembolso as varchar(250)) as fechadesembolso ,cast(fecharevision as varchar(250)) as fecharevision ,NumeroCredito,Zona,Equipo,jefeoperacion,Catalogo1,DescripcionCatalogo1,Catalogo2,DescripcionCatalogo2,Catalogo3,DescripcionCatalogo3,Catalogo4,DescripcionCatalogo4,comentario from reporteexcel_Gerente";



ob_start();
header("Content-Type: application/xls");
header("Content-Disposition: attachment; filename=Reporte_excel.xls");
header("Pragma: no-cache");
header("Expires: 0");
este mismo codigo lo ejecuto en mi local funciona
pero ese ismo lo coloco en window server
sale como la imagen que raro
@A.Cedano hermano
ya me salio
lo actualize
xampp
 
ya funciona entonces?
 
@A.Cedano si hermano pero ahora el numero no se puede formatear estaba intentando como esta en
docum
pero no sale
 
¿qué número?
 
1313002180822
mira hermano
 
5:52 PM
Eso se resuelve dándole un formato Numero en indicando que le ponga 0 posiciones decimales. Es un problema de representación de Excel, no de los datos en sí.
Si activas cualquiera de las celdas verás los datos correctos arriba, en el editor
Seleccionar la columna entera, eliges formato->Numero y le indicas que ponga 0 posiciones decimales
Por último le puedes quitar el ob_start y los print de líneas vacías que tienes. Revisa mi respuesta en la pregunta, he puesto el código completo corregido.
 
@A.Cedano tienes razon hermano , esque los usuario dicen tiene que estar tambien formateado
@A.Cedano ya hable con los usuarios me dijieron que tiene que salir ya formateado :(
 
¿Cómo así que tiene que salir formateado?
¿que la columna C debe crearse ya con ese formato?
 
 
3 hours later…
9:33 PM
@A.Cedano si asi como
Que se noten todos los numeros
Solo la columna C
 
Yo dudo que eso se pueda hacer desde PHP simplemente, de todos modos voy a investigarlo. Si no, seguro que se puede con una librería, pero en ese caso no optes por PHPExcel, la cual fue declarada obsoleta, sería mejor que uses PHPSpreadSheets.
 
9:51 PM
Hermano y con esa librwria se puede tambien php y sql server lo quise ver la documentacion pero no tngo acceso a internet
Com esa libreria tambien se podria realizar con sql server maestro
 
Sí, y desde PHP. Lo que quise decir es que, con el código simple usando fputcsv lo veo difícil hacerlo, porque ese código lo que hace es volcar los datos en el archivo Excel
Tendrías que usar la librería (siempre desde PHP y obteniendo los datos en un array como lo tienes ahora).
Sólo que en vez de fputcsv usarás la librería para crear el Excel
Yo intuyo que la librería te permite formatear una determinada celda, que es de lo que se trata. No he revisado la documentación, pero imagino que se puede. Cuando puedas revisa la librería, instálala en tu entorno y haz una prueba de código.
Si tienes problemas, plantea una nueva pregunta con el problema. No modifiques esta pregunta, porque la misma trata sobre otro asunto inicial que era que no te funcionaba bien la conexión a la base de datos.
Este es el enlace de la librería: phpspreadsheet.readthedocs.io/en/develop/#getting-started ahí explican todo para instalarla y dan ejemplos con código de cómo se usa.
 
10:27 PM
Gracias estimado lo vere maestro
 

last day (15 days later) »