• Nenhum resultado encontrado

Arquivos de Excel

No documento 035_apostila-completa-de-php5-mysql-e-ajax (páginas 144-149)

Para criar um arquivo que tenha como saída o formato do Excel, ou xls, você inicialmente precisa ter a formatação padrão usada por ele. Isso é fácil de se conhecer, bastando apenas exportá-lo no formato XML. Com os header’s a seguir, você tem a possibilidade de ter a saída para download.

<?php

header ( "Expires: Mon, 1 Apr 1974 05:00:00 GMT" );

header ( "Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT" ); header ( "Pragma: no-cache" );

header ( "Content-type: application/x-msexcel" );

header ( "Content-Disposition: attachment; filename=arquivo.xls" ); header ( "Content-Description: PHP Generated XLS Data" );

?>

O código a seguir demonstra como funciona um documento com saída em formato XLS (MS Excel), com dados vindos do banco de dados.

Uma situação crítica que deve ser observada está em ss:ExpandedRowCount, em destaque a seguir. Isso porque você tem que passar ao arquivo o número de linhas correto. Caso não o faça, um erro ocorre.

<?php

header( "content-type: text/xml" );

header ( "Expires: Mon, 1 Apr 1974 05:00:00 GMT" );

header ( "Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT" ); header ( "Pragma: no-cache" );

header ( "Content-type: application/x-msexcel" );

header ( "Content-Disposition: attachment; filename=arquivo.xls" ); header ( "Content-Description: PHP Generated XLS Data" ); //conecta ao banco de dados

$conexao=mysql_connect("localhost","edson","integrator"); //acessa o banco de dados desejado

$banco=mysql_select_db("livraria"); //seleciona os dados da tabela

$sql = "SELECT * FROM livros"; $resultado = mysql_query($sql);

$nr=mysql_num_rows($resultado); //conta o número de linhas encontradas //colocado em PHP para evitar erros de interpretação pelo servidor

echo( "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n" ); echo( "<?mso-application progid=\"Excel.Sheet\"?>\n" ); ?> <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">

PHP 5 e MySQL 5 e Ajax

PHP 5 & MySQL 5 for Web – www.integrator.com.br/php

<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> <Author>Edson Gonçalves</Author>

<LastAuthor>Edson Gonçalves</LastAuthor> <Created>2005-04-30T14:08:07Z</Created> <LastSaved>2005-04-30T14:09:14Z</LastSaved>

<Company>Integrator Tecnology and Design</Company> <Version>10.2625</Version> </DocumentProperties> <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office"> <DownloadComponents/> <LocationOfComponents HRef=""/> </OfficeDocumentSettings> <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> <WindowHeight>15930</WindowHeight> <WindowWidth>20025</WindowWidth> <WindowTopX>480</WindowTopX> <WindowTopY>105</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="Livros no Excel"> <Table ss:ExpandedColumnCount="3"

ss:ExpandedRowCount="<? print( $nr + 1 ) ?>"

x:FullColumns="1" x:FullRows="1">

<Column ss:AutoFitWidth="0" ss:Width="117"/> <Row>

<Cell><Data ss:Type="String">Título</Data></Cell> <Cell><Data ss:Type="String">Edição N.</Data></Cell> <Cell><Data ss:Type="String">Publicado em</Data></Cell> </Row>

<?php while($row = mysql_fetch_array($resultado)){ ?> <Row>

<Cell><Data ss:Type="String"><? print( $row["titulo"] ) ?></Data></Cell>

<Cell><Data ss:Type="Number"><? print( $row["edicao_num"] ) ?></Data></Cell> <Cell><Data ss:Type="Number"><? print( $row["ano_publicacao"] ) ?></Data></Cell> </Row> <? } ?> </Table> <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> <Selected/> <Panes> <Pane>

PHP 5 e MySQL 5 e Ajax

<Number>3</Number> <ActiveRow>2</ActiveRow> </Pane> </Panes> <ProtectObjects>False</ProtectObjects> <ProtectScenarios>False</ProtectScenarios> </WorksheetOptions> </Worksheet> </Workbook> trab_excel.php

Criando arquivos em RTF

Criar arquivos em formato RTF com o PHP é relativamente simples. Primeiro você precisa usar um editor de arquivos como o BrOffice.org Writer ou MS Word e criar um arquivo com o formato mostrado a seguir:

Formato do arquivo chamado de arquivoRTF.rtf Data do relatório: <<data>>

A seguir você tem uma lista de Livros encontrados no banco de dados:

Título Edição N.º Publicado em

<<titulo>> <<edicao>> <<publicado>>

A seguir você tem um exemplo de listagem dos livros simples, para que seja através desse arquivo a chamada para o outro que irá gerar o RTF com os novos dados:

<?php

try{

//conecta ao banco de dados

$conexao=mysql_connect("localhost","edson","integrator"); //acessa o banco de dados desejado

$banco=mysql_select_db("livraria");

$rs = mysql_query("SELECT * FROM livros"); if(!$rs)

throw new Exception('Problemas: '.mysql_error().'<br />'); }

catch(Exception $e){

//caso haja uma exceção a mensagem é capturada e atribuida a $msg $msg = $e->getMessage();

} ?>

PHP 5 e MySQL 5 e Ajax

PHP 5 & MySQL 5 for Web – www.integrator.com.br/php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"> <head>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Visualizar Livros</title>

</head> <body> <?php

//verifica se existe a variável $msg if(isset($msg))

echo $msg;

?>

<table width="550" border="1" cellspacing="0" cellpadding="0"> <tr>

<th width="109" align="left">ISBN</th>

<th width="177" align="left">T&iacute;tulo</th>

<th width="79" align="left">Edi&ccedil;&atilde;o N.&ordm; </th> <th width="96" align="left">Publicado em: </th>

<th width="77" align="left">Gerar RTF </th> </tr>

<?php

//varre todos os dados da tabela

while($row=mysql_fetch_array($rs)){ ?>

<tr>

<td><?php echo $row['isbn']?></td> <td><?php echo $row['titulo']?></td>

<td align="center"><?php echo $row['edicao_num']?></td> <td align="center"><?php echo $row['ano_publicacao']?></td> <td align="center"><a href="geraRTF.php?isbn=<?php echo urlencode($row['isbn'])?>"> Clique aqui </a> </td>

</tr> <?php }//end if?> </table> </body> </html> list_livros.php

A seguir você fará o arquivo que receberá o ISBN do livro para gerar o arquivo RTF com os dados.

<?php

try{

//conecta ao banco de dados

$conexao=mysql_connect("localhost","edson","integrator"); //acessa o banco de dados desejado

$banco=mysql_select_db("livraria"); //seleciona o livro escolhido na lista

PHP 5 e MySQL 5 e Ajax

$sql = "SELECT * FROM livros WHERE ISBN='{$_GET['isbn']}'"; $resultado = mysql_query($sql);

//se houver problemas na query, lança uma exceção if(!$resultado)

throw new Exception('Problemas: '.mysql_error( ).'<br />'); $nr=mysql_num_rows($resultado);

}

catch(Exception $e){

//caso haja uma exceção a mensagem é capturada e ecoada na tela echo $e->getMessage( );

}

//gera os cabeçalhos corretos para a saída do documento RTF header( "Content-Type: application/msword" );

header( "Content-Disposition: inline, filename=arquivoRTFModificado.rtf"); $data = date( "d/m/Y" );

// abre o arquivo RTF criado como template $filename = "arquivoRTF.rtf";

$output = file_get_contents($filename);

// altera as informações dentro do arquivo template para os dados vindos do banco $row = mysql_fetch_array($resultado);

$output = str_replace( "<<data>>", $data, $output );

$output = str_replace( "<<titulo>>", $row["titulo"] , $output );

$output = str_replace( "<<edicao>>", $row["edicao_num"], $output );

$output = str_replace( "<<publicado>>", $row["ano_publicacao"], $output );

//envia a saída gerada para o browser echo $output;

?>

geraRTF.php

O método file_get_contents( ) é o preferível para se ler o conteúdo de um arquivo em uma string. Ela usa técnicas de mapeamento de memória suportadas em seu sistema operacional para melhorar a performance. Mas você poderia ter usado o conhecido fopen( ), fwrite( ) e fclose( ) se desejasse.

O exemplo a seguir faz exatamente isso e gera um novo arquivo, usando o método copy( ) para copiá-lo com o novo nome no diretório especificado.

<?php try{

//conecta ao banco de dados

$conexao=mysql_connect("localhost","edson","integrator"); //acessa o banco de dados desejado

PHP 5 e MySQL 5 e Ajax

PHP 5 & MySQL 5 for Web – www.integrator.com.br/php

$sql = "SELECT * FROM livros WHERE ISBN='{$_GET['isbn']}'"; $resultado = mysql_query($sql);

if(!$resultado)

throw new Exception('Problemas: '.mysql_error().'<br />');

$nr=mysql_num_rows($resultado);

$data = date( "d/m/Y" ); // open our template file $arquivo = "arquivoRTF.rtf"; $novoarq="arquivoRTFGerado.rtf"; $dir = './';

if(!copy($arquivo,$dir.$novoarq))

throw new Exception('Não foi possível copiar o arquivo<br />');

if(file_exists($arquivo)) {

$abre=fopen($arquivo,"r");//abre o arquivo original $abre_novo=fopen($novoarq,"w+");//abre o arquivo novo $saida=fread($abre,filesize($arquivo));

$row = mysql_fetch_array($resultado);

$saida = str_replace( "<<data>>", $data, $saida );

$saida = str_replace( "<<titulo>>", $row["titulo"] , $saida );

$saida = str_replace( "<<edicao>>", $row["edicao_num"], $saida ); $saida = str_replace( "<<publicado>>", $row["ano_publicacao"], $saida );

$grava=fwrite($abre_novo,$saida);//escreve a saída no arquivo novo fclose($abre);//fecha o original

fclose($abre_novo);//fecha o novo }

else

throw new Exception('Não foi possível encontrar o arquivo<br />');

echo "Arquivo gerado com sucesso!"; }

catch(Exception $e){

//caso haja uma exceção a mensagem é capturada e atribuida a $msg echo $e->getMessage();

}

?>

gerarRTF.php

No documento 035_apostila-completa-de-php5-mysql-e-ajax (páginas 144-149)

Documentos relacionados