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.phpCriando 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ítulo</th>
<th width="79" align="left">Edição N.º </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