Una manera fácil de transferir datos tabulares de PHP a Excel. Exportar datos de php a excel Exportar tabla de php a excel

.
El método presentado en esa nota es realmente muy simple, pero puede que no siempre sea conveniente.
Hay muchas otras formas de transferir datos tabulares de PHP a Excel, describiré la que me pareció más simple y funcional. Cabe señalar especialmente que no estoy hablando de generar un archivo xls, sino que solo sugiero que el usuario abra los datos recibidos usando Excel para que los usuarios que no tienen experiencia en programación no noten la falsificación.

Entonces, lo primero que debemos hacer es colocar en nuestra página un enlace a un script que genere los siguientes encabezados:
header("Pragma: publico");
encabezado ("Caduca: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Caché-Control: privado", false);
header("Tipo de contenido: aplicación/x-msexcel");
header("Contenido-Disposición: archivo adjunto; nombre de archivo=\"" . iconv("UTF-8", "CP1251", $objeto->getFileName()) . "\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . $objeto->getFileSize());

$object es un objeto esférico en el vacío, que cada lector implementa como quiere. El propósito de los captadores getFileName() y getFileSize() está claro en los nombres. Aquí vale la pena resaltar un matiz no obvio (gracias por recordarme esto): getFileName (), por supuesto, puede devolver cualquier nombre de archivo, pero si desea que el navegador ofrezca abrir el contenido recibido en Excel, entonces la extensión del archivo debe ser xls.
Todavía no he contado nada nuevo, sin embargo, todo esto fue inventado antes que yo, así como lo que se describirá a continuación.
Como bien se señaló en los comentarios a la nota, Excel funciona mucho más rápido con XML. Pero la ventaja más importante, quizás, todavía no está en la velocidad, sino en posibilidades mucho más amplias. No profundizaré en la naturaleza, solo daré un ejemplo simple y un enlace a Descripción detallada todas las etiquetas

Entonces, después de que se generan los encabezados, debemos darle al usuario los datos reales. Por lo general, envuelvo la generación de tablas en un método separado:
echo $objeto->getContent();

Y genero la tabla usando Smarty:

(foreach from=$data.header item=caption) ($caption.columnName)(/para cada)(foreach from=$data.elemento de contenido=fila) (foreach from=$fila item=col) ($col)(/para cada)(/para cada)

Como puede ver en el código, la matriz $data que contiene dos matrices se pasa a la plantilla: la línea de encabezado de la tabla y los datos reales.
Vale la pena señalar que usar un motor de plantillas solo para generar XML es algo costoso y hay muchas otras formas de obtener XML. En mi caso particular, la generación de XML es solo una pequeña ventaja en un proyecto grande donde un motor de plantillas es indispensable.

Como ejemplo, di la tabla más simple, si lo desea, puede manipular una cantidad mucho mayor de atributos. Esto es especialmente bueno si considera que no se requieren bibliotecas de terceros para la implementación.
El método descrito ha estado funcionando en el mismo proyecto durante varios años, y ningún usuario ha sospechado aún que los datos que abre no son un documento de MS Office.

Puede leer más sobre la estructura XML utilizada en MS Excel en

(datos recuperados de la base de datos mysql) para tener éxito. Estoy usando Zend Framework. Necesito hacer algunos cambios en mis datos antes de exportarlos a Excel. De hecho, realmente necesito crear un libro de caja mensual.

He leído muchos documentos pero terminé en un lío. Realmente no entiendo cómo empezar. ¿Realmente necesito PEAR? ¿Necesito cargar alguna biblioteca de clases? ¿no es así? camino fácil¿hazlo?

gracias de antemano

Le sugiero que use la biblioteca PHPExcel PHPExcel. Es realmente poderoso, admite varios formatos, puede dar formato visual y es fácil de usar.

Puede obtener más información al respecto en su página web: http://phpexcel.codeplex.com/ (PHPExcel ya se ha movido a https://github.com/PHPOffice/PHPExcel)

Ejemplo de uso:

$objPHPExcel = new PHPExcel(); /** Puede establecer muchas propiedades */ $objPHPExcel->getProperties()->setCreator("Mi empresa") ->setLastModifiedBy("John Doe") ->setTitle("Informe anual") ->setSubject("Ventas ") ->setDescription("Informe de ventas anual de John Doe") ->setCategory("Finanzas"); /** Elija una de las hojas */ $activeSheet = $objPHPExcel->setActiveSheetIndex(0); /** Simplemente establezca el valor de la celda */ $activeSheet->setCellValue("A1", "plural");

Puede hacer mucho más, por supuesto, leyendo archivos de Excel, establecer estilos visuales, crear gráficos, expresiones y más.

He escrito un informe de variación de inventario de 94 filas donde tomo datos de MySQL (6kb + registros por tabla), creo matriz multidimensional de los datos de MySQL, extraídos de varias tablas y luego volcado todo en una línea y generado .xls como este:

No se requieren extensiones.

Las únicas advertencias son que aún no he descubierto cómo escupir los .xls sin Excel, lo que le indica que los datos pueden dañarse, y no he intentado formatear ni nada más complicado que simplemente "exportar" los datos. , archivo/datos está bien, por supuesto, pero genera una advertencia de Excel.

EDITAR: Debo señalar que "configuración" y "volcado" se refieren a: daniweb.com

Puede usar la biblioteca phpexcel. Esto le permite escribir y leer desde diferentes formatos archivos de hoja de cálculo

para integrar con zend puedes usar la ayuda del siguiente enlace.

Puede usar CSV para hacer un formato importable para Excel. Esta es la forma más fácil de hacerlo.

CSV se ve así:

"mi primer contenido de celda", "mi segundo contenido de celda", "mi tercer contenido de celda" "segunda línea, primer contenido de celda", "etc", "etc

Cada fila representa una fila de Excel, coloca el contenido de la celda entre doble comillas y separar con comas. Tenga cuidado si tiene algunos de sus datos, esto puede romper su CSV y crear nuevas líneas no deseadas.

Con un poco de Google encontrarías esto: http://www.the-art-of-web.com/php/dataexport/

Preparación de datos

$data = array(array("firstname" => "Mary", "lastname" => "Johnson", "age" => 25), array("firstname" => "Amanda", "lastname" => " Miller", "edad" => 18), array("nombre" => "James", "apellido" => "Brown", "edad" => 31), array("nombre" => "Patricia", "apellido" => "Williams", "edad" => 7), array("nombre" => "Michael", "apellido" => "Davis", "edad" => 43), array("nombre" => "Sarah", "apellido" => "Miller", "edad" => 24), array("nombre" => "Patrick", "apellido" => "Miller", "edad" => 27) );

El primer paso es generar los datos en formato delimitado por tabuladores (también se puede usar CSV, pero es un poco más complicado). Para ello utilizamos el siguiente código:

Establecemos el tipo de contenido en texto/sin formato para que el resultado se pueda ver más fácilmente en un navegador. De lo contrario, dado que no hay formato HTML, la salida se mostrará como una sola línea de texto.

La primera línea de la salida serán los encabezados de las columnas (en este caso, se utilizan los nombres de los campos). Los valores están separados por tabulador \t y líneas con saltos de línea \n. El resultado debería ser algo como esto:

Nombre apellido edad Mary Johnson 25 Amanda Miller 18 James Brown 31 Patricia Williams 7 Michael Davis 43 Sarah Miller 24 Patrick Miller 27

Hay una debilidad en este código que puede no ser inmediatamente obvia. ¿Qué sucede si uno de los campos a generar ya contiene uno o más caracteres de tabulación, o peor aún, nueva línea? Esto desencadenará todo el proceso ya que confiamos en estos caracteres para indicar columnas y saltos de línea.

La solución es "escapar" los caracteres de tabulación. En este caso, reemplazaremos las pestañas con el literal \t y los saltos de línea con el literal \n para que no afecten el formato:

Ahora, antes de que se repita cada línea, los caracteres de tabulación se reemplazan con "\t" para que nuestras columnas no se rompan. Además, cualquier salto de línea dentro de los datos se reemplaza con "\n".

.
El método presentado en esa nota es realmente muy simple, pero puede que no siempre sea conveniente.
Hay muchas otras formas de transferir datos tabulares de PHP a Excel, describiré la que me pareció más simple y funcional. Cabe señalar especialmente que no estoy hablando de generar un archivo xls, sino que solo sugiero que el usuario abra los datos recibidos usando Excel para que los usuarios que no tienen experiencia en programación no noten la falsificación.

Entonces, lo primero que debemos hacer es colocar en nuestra página un enlace a un script que genere los siguientes encabezados:
header("Pragma: publico");
encabezado ("Caduca: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Caché-Control: privado", false);
header("Tipo de contenido: aplicación/x-msexcel");
header("Contenido-Disposición: archivo adjunto; nombre de archivo=\"" . iconv("UTF-8", "CP1251", $objeto->getFileName()) . "\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . $objeto->getFileSize());

$object es un objeto esférico en el vacío, que cada lector implementa como quiere. El propósito de los captadores getFileName() y getFileSize() está claro en los nombres. Aquí vale la pena resaltar un matiz no obvio (gracias a savostin por recordármelo): getFileName(), por supuesto, puede devolver cualquier nombre de archivo, pero si desea que el navegador ofrezca abrir el contenido recibido en Excel, entonces el la extensión del archivo debe ser xls.
Todavía no he contado nada nuevo, sin embargo, todo esto fue inventado antes que yo, así como lo que se describirá a continuación.
Como se señaló correctamente en los comentarios de la publicación sobre la generación de xls en PHP, Excel es mucho más rápido con XML. Pero la ventaja más importante, quizás, todavía no está en la velocidad, sino en posibilidades mucho más amplias. No profundizaré en la naturaleza, solo daré un ejemplo simple y un enlace a una descripción detallada de todas las etiquetas.

Entonces, después de que se generan los encabezados, debemos darle al usuario los datos reales. Por lo general, envuelvo la generación de tablas en un método separado:
echo $objeto->getContent();

Y genero la tabla usando Smarty:

(foreach from=$data.header item=caption) ($caption.columnName)(/para cada)(foreach from=$data.elemento de contenido=fila) (foreach from=$fila item=col) ($col)(/para cada)(/para cada)

Como puede ver en el código, la matriz $data que contiene dos matrices se pasa a la plantilla: la línea de encabezado de la tabla y los datos reales.
Vale la pena señalar que usar un motor de plantillas solo para generar XML es algo costoso y hay muchas otras formas de obtener XML. En mi caso particular, la generación de XML es solo una pequeña ventaja en un proyecto grande donde un motor de plantillas es indispensable.

Como ejemplo, di la tabla más simple, si lo desea, puede manipular una cantidad mucho mayor de atributos. Esto es especialmente bueno si considera que no se requieren bibliotecas de terceros para la implementación.
El método descrito ha estado funcionando en el mismo proyecto durante varios años, y ningún usuario ha sospechado aún que los datos que abre no son un documento de MS Office.

Puede leer más sobre la estructura XML utilizada en MS Excel en

Para muchos, al trabajar con PHP en conjunto con MySQL existe la necesidad de exportar datos de la base de datos al formato xls, para que las personas que necesitan estos datos los procesen en Excel o simplemente hagan que sea conveniente para los usuarios ver estos datos. Recientemente tuve tal necesidad y hoy les diré cómo se puede implementar este negocio.

Debo decir de inmediato que este método es bastante simple, pero los datos se cargan normalmente.

Para empezar, daré un ejemplo del archivo xls final, en Excel la carga se verá así:

En otras palabras, no se cargarán imágenes ni estilos, solo los encabezados de las columnas y los datos en sí.

Antes de llegar a esa opción de carga, intenté cargar en formato csv, pero resultó un poco torpe, luego traté de dibujar una tabla y guardarla con la extensión xls, también resultó una especie de tontería, el método que ahora describiré me convenía completamente y ahora lo compartiré con ustedes.

Para empezar, daré todo el código que comenté en la medida de lo posible, puedes seleccionarlo y guardarlo con extensión php e intente, simplemente no olvide establecer la configuración de conexión de la base de datos.

Exportar datos de MySQL a Excel en PHP

Y para que entiendas qué datos descargo, daré un ejemplo de una tabla simple en la base de datos ( tengo su prueba de nombre):

Tabla de prueba:

identificación nombre de pila nombre
1 Ivánov Iván
2 Petrov Pedro
2 Petrov2 Petr2
xlsData = paquete("ssssss", 0x809, 0x08, 0x00,0x10, 0x0, 0x0); ) // Si la función numérica RecNumber($row, $col, $value)( $this->xlsData .= pack("sssss", 0x0203, 14, $row, $col, 0x00); $this->xlsData . = pack("d", $valor); return; ) //Funcion si texto RecText($fila, $columna, $valor)( $len = strlen($valor); $this->xlsData .= pack(" s*", 0x0204, 8 + $len, $fila, $col, 0x00, $len); $this->xlsData .= $value; return; ) // Insertar función numérica InsertNumber($value)( if ($ this->countCol == $this->totalCol) ( $this->countCol = 0; $this->countRow++; ) $this->RecNumber($this->countRow, $this->countCol, $value); $this->countCol++; return; ) // Insertar función de texto InsertText($value)( if ($this->countCol == $this->totalCol) ( $this->countCol = 0; $this->countRow++; ) $this->RecText($this->countRow, $this->countCol, $value); $this->countCol++; return; ) // Mover a una nueva línea function GoNewLine()($this->countCol = 0 ; $this->countRow++; return; ) //Finalizar función de datos EndData()( $this->xlsData .= pack("ss", 0x0A, 0x00); devolver; ) // Guardar la función de archivo SaveFile($fileName)( $this->fileName = $fileName; $this->SendFile(); ) // Enviar la función de archivo SendFile()($this->EndData(); header (" Última modificación: " . gmdate("D,d M YH:i:s") . " GMT"); encabezado ("Control de caché: sin almacenamiento, sin caché, debe revalidar"); encabezado (" Pragma: no-cache"); header("Content-type: application/x-msexcel"); header("Content-Disposition: adjunto; fileName=$this->fileName.xls"); print $this- >xlsData ; ) ) ) if(isset($_GET["id"])) ( //filtrar datos $id = mysql_real_escape_string(stripslashes(trim(htmlspecialchars($_GET["id"],ENT_QUOTES)))); $ filename = "File_with_id_".$id; // establece el nombre del archivo $excel = new ExportToExcel(); // crea una instancia de la clase $sql="SELECT * FROM test.test where id = $id";// consulta a la base de datos $rez= mysql_query($sql); $excel->InsertText("ID"); $excel->InsertText("Last Name"); $excel->InsertText("First Name"); $excel ->GoNewLine(); While($row=mysql_fetch_assoc($rez))( $excel->InsertNumber($row["id"]); $excel->InsertText($fila["nombre"]); $excel->InsertText($fila["nombre"]); $excel->IrNuevaLínea(); ) $excel->SaveFile($nombredearchivo); ) ?>

Toda la idea aquí está en la función. embalar(), que empaqueta los datos en una cadena binaria y nosotros, a su vez, completamos secuencialmente esta cadena con los datos que descargamos de la base de datos mysql usando la función normal mysql_query().

Para verificar el rendimiento de este código, dado que ha configurado una conexión a la base de datos y ha creado una tabla similar, puede enviar la siguiente solicitud:

Http://su_sitio/nombre_de_archivo. php?id=2

Y debe descargar dos filas con id igual a 2.

Y ahora todas las personas a las que permita cargar datos pueden exportarlos fácilmente a sus computadora local a través de interfaz web. Este método es conveniente tanto para usuarios corporativos, si está desarrollando una aplicación para su organización, como para usuarios de su sitio web en Internet. Esperanza, Por aquí Te ayudó. ¡Buena suerte!