Entre las técnicas comunes para crear archivos de Excel desde PHP esta la de manipular los encabezados del HTTP y hacerle creer al navegador que se está descargando un archivo de Excel, sin embargo el contenido del archivo no es Excel sino HTML.
De la siguiente forma:
[sourcecode language=’php’]
«;
$print .= «
$print .= «
$print .= «Valor 1»;
$print .= «
«;
$print .= «
$print .= «Valor 2»;
$print .= «
«;
$print .= «
$print .= «Total»;
$print .= «
«;
$print .= «
«;
$print .= «
$print .= «
$print .= «10»;
$print .= «
«;
$print .= «
$print .= «20»;
$print .= «
«;
$print .= «
$print .= «=suma(A2:B2)»;
$print .= «
«;
$print .= «
«;
$print .= «
«;
echo $print;
?>[/sourcecode]
Esto a pesar de generar un warning al momento de abrir el archivo es funcional, por lo menos en clientes con Windows y Office instalado, observese que inclusive se pueden establecer fórmulas y si se quisiera es posible formatear las celdas usando los atributos HTML para tal fin.
Sin embargo siempre hay una forma correcta de hacer las cosas. Usando la librería PHPExcel es posible crear verdaderos archivos de Excel y otros formatos similares.
Lo primero es descargar los archivos de la última versión en la URL: http://phpexcel.codeplex.com. Una vez descargada la versión (para este caso la 1.7.5) se procederá a descomprimir el archivo que contiene los siguientes archivos y carpetas:
- changelog.txt: Log de cambios.
- Classes: Fólder que contiene las librerías a incluir en nuestra aplicación.
- Documentation: Folder con la documentación del proyecto.
- install.txt: Guia corta para el uso de las librerías.
- license.txt: Licencia
- Tests: Folder con código de ejemplo sobre el uso de las librerías.
Entonces ahora hagamos lo mismo pero bien hecho:
[sourcecode language=’php’]
getProperties()
->setCreator(«Cattivo»)
->setLastModifiedBy(«Cattivo»)
->setTitle(«Documento Excel de Prueba»)
->setSubject(«Documento Excel de Prueba»)
->setDescription(«Demostracion sobre como crear archivos de Excel desde PHP.»)
->setKeywords(«Excel Office 2007 openxml php»)
->setCategory(«Pruebas de Excel»);
// Agregar Informacion
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue(‘A1’, ‘Valor 1’)
->setCellValue(‘B1’, ‘Valor 2’)
->setCellValue(‘C1’, ‘Total’)
->setCellValue(‘A2′, ’10’)
->setCellValue(‘C2’, ‘=sum(A2:B2)’);
// Renombrar Hoja
$objPHPExcel->getActiveSheet()->setTitle(‘Tecnologia Simple’);
// Establecer la hoja activa, para que cuando se abra el documento se muestre primero.
$objPHPExcel->setActiveSheetIndex(0);
// Se modifican los encabezados del HTTP para indicar que se envia un archivo de Excel.
header(‘Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet’);
header(‘Content-Disposition: attachment;filename=»pruebaReal.xlsx»‘);
header(‘Cache-Control: max-age=0’);
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, ‘Excel2007’);
$objWriter->save(‘php://output’);
exit;
?>[/sourcecode]
Al realizar la prueba obtenemos un archivo llamado pruebaReal.xlsx sin warning al momento de abrir y con muchas mas características propias de excel.
Muy bueno el código me sirvió mucho
A mi no me termina de crear el archivo! Mejor dicho, lo crea, pero al abrir me da error y lo muestra vacío! Será que puedes darme un poco de más información por favor? Aparte, con el header ahora la página no abre sino directamente busca guardar.. Sin embargo eso si es solucionable!
Saludos y gracias!
Podrías compartir el código para revisar que esta mal.
Heyy gracias por la explicación, pero tengo una duda. Veo que para establecer los valores de cada columna se utilizan los nombres propios de estas como en excel (A1 – B1 – C1 – etc). Mi duda surge cuando quiero crear un archivo de excel pero no se que cantidad de columnas puede tener (Como una consulta SQL generada por el usuario). ¿Hay alguna manera de generar los nombres de las columnas con algún ciclo?
Hola vlycser, Esencialmente lo que se hace es poner un contador dentro del ciclo del SQL, que llame a una función que iguale un arreglo que contiene los caracteres de las columnas:
function entradaColumna($col_ent){
$hdc = array(0 => «A», 1 => «B», 2 => «C», 3 => «D», 4 => «E», 5 => «F», 6 => «G», 7 => «H», 8 => «I», 9 => «J», 10 => «K», 11 => «L», 12 => «M», 13 => «N», 14 => «O», 15 => «P», 16 => «Q», 17 => «R», 18 => «S», 19 => «T», 20 => «U», 21 => «V», 22 => «W», 23 => «X», 24 => «Y», 25 => «Z»);
return ($col_ent < 26) ? $hdc[$col_ent] : $hdc[(int)($col_ent/26)-1].$hdc[($col_ent % 26)]; } $contador=1; while($row=mysql_fetch_array($resultado_sql)){ $objPHPExcel->getActiveSheet()->setCellValue(entradaColumna($contador).’1′,$row[0]);
$contador++;
}
Como se puede ver en el ejemplo anterior, en cada recorrido que el ciclo realiza llama a la función entradaColumna e iguala el número del contador y devuelve el valor del contador en los caracteres de columna para el archivo de Excel.
Hola en este archivo de excel se puede agregar una imagen, yo tengo un mapa y la tabla que lo genera pero solamente logro presentar la tabla en excel puedes darme una mano como presetar el mapa sobre la tabla al inicio del documento
Saludos
Si ya tengo creado un archivo en Excel como puedo modificarlo (no crearlo desde el inicio), con PhpExcel???
Ya resolvi en parte el problema: Si ya tengo creado un archivo en Excel como puedo modificarlo (no crearlo desde el inicio), con PhpExcel???
Ya puedo crear un archivo y modificarlo (a partir de una plantilla) pero en mi plantilla se muestran graficas estadisticas q no aparecen en el documento nuevo……..cómo puedo hacer esto???
Geova que fue lo que hiciste para solucionar tu problema?? Te agradeceria mucho si me compartieras tu solucion.
Hola buenas tarder me prodrian ayudar si estan disponibles en alguna duda sobre una publicacion de phpexcel que realizaron….Como ordernar los datos extraidos de una tabla mysql con esa libreria para obtenerla en forma horizonantal los campos. ya que con el ejemplo publicado se muestran de manera vertical ordenados
Revisando la documentación de PHPExcel, no hay una función que permita ordenar los datos de una hoja. Esta funcionalidad es parte del Microsoft Excel y lo que hace es mover datos de una celda a otra. La mejor vía para lograr esto es obtener los datos ordenados desde la base de datos o usando funciones de PHP.
Estupendo tutorial, sobre todo bastante bien ilustrado con tus ejemplo, me sirvió mucho para crear un reporte personalizado que necesito.
Enhorabuena por tu blog!
pongo tu codigo y me sale este mensaje…
ayuda plis
http://i46.tinypic.com/wjvprr.jpg
Hola Cristian;
Supongo que se está generando algún warning que corrompe el archivo, por favor agrega al inicio de tu script la función error_reporting(0); con esto evitamos que cualquier warning se vaya dentro del archivo y se corrompa.
Dejame saber si te funciona o adjunta el código y el archivo para poder ayudarte mejor.
Hola, mi duda es la siguiente, si quier usar esto para guardar el archivo en el servidor, en vez de descargarlo desde el explorador cliente, tienes idea de como tendria que hacerlo?
gracias!
Hola Javi;
Para guardarlo lo único que tinees que hacer es eliminar las lineas de header del script y cambiar el método $objWriter->save(‘php://output’) por $objWriter->save(‘/tmp/file.xlsx’); en donde la cadena /tmp/file.xlsx corresponde a la ruta absoluta dentro del servidor para almacenar el archivo. Es necesario estar seguros de que el usuario con que se ejecuta el script tiene permisos de escritura en esa ubicación.
Estuve trabajando en el codigo que subistes pero no me funciono……..
getProperties()
->setCreator(«Cattivo»)
->setLastModifiedBy(«Cattivo»)
->setTitle(«Documento Excel de Prueba»)
->setSubject(«Documento Excel de Prueba»)
->setDescription(«Demostracion sobre como crear archivos de Excel desde PHP.»)
->setKeywords(«Excel Office 2007 openxml php»)
->setCategory(«Pruebas de Excel»);
// Agregar Informacion
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue(‘A1’, ‘Valor 1’)
->setCellValue(‘B1’, ‘Valor 2’)
->setCellValue(‘C1’, ‘Total’)
->setCellValue(‘A2′, ’10’)
->setCellValue(‘C2’, ‘=sum(A2:B2)’);
// Renombrar Hoja
$objPHPExcel->getActiveSheet()->setTitle(‘Tecnologia Simple’);
// Establecer la hoja activa, para que cuando se abra el documento se muestre primero.
$objPHPExcel->setActiveSheetIndex(0);
// Se modifican los encabezados del HTTP para indicar que se envia un archivo de Excel.
header(‘Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet’);
header(‘Content-Disposition: attachment;filename=»pruebaReal.xlsx»‘);
header(‘Cache-Control: max-age=0’);
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, ‘Excel2007’);
$objWriter->save(‘php://output’);
exit;
?>
El error que me envia: error de formato o archivo dañado
Hola Joseph,
Por favor agrega al inicio de tu script la función error_reporting(0); con esto evitamos que cualquier warning se vaya dentro del archivo y se corrompa.
Dejame saber si te funciona y comenta.
Gracias.
Hola Cattivo.
Gracias por tu articulo, esta muy bueno y gracias a el he conocido el phpExcel, yo necesito exactamente fijar celdas en excel desde php o como dice la funcion inmovilizar paneles, es posible lograr esto con PHPExcel?
Muchas gracias.
Estimado Alexander, si es posible solo tiene que hacer lo siguiente:
$libro = new PHPExcel();
$hoja = $libro->getActiveSheet();
…
// Inmovilizar paneles
$hoja->freezePaneByColumnAndRow(0,3);
// o
$hoja->freezePane(‘A3’);
….
Saludos.
Esa tampoco es la mejor manera ya que te rige a trabajar solo con Excel 2007 y si el usuario tiene otra version? 2010, 2013? open office? la del HTML la veo mejor para ese caso.
estoy incursionando recien para aprender a crear excel con php, cuando tenga algo listo lo compartire tambien, muchas gracias por el manual, se ve muy bueno y sencillo de comprender
Saludos, me abre las hojas solo en modo lectura, hay forma de poder guardarlas con permiso de escritura??
Hola, fjate que realize el codigo tal cual y cuando desarrollo de manera local me funciona, no obstante cuando lo subo al server, me manda errores, es lo mismo que local pero ya en servidor no me funciona
Ya lo verifique, y este es el error que envia
Fatal error: Class ‘PHPExcel_Shared_String’ not found in /hermes/bosoraweb013/b1106/ipg.programaspyme/CasaLopez/Classes/PHPExcel/Autoloader.php on line 36
He buscado en internet sin tener hasta el momento una respuesta optima
No se si hubiese algo para poder saber sobre este error
Hola,
hay alguna manera de definir un campo que sea de tipo cadena, lo que pasa que quiero listar datos de una bd y hay una columna «RUC» que son números guardados como cadena, pero en el excel se van como números y no es lo correcto.
si ha alguien le sirve les dejo el código que use para listar de la BD.
require_once ‘../modulos/conexion.php’;
$listaemoresasx = «SELECT `idempresa` , `razonsocial` , `ruc` , `fecharegistro` FROM `empresa` «;
conectar();
$listoempresas = mysql_query($listaemoresasx) or die(mysql_error());
desconectar();
// Add some data
echo date(‘H:i:s’) , » Add some data» , EOL;
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue(‘A1’, ‘RS’)
->setCellValue(‘B1’, ‘Ruc’)
->setCellValue(‘C1’, ‘Fecha’);
// Miscellaneous glyphs, UTF-8
$contador=2;
while($row=mysql_fetch_array($listoempresas)){
$objPHPExcel->setActiveSheetIndex(0) ->setCellValue(‘A’.$contador, $row[1]) ->setCellValue(‘B’.$contador, «‘».$row[2])->setCellValue(‘C’.$contador, $row[3]);
$contador++;
}
y si quiero meter libros? dentro del mismo archivo
libro1,libro2
Estimado, tengo problemas para crear el excel, me envia error con la clase ZIPArchive, en php.ini le quite los ; al dll del ZIP y tampoco nada
Que tal Cattivo necesito tu ayuda de favor porque
He seguido tu codigo y me marca el siguiente error: Excel no puede abrir el archivo ‘Depositos NO.xlsx’ porque el formato o la extensión de éste no son válidos.Compruebe que el archivo no se ha dañado y que la extensión del mismo coincide con el formato del archivo.
Tengo excel 2010 y la version de Excelphp es la GPL * @version 1.7.8, 2012-10-12
de antemano Gracias.
getProperties()
->setCreator(«Israel»)
->setLastModifiedBy(«Israel»)
->setTitle(«Depositos NO Conciliados»)
->setSubject(«Registros DNC»)
->setDescription(«Depositos NO Concil»)
->setKeywords(«Excel Office 2007 openxml php»)
->setCategory(«Archivos de Excel»);
// Agregar Informacion
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue(‘A1’, ‘UNIVERSIDAD ‘)
->setCellValue(‘A2’, ‘UNIVERSITARIO’)
->setCellValue(‘A3’, ‘DIRECCION’)
->setCellValue(‘A4’, ‘ GENERAL’)
->setCellValue(‘A5’, ‘NO CONCILIADOS’)
->setCellValue(‘A8’, ‘Ejercicio’)
->setCellValue(‘B8’, ‘Fecha’)
->setCellValue(‘C8’, ‘Dep.’)
->setCellValue(‘D8’, ‘Subdep.’)
->setCellValue(‘E8’, ‘Referencia’)
->setCellValue(‘F8’, ‘Aprobación Bancaria’)
->setCellValue(‘G8’, ‘Importes’);
$cdao = new Maestro_BanDAO;
$cfd=$cdao->buscaDepositos_No_Conciliados($_POST[‘txt_Opcion’],$_POST[‘txt_Dependencia’],$_POST[‘txt_Subdep’],$_POST[‘txt_Ejercicio’]);
$j=0;
while ($j setActiveSheetIndex(0)
->setCellValue(«A$k», $cfd[$j]->getRef_ejercicio())
->setCellValue(«B$k», $cfd[$j]->getFecha_pago())
->setCellValue(«C$k», $cfd[$j]->getRef_dependencia())
->setCellValue(«D$k», $cfd[$j]->getRef_subdep())
->setCellValue(«E$k», $cfd[$j]->getReferencia_unam())
->setCellValue(«F$k», $cfd[$j]->getAprob_bancaria())
->setCellValue(«G$k», $cfd[$j]->getImporte());
$j++;
}
// Renombrar Hoja
$objPHPExcel->getActiveSheet()->setTitle(‘DepositosNOConcil’);
// Establecer la hoja activa, para que cuando se abra el documento se muestre primero.
$objPHPExcel->setActiveSheetIndex(0);
$fecha=»NO»;
// Se modifican los encabezados del HTTP para indicar que se envia un archivo de Excel.
header(‘Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet’);
header(‘Content-Disposition: attachment;filename=»Depositos ‘ .$fecha.’.xlsx»‘);
//header(‘Content-Disposition: attachment;filename=»Depositos.xlsx»‘);
header(‘Cache-Control: max-age=0’);
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, ‘Excel2007’);
$objWriter->save(‘php://output’);
exit;
?>
Como hago para que el archivo generado contenga una imagen? suponiendo que la imagen este en mi servidor ??
Muy bueno tu aporte, excelente librería para crear verdaderos archivos de excel.
Gracias por compartir.
Eres un hijo de tu madre muy bn me sirvio demasiado kid
Hola amigos,
Muchas gracias por este post, esta muy bien explicado!
Tengo una pregunta mas bien orientada a Excel, espero alguno pueda apoyarme.
Descargo archivos de una pagina web – Ahora se que estan mal disenados desde el codigo PHP – Se supone que la descarga se realiza en formato xls pero como bien lo explica el amigo Cattivo el contenido es HTML.
El caso es que desde otro archivo Excel que he creado manualmente en mi compu, necesito jalar informacion de los archivos que descargo de la pagina, sin embargo los links no se pueden actualizar automaticamente por la famosa advertencia de que el formato no coincide, por lo que para poder actualizar los links necesito abrir cada uno de los archivos descargados y son cientos.. Alguien podria ayudarme a como hacerle entender a excel que esos tipos de archivo con ese formato si son archivos de confianza?
Ya he agregado el folder donde tengo los archivos como ubicacion segura, tambien he deshabilitado la vista protegida para archivos procedentes de internet. Estoy usando Excel 2013.
Muchas Gracias de antemano!!!
Como puedo leer un archivo creado anteriormente, y no como en el ejemplo crear uno.
Saludos.
HOLA SALUDOS AMIGO TENGO UN PROBLEMA AL BOTAR LOS DATOS AL EXCEL TENGO UN CAMPO LLAMADO DNI DE 8 CIFRAS, EN MI BASE DE DATOS ESTA COMO TIPO STRING, PERO AL BOTARLOS AL EXCEL ALGUNOS DATOS TIENEN EL CERO ‘0’ POR DELANTE PERO EN EL EXCEL LOS OMITE.
Ejemplo: deberia salir asi 01234567, pero en el excel omite el 0 y bota asi 1234567 alguna ayuda?
Muy buen aporte. Me solucionó mi problema. Me creaba dos archivos, uno con mi información recuperada de la base de datos y otro en descargas completamente vacío. Muchas Gracias!
Hola chikos en especial para josephsss3
El problema para los que les dice que el archivo es corrupto o que esta dañado es que la version del php que estan utilizando tiene que cargar unas extenciones. lo dice en el archivo install de la libreria cuando la descargas. .
The following requirements should be met prior to using PHPExcel:
* PHP version 5.2.0 or higher
* PHP extension php_zip enabled *)
* PHP extension php_xml enabled
* PHP extension php_gd2 enabled (if not compiled in)
*) php_zip is only needed by PHPExcel_Reader_Excel2007, PHPExcel_Writer_Excel2007,
PHPExcel_Reader_OOCalc. In other words, if you need PHPExcel to handle .xlsx or .ods
files you will need the zip extension, but otherwise not.
posteriormente hay que modificar esto en el php.ini de su servidor
para los queusan xamp. pues
está en el directorio donde lo instalaron en mi caso es: C:\xampp\php.
descomenten estas librerias. si no las tienen comentadas agregenlas. asegurence de que estén en la carpeta extenciones ya que de ahi las carga
Hola tengo una duda como puedo crear mas de una hoja en un mismo documento de excel es decir yo tengo 5 tablas en mi BD y quiero que cada tabla sea una hoja en el archivo que se cree?
gracias por compartir, saludos…
Hola estoy usando PHPExcel y el documento tiene celdas con formato de hora 09:00:00 pm como puedo hacer para que los respete por que en vez de visualize esto 09:00:00 pm veo lo siguiente 0.375