Exportar a Excel desde PHP


PHPLa idea de exportar listados a un archivo de Excel es casi imprescindible en estos días, sobre todo en cualquier aplicación con acceso a bases de datos. Hace poco me vi en la necesidad de averiguar como hacerlo y aplicarlo a un sistema que genera gran cantidad de listados y reportes.

En realidad este truco no genera un archivo de Excel como lo conocemos normalmente, sino un tipo de XML que, por lo menos en el Office 2003, trae incorporado, llamado “Hoja de Calculo XML (*.xml)”. Vamos a explorar un poco este tipo de archivo y veremos como lo podemos aplicar a una salida de PHP, la cual luego podemos adaptar a nuestras salidas de datos y listados.

Bien, para no extendernos mucho la idea es hacer una hoja simple, después vamos a guardar como, y seleccionamos en tipo de archivo “Hoja de Calculo XML (*.xml)”


El archivo generado es un XML, por lo que podemos revisar su contenido con cualquier editor de textos y su contenido el es siguiente:

<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:html="http://www.w3.org/TR/REC-html40">
 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
  <Author>Autor</Author>
  <LastAuthor>Autor</LastAuthor>
  <Created>2006-12-04T20:10:16Z</Created>
  <Company>Empresa</Company>
  <Version>11.5606</Version>
 </DocumentProperties>
 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
  <WindowHeight>6105</WindowHeight>
  <WindowWidth>10425</WindowWidth>
  <WindowTopX>600</WindowTopX>
  <WindowTopY>90</WindowTopY>
  <ProtectStructure>False</ProtectStructure>
  <ProtectWindows>False</ProtectWindows>
 </ExcelWorkbook>
 <Styles>
  <Style ss:ID="Default" ss:Name="Normal">
   <Alignment ss:Vertical="Bottom"/>
   <Borders/>
   <Font/>
   <Interior/>
   <NumberFormat/>
   <Protection/>
  </Style>
 </Styles>
 <Worksheet ss:Name="Hoja1">
  <Table ss:ExpandedColumnCount="3" ss:ExpandedRowCount="4" x:FullColumns="1"
   x:FullRows="1" ss:DefaultColumnWidth="60">
   <Row>
    <Cell><Data ss:Type="String">Titulo</Data></Cell>
   </Row>
   <Row ss:Index="3">
    <Cell><Data ss:Type="String">Dato 1</Data></Cell>
    <Cell><Data ss:Type="String">Dato 2</Data></Cell>
    <Cell><Data ss:Type="String">Dato 3</Data></Cell>
   </Row>
   <Row>
    <Cell><Data ss:Type="String">Dato 4</Data></Cell>
    <Cell><Data ss:Type="String">Dato 5</Data></Cell>
    <Cell><Data ss:Type="String">Dato 6</Data></Cell>
   </Row>
  </Table>
  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
   <PageSetup>
    <Header x:Margin="0"/>
    <Footer x:Margin="0"/>
    <PageMargins x:Bottom="0.984251969" x:Left="0.78740157499999996"
     x:Right="0.78740157499999996" x:Top="0.984251969"/>
   </PageSetup>
   <Selected/>
   <ProtectObjects>False</ProtectObjects>
   <ProtectScenarios>False</ProtectScenarios>
  </WorksheetOptions>
 </Worksheet>
 <Worksheet ss:Name="Hoja2">
  <Table ss:ExpandedColumnCount="0" ss:ExpandedRowCount="0" x:FullColumns="1"
   x:FullRows="1" ss:DefaultColumnWidth="60"/>
  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
   <PageSetup>
    <Header x:Margin="0"/>
    <Footer x:Margin="0"/>
    <PageMargins x:Bottom="0.984251969" x:Left="0.78740157499999996"
     x:Right="0.78740157499999996" x:Top="0.984251969"/>
   </PageSetup>
   <ProtectObjects>False</ProtectObjects>
   <ProtectScenarios>False</ProtectScenarios>
  </WorksheetOptions>
 </Worksheet>
 <Worksheet ss:Name="Hoja3">
  <Table ss:ExpandedColumnCount="0" ss:ExpandedRowCount="0" x:FullColumns="1"
   x:FullRows="1" ss:DefaultColumnWidth="60"/>
  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
   <PageSetup>
    <Header x:Margin="0"/>
    <Footer x:Margin="0"/>
    <PageMargins x:Bottom="0.984251969" x:Left="0.78740157499999996"
     x:Right="0.78740157499999996" x:Top="0.984251969"/>
   </PageSetup>
   <ProtectObjects>False</ProtectObjects>
   <ProtectScenarios>False</ProtectScenarios>
  </WorksheetOptions>
 </Worksheet>
</Workbook>

Hay que tener cuidado al manipular las partes que componen el documento, ya que una letra o una mayúscula/minúscula mal puesta puede hacer que Excel no lo pueda volver a abrir por errores de parseo.

Ahora vamos a explorar un poco la estructura, borraremos la información que no nos sirve.

El primer bloque <ExcelWorkbook></ExcelWorkbook> es donde se encuentran los datos de la hoja de Excel, el autor, la compañía, versiones, fecha de creación, etc. Se puede manipular los datos contenidos en el bloque sin ningún problema.

El bloque de <Styles></Styles> es donde aparecerán los estilos que usamos en la hoja, por ejemplo, negritas, cursivas, tamaño de texto, formatos de texto como fecha, moneda, numérico, etc. Todos esos estilos tienen un “ss:ID” con los que se pueden referenciar a una celda en particular. En este ejemplo no estoy usando ningún estilo diferente al normal o “Default”, pero es bueno comentarlo ya que en reportes mas avanzados a veces es necesario declarar un estilo o formato en las celdas afectadas.

Ahora viene lo interesante, los bloques <Worksheet></Worksheet> que son las hojas que contiene el libro, si nos ponemos a revisar con detalle, veremos que cada bloque tiene su propiedad “ss:Name” con el nombre de las hojas que aparecen en la parte de abajo del libro, para efecto de este artículo, elimino la hoja 2 y 3 lo cual va a reducir bastante el tamaño del XML.

Ahora si, me voy a centrar en el uso de la primera hoja, donde vemos un sub bloque llamado <Table></Table> donde se declaran algunas propiedades que debemos modificar:

  • ss:ExpandedColumnCount: Esta propiedad es la que se encarga de limitar las columnas usadas en el documento, y en este ejemplo viene declarado un valor de “3” sin embargo, podemos eliminar esta propiedad y su valor, y así quitar las limitaciones.

  • ss:ExpandedRowCount: Esta propiedad es la que nos limita la cantidad de filas permitidas. Al igual que la de las columnas podemos eliminar la propiedad y su valor para que no tengamos limitaciones y meter todas las filas que hagan falta.

  • x:FullColumns, x:FullRows: Aún no se como para que sirven, pero tampoco me afectan así que podemos dejar estas propiedades y sus valores intactos.

  • ss:DefaultColumnWidth: Es la que marca el tamaño de las columnas, por defecto tiene un valor de “60”, esta también podemos dejarla así.

Ahora si, ya podemos entrar a modificar los datos en los siguientes bloques, que es bastante fácil de entender y manipular. Los bloques <Row></Row> son las filas, y salvo que se indique lo contrario, cada bloque de fila aparece debajo de la última. En este ejemplo podemos ver que una de las filas, la segunda para ser preciso tiene una propiedad llamada “ss:Index” la cual indica la posición por índice de la ubicación de la fila, en este caso tiene el valor “3”, esto quiere decir; la primera fila del XML se encuentra en la primera fila del documento y la segunda fila del XML se encuentra ubicada en la tercera fila del documento, la siguiente fila no tiene declarada la posición, por lo que se asume que va debajo de la ultima.

Cada fila anida otros bloques, llamados <Cell></Cell> que son cada una de las celdas acomodadas de izquierda a derecha, de igual forma si no se especifica lo contrario se irán acomodando a la derecha de la última celda. Dentro de cada Celda, esta otro bloque llamado <Data></Data>, aquí básicamente se declara un estilo que deberá ser aplicado al contenido de la celda.

Con las modificaciones realizadas quedó el siguiente código XML:

<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:html="http://www.w3.org/TR/REC-html40">
 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
  <Author>Autor</Author>
  <LastAuthor>Autor</LastAuthor>
  <Created>2006-12-04T20:10:16Z</Created>
  <Company>Empresa</Company>
  <Version>11.5606</Version>
 </DocumentProperties>
 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
  <WindowHeight>6105</WindowHeight>
  <WindowWidth>10425</WindowWidth>
  <WindowTopX>600</WindowTopX>
  <WindowTopY>90</WindowTopY>
  <ProtectStructure>False</ProtectStructure>
  <ProtectWindows>False</ProtectWindows>
 </ExcelWorkbook>
 <Styles>
  <Style ss:ID="Default" ss:Name="Normal">
   <Alignment ss:Vertical="Bottom"/>
   <Borders/>
   <Font/>
   <Interior/>
   <NumberFormat/>
   <Protection/>
  </Style>
 </Styles>
 <Worksheet ss:Name="Hoja1">
  <Table x:FullColumns="1"
   x:FullRows="1" ss:DefaultColumnWidth="60">
   <Row>
    <Cell><Data ss:Type="String">Titulo</Data></Cell>
   </Row>
   <Row ss:Index="3">
    <Cell><Data ss:Type="String">Campo 1</Data></Cell>
    <Cell><Data ss:Type="String">Campo 2</Data></Cell>
    <Cell><Data ss:Type="String">Campo 3</Data></Cell>
   </Row>
   <Row>
    <Cell><Data ss:Type="String">Dato 4</Data></Cell>
    <Cell><Data ss:Type="String">Dato 5</Data></Cell>
    <Cell><Data ss:Type="String">Dato 6</Data></Cell>
   </Row>
  </Table>
  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
   <PageSetup>
    <Header x:Margin="0"/>
    <Footer x:Margin="0"/>
    <PageMargins x:Bottom="0.984251969" x:Left="0.78740157499999996"
     x:Right="0.78740157499999996" x:Top="0.984251969"/>
   </PageSetup>
   <Selected/>
   <ProtectObjects>False</ProtectObjects>
   <ProtectScenarios>False</ProtectScenarios>
  </WorksheetOptions>
 </Worksheet>
</Workbook>

Lo interesante es que podemos crear un código en PHP que genere el texto con los bloques “Row” Se me ocurre un ejemplo muy simple: Separar el código XML en 3 partes: un template para la cabecera hasta antes del primer “row” que vamos a usar para generar el código, un script en PHP que llene las filas de datos y un template del pie del archivo. Para después enviarlo al navegador como un archivo “XLS” en lugar de “XML”

El código en PHP de ejemplo es el siguiente:

<?php

$template_1 = "template_cabecera.inc";
$template_2 = "template_pie.inc";

// Se abre y extrae la cabecera del XML
if ($gestor = fopen($template_1, "r")){
	$header = fread($gestor, filesize($template_1));
	fclose($gestor);
}

// Se genera el contenido agregando 10 filas
$rows = "";
for ($i = 1; $i <= 10; $i++) {
	$rows .= "<Row>\n";
	$rows .= "<Cell><Data ss:Type=\"String\">C1 - Row $i</Data></Cell>";
	$rows .= "<Cell><Data ss:Type=\"String\">C2 - Row $i</Data></Cell>";
	$rows .= "<Cell><Data ss:Type=\"String\">C3 - Row $i</Data></Cell>";
	$rows .= "</Row>";
}

// Se abre y extrae el pie del XML
if ($gestor = fopen($template_2, "r")){
	$footer = fread($gestor, filesize($template_2));
	fclose($gestor);
}

// Se juntan las partes resultantes
$content = $header . $rows . $footer;

// Se envia el archivo al navegador
header ("Content-type: application/x-msexcel");
header ("Content-Disposition: attachment; filename=\"excel_generated.xls\"" );
print $content;

?>

Una parte interesante de este código es la forma de enviarlo al navegador para su descarga, es importante que antes de esas líneas no se imprima nada, ya que las cabeceras o “header” deben mandarse antes de cualquier otra cosa.

Después de publicado este artículo, y revisando las búsquedas de cómo llegan a nosotros, me he encontrado con una gran cantidad de personas que buscan "cuantas hojas se pueden agregar a un libro Excel". A continuación se incluyen las limitaciones de Excel, sacada de la página de soporte de Microsoft.

Tamaño de la hoja de cálculo: 65.536 filas por 256 columnas
Contenido en una celda (texto): 32.767 caracteres
Hojas de un libro: cantidad limitada por la memoria disponible
Nombres de un libro: cantidad limitada por la memoria disponible

Todos los archivos y código usados en este artículo se encuentran listos para descarga a continuación. Espero que les sea de ayuda este artículo.

AdjuntoTamaño
generar_excel.zip3.52 KB



Imagen de Anónimo

Para nosotros no nos sirve esta utilidad ya que aun utilizamos office 2000 y no tenemos la necesidad de actualizar, lo recomendable para nosotros seria esportar los datos en CSV, aun así esta muy buena la librería.

Slaudos

Imagen de nexus

Estoy de acuerdo, según he podido ver el Office 2002 y el 2003 tienen soporte para estos tipos de XML, cada uno con su formato muy particular. Sería interesante que alguien que tenga Office 2000 nos diga si el Excel tiene guardado a XML, en caso de tenerlo todo sería bastante fácil.

Por otro lado, si mi memoria no me falla, si haces un CSV pero le pones como extensión un ".xls" te lo abre directamente excel y se encarga automáticamente de parsearlo y convertirlo... es transparente para el usuario.

Imagen de Anónimo

Hola que tal, excelente articulo, aunque como dicen no para todas las versiones de excel funciona, yo te recomiendo el paquete Spreadsheet Excel Writer de PEAR, es muy facil de usuar y funciona bien para cualquier version de excel.

Saludos.
Atte: Jeiff

Imagen de nexus

Hola Jeiff, gracias por tu aporte, efectivamente vamos a ver que tal nos funciona el Spreadsheet Excel Writer, sin embargo, dejame comentarte que con esta forma de usar plantillas, puedes crear unos documentos realmente bonitos usando muchas funciones y estilos de Excel... claro, en la mayoria de los casos esto no es necesario.

Por último, ojalá que pudieras ayudar a esta comunidad escribiendo algun artículo sobre el uso de Spreadsheet Excel Writer y con mucho gusto te lo publicamos aquí.

Imagen de Anónimo

Hola que tal nexus, he escrito un articulo el cual podras encontrar en mi blog: http://jeiff.blogspot.com/
Espero que te sea de utilidad.
Saludos

Imagen de Anónimo

este articulo esta muy interesante gracias por subirlo me fue de mucha ayuda y solo me resta decir GRACIAS

Imagen de Anónimo

hola! el ejemplo me sirvio de mucho... la verdad que lo use sin problemas... aunq eso sucedio hasta hoy que me fije que ocurre un error en el proceso ... el cual no c como solventar... todos los datos que envio desde el php los lleve a minuscula y sin caracteres especiales (ej.:@)... sin embargo me sigue dando el error de que NO SE PUEDE ABRIR ESTE ARCHIVO PORQ CONTIENE ERRORES.

Imagen de nexus

Hola que tal. Excel crea un archivo de "log" de los errores de parseo que tenga tu archivo, igual ahi podría estar el problema. Te comento que he trabajado con esta forma en archivos generados de mas de 5,000 filas y me ha dado un excelente resultado.

Si quieres, envíame un correo adjunto con el archivo generado para ver si te puedo ayudar en algo.

Saludos

Imagen de Anónimo

Hola me gusto mucho ese articulo, es que tengo este problema:

Al generar un documento en excel en php en base a una plantilla xlt, la primera vez lo hace bien, pero si yo intento generar otro con el mismo nombre se bloquea.

mi pregunta es Como Hago para generar autonumericos, es decir:

documento generado primera vez camilo.xls
segundo documento generado camilo2.xls

Imagen de nexus
Pues en realidad algo automatizado no vamos a encontrar, pero se me ocurre por ejemplo, que en alguna tabla de una base de datos lleves un autonumérico, o mejor aún, por que no agregar un "timestamp" a tu archivo, de esta forma siempre vas a tener un nombre de archivo diferente, por ejemplo:

$filename = "archivo_" . time() . ".xls";
header ("Content-type: application/x-msexcel");
header ("Content-Disposition: attachment; filename=\"$filename\"" );

La función time, va a devolver el numero de segundos transcurridos desde el 1 de enero de 1970.

También podrías armarte algún numero usando la función date().
Imagen de gerardo

como agregar imagen al archivo escel con spreadsheed

Imagen de nexus
Muy buena pregunta, no creo que sea complicado, deja veo si es posible con mi método por XML.

Con la librería Spreadsheet Excel solo es cosa que te leas la documentación del método insertBitmap a ver si eso te sirve.
Imagen de gerardo

Ya se como hacerlo con spreadsheet pero no me sirve de mucho agregarla desde el archivo xml seria lo ideal si consigues como te agradeceria la informacion gracias

Imagen de nexus

Hola Gerardo, hoy ya me puse a revisar sobre el asunto de la imagen por medio del metodo XML y siento comentarte que por lo menos en Office 2003 esto no es posible. Puedes hacer "casi" todo menos guardar imagenes y formas en XML.

Imagen de gerardo

Disculpen tantas preguntas pero soy nuevo en esto:

Se puede Combinar celdas con la Libreria de SpreadSheet?
Como?
Gracias

Imagen de gerardo

Gracias nexus ya me puse a trabajar con spreadsheet y tengo todo listo a excepcion de un pequeño detalle en las impresiones , como hago para eliminar el pagebreak vertical que se genera automaticamente al hacer la hoja de excel, necesito eliminaro para agregar el pagebrak donde yo quiera o moverlo eso se puede?

Gracias por la ayuda.

Imagen de Anónimo

Hola, mi nombre es Pablo.
He usado el ejemplo y funciona perfecto. El problema que tengo es que cuando intento bajarlo con Internet explorer o avant me da el siguiente error:

No se pudo descargar phptoexcel.php de localhost.
Internet Explorer no puede abrir este sitio de internet: el sitio pedido no esta disponible o no se encuentra. Intentelo de nuevo.

Lo curioso es que el Firefox funciona perfectamente. Sera problema de los headers??

Si alguien puede ayudarme lo agradeceria..

Graciass... Saludos

Imagen de nexus
Hola Pablo

Por lo que mencionas efectivamente es posible que sea un error en los headers, primero que nada debes revisar que no hagas ningún "echo" o "print" anterior al envío de los headers, ya que esto supondría un problema.

Por otro lado, podrías postear aqui la parte de tu código que maneja los headers para revisar como funciona.

Saludos
Imagen de koki142

Hola!,

Excelente tutorial, muchas gracias.
El caso es que a mi me funciona con Firefox, Opera... pero no con Explorer. Es más, tampoco me funciona vuestro ejemplo si lo pongo directamente en el servidor.

¿Se os ocurre porqué puede ser?

Muchas gracias por vuestro tiempo!,
Oskar

Imagen de nexus
Hola Oskar.

Voy a revisar el ejemplo y probarlo con MSIE para ver que puede estar pasando, en cuento tenga las pruebas te aviso por este medio.

Saludos
Imagen de koki142

Muchísimas gracias por tu tiempo...

Imagen de koki142

Hola!,
Sólo quería preguntar si hay algún avance con este tema...

Gracias!,
Oskar

Imagen de Anónimo

como puedo configurar la pagina en horizontal con spreadsheet?

Imagen de Anónimo

Hola, a mi también me pasa lo mismo con el explorer, es como si no pillara correctamente la parte de la cabecera donde se le indica el nombre del fichero.

Imagen de Anónimo

Hola, como estan.
Realmente este metodo de creacion de excel es genial, y como decian, se puede jugar mucho con el tema de los estilos, y hacer que quede muy bien.
Lo unico que faltaria, es como combinar celdas.
Si alguien pudiera dar el listado de propiedades, como por ejemplo, ss:ExpandedColumnCount, ss:ExpandedRowCount, etc, etc.
Si tendriamos este listado de propiedades completo, creo que este metodo se convertiria en uno de los mejores, y mas practicos, sin tener que usar PEAR, ya que para esto tenemos que instalar en el servidor algunas cosas, y en algunos casos, este es intocable.
De nuevo, si alguien conoce el listado, por favor subanló, y el que sepa combinar celdas (que es lo ultimo que me falta para terminar!) tambien será agradecido.
Gracias!!!

Imagen de Anónimo

Hola a todos, queria sumarme a los comentarios sobre el problema que se presenta con IE a la hora de querer bajar el archivo excel generado.

Con Firefox funciona sin problemas, pero IE no hay caso. He intentado modificar los headers de diversas formas pero no encuentro solucion.

Los headers que tengo en mi codigo son:

header("Content-Description: File Transfer");
header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename=datos.xls");

Tambien lo he probado con:

header("Content-type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=datos.xls");

Y tambien con:

header("Content-type: application/x-msdownload");
header("Content-Disposition: attachment; filename=datos.xls");

Y en todos el mismo resultado... con Firefox anda sin problemas y con IE me da el error:

"No puede descargar generar_excel.php de ..."
"Internet Explorer no puede abrir este sitio de Internet. El sitio no esta disponible o no se encuentra, Intentelo de nuevo"

MUCHISIMAS GRACIAS !!!

Imagen de nexus
Estas usando exactamente el ejemplo que puse "generar_excel.zip" o algún otro?. En un momento más verifico este mismo ejemplo en un IE a ver que resultados me da.

Si deseas verificar, revisa en la siguiente dirección http://demos.developarts.com/excel/ en donde puse el ejemplo funcional.

Saludos
Imagen de Anónimo

Tengo un problema al exportar a excel estando en php via header("Content-type: application/vnd.ms-excel");
al abrir el excell me cambia la columna de codigo por ejemplo si mi codigo era 456.10 me pone 456.1, como puedo hacer para que el excell no me cambie y tome el valor tal cual.

gracias de antemano luis rojas rojaslrp@yahoo.es

Imagen de nexus
Hola Luis:

Pues es bastante fácil de solucionar, en este mismo articulo, en el ejemplo, podrás ver que existe el tag "styles"

 <Styles>
  <Style ss:ID="Default" ss:Name="Normal">
   <Alignment ss:Vertical="Bottom"/>
   <Borders/>
   <Font/>
   <Interior/>
   <NumberFormat/>
   <Protection/>
  </Style>

Es aquí donde se pueden definir distintos formatos para nuestras celdas, por ejemplo:

  <Style ss:ID="s22" ss:Parent="s18">
   <NumberFormat ss:Format="#,##0.00_ ;[Red]\-#,##0.00\ "/>
  </Style>

El cual tendrás que relacionar con una celda de la siguiente forma:

<Cell ss:StyleID="s22"><Data ss:Type="Number">456.1</Data></Cell>
Espero ser de ayuda.

Saludos
Imagen de Anónimo

Si me va ayudar aunque tengo que adicionar codigo , por que los valores que van en esa celda no tienen un formato unico
a veces hay valores como 758090.1, en este caso no quisiera que se me aumente un cero, pero hay tambien 728456.124 en ese caso no quiero que me quite el tercer decimal, tambien hay 785420.250, o tambien puede ser un texto "papa amarilla", pero tu estilo me va ayudar.
Gracias
ah una pregunta tengo otro problema estoy formando un archivo de texto con php usando tab para columnas(\t) y para filas (\n) cuando paso a la fila siguiente uso este codigo php($val es una fila)
$val = substr($val, 0, strlen($val)-2);
supuestamente me deberia sustraer el \t pero me sustrae los dos ultimos caracter de la columna (ultima columna antes de hacer el salto de linea ) cual puede ser mi error
Espero que me puedas ayudar gracias por los archivitos

Imagen de nexus
Hola:
a veces hay valores como 758090.1, en este caso no quisiera que se me aumente un cero, pero hay tambien 728456.124 en ese caso no quiero que me quite el tercer decimal, tambien hay 785420.250, o tambien puede ser un texto "papa amarilla", pero tu estilo me va ayudar.
Para que te respete cualquier valor que incluyas en una celda lo único que tienes que hacer es tratar esas celdas como "string", por ejemplo:

<Cell><Data ss:Type="String">dato</Data></Cell>

Pasando a tu otra pregunta.
usando tab para columnas(\t) y para filas (\n) cuando paso a la fila siguiente uso este codigo php($val es una fila)
No pude entenderte muy bien, pero creo que lo que quieres es extraer valores separados por una tabulación, si es así, la respuesta quizá no sea "strlen", sino con "explode".

Por ejemplo, me imagino que tienes algo así:

l1dato1 \t l1dato2 \t l1dato3 \n
l2dato1 \t l2dato2 \t l2dato3 \n
l3dato1 \t l3dato2 \t l3dato3 \n

Y si lo que quieres hacer es extraer cada uno de los valores separados por los tabuladores, puedes probar con:

$data = explode("\t", $val);
echo $data[0]; // te arroja "l1dato1"
echo $data[1]; // te arroja "l1dato2"
echo $data[2]; // te arroja "l1dato2"

Ahora que si lo que realmente quieres es solo "eliminar" los tabuladores de tu texto, puedes hacerlo con la función "str_replace", por ejemplo:

$val = str_replace("\t", " ", $val);

Lo anterior va a reemplazar todos los tabuladores que encuentre en tu variable, por un espacio en blanco.

Espero ser de ayuda. Saludos
Imagen de Anónimo

Muy Buen aporte.... has salvado a mi jefe jeje :P

Imagen de Anónimo

Buenas quien me dice como hago para que la pagina de excel apenas abra se convierta en landscape, poder definir margenes y tamaño de pagina....gracias

Imagen de halekz
Saludos amigos.

De antemano muchas gracias por el tema de exportar a excel, me sirvio muchísimo para algunas cuestiones que tenia que realizar.

De entrada a mi también me daba el mismo problema con IE, con el ejemplo me funcionaba perfecto pero el problema era a la hora de realizar consultas a la base de datos y que generara el archivo, mi teoria es que IE cuando recibe alguna descarga por headers lo abré en el momento y no espera a que termine de cargar o algo por el estilo, que es lo que realiza Firefox, entonces estuve investigando más sobre los headers en relación a IE, y me encontré este post lo cito.
But in Internet Explorer, whenever I would click the link to downlad, I could only save the file. If I tried opening the file directly, it gave an error about not being able to find the temporary file.

After digging around for a while, I found the solution. You have to set the Cache-Control to private. So I added the following headers (on top/before the others):
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: private");

De Jeremy, en la página www.php.net

Entonces, después de todo el choro que les acabo de hechar que por cierto aburrido, ajajaja mis cabeceras quedaron de la siguiente manera y me funciona perfectamente.

header ("Content-type: application/x-msexcel");
header ("Content-Disposition: attachment; filename=prueba.xls" );
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: private");

Suerte, espero les sirva como a mi.

::Halekz::
Imagen de nexus
Hola Halekz:

Muchas gracias por tu aportación, fíjate que nunca hubiera caído en cuenta de este detalle, debido a que tengo la mala costumbre de poner exactamente esas cabeceras en todos mis desarrollos, y pues no me hubiera pasado por la cabeza, jejeje.

Te agradezco mucho tus atenciones y estoy seguro que este dato le será de mucha ayuda a quienes nos visitan. Próximamente voy a actualizar este artículo y agregar tu aporte.

Saludos
Imagen de Anónimo

Hola

Esto es antiguo pero...
He estado investigando y probando muchas cosas,
necesito agregar imagenes al Excel, funciona facil si solo le doy las cabeceras asi

header("Content-type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=excel.xls");
header("Pragma: no-cache");
header("Expires: 0");

Y luego creo una pagina web normal usando una tabla y se le agregan las imagenes.

Todo bien, pero ¿Como agrego una nueva hoja?... es que tengo que usar la misma hoja, por lo tanto debo usar la misma estructura de filas, y el documento excel no es igual en todo el largo de este. Si pudiera agregar una hoja seria estupendo, se puede hacer en XML pero este no acepta imagenes

alguna ayuda

ahh, las clases que hay por alli, si ingresan imagenes, pero hay que poner las coordenadas X e Y, lo que con un documento de tamaño variable se transforma en un infierno.

Imagen de Anónimo

Hola

Realmente soy muy nueva en este tema. así que tengo dos preguntas que tal vez parezcan bastante obvias.

En el php donde se especifican las variables que deberían aparecer el el archivo excel?
Y otra pregunta: si quiero que ese archivo no se abra sino que se envie por e-mail?

Gracias.

Imagen de nexus

Sobre tu primera pregunta, efectivamente de eso se trata este artículo que como puedes ver, no es tan dificil una vez que le agarras el modo.

Sobre tu segunda pregunta no hay ningun problema, para ellos deberás guardar el archivo de excel generado y después enviarlo con alguna herramienta para PHP de envío de correo electronico... ejem, te recomiendo el mio =)

http://www.developarts.com/nomad_mimemail

Saludos

Imagen de Anónimo

miren muchacos yo toy recien haciendo este tema y veo que ya esta hace muxisimo tiempo en linea ! bueno mi problema es que ME SALE ESTE MENSAJEE !!! DE ERROR !! osea me exportar pero no en un EXCEL sino en la misma pagina web !!
Warning: Cannot modify header information - headers already sent by (output started at /home/laencala/public_html/pag/adm/generar_excel.php:17) in /home/laencala/public_html/pag/adm/generar_excel.php on line 97

Warning: Cannot modify header information - headers already sent by (output started at /home/laencala/public_html/pag/adm/generar_excel.php:17) in /home/laencala/public_html/pag/adm/generar_excel.php on line 98

Pololito Web Pololito Web 2006-12-04T20:10:16Z Empresa: T & T Inmobiliaria Constructora y Asociados SRL 11.5606 6105 10425 600 90 False False Lista de

COMO VEN !! POLOLITO ...... y T & T Inmobiliaria Constructora y Asociados SRL 11.5606 6105

SON DE LA BASE DE DATOS !! q lo consulta muy bien pero me bota ese error bueno ojala me ayuden GRACIAS mi correo es ceap1616@hotmail.com si pudieran responderme aca seria chevere GRACIAS

Imagen de Anónimo

function xlsBOF() {
echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);
return;
}

function xlsEOF() {
echo pack("ss", 0x0A, 0x00);
return;
}

function xlsWriteNumber($Row, $Col, $Value) {
echo pack("sssss", 0x203, 14, $Row, $Col, 0x0);
echo pack("d", $Value);
return;
}

function xlsWriteLabel($Row, $Col, $Value ) {
$L = strlen($Value);
echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L);
echo $Value;
return;
}

// Query Database
$result=mysql_db_query($dbname,"select id,prename,name,sname,grade from appdata where course='$courseid' and sec='$section'")

// Send Header
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");;
header("Content-Disposition: attachment;filename=$courseid-$sec.xls ");

De esta forma crean un .xml el cual lo reconose cualquier version del exel ...!

Saludos ..!

Enviar un comentario nuevo

  • Etiquetas HTML permitidas: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <pre>
  • Saltos automáticos de líneas y de párrafos.
Más información sobre opciones de formato

Captcha Image: you will need to recognize the text in it.
Igrese las letras que puede ver en la imagen superior