Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

gguimaraes

Criar arquivos EXCEL

Recommended Posts

Pessoal,

 

Procurei bastante na web alguma forma de criar um arquivo excel usando PHP e esta foi a melhor forma que encontrei. E como vi que tem muita gente atrás disso também, resolvi postar aqui no fórum. Peguei uma classe chamada excelwrite no site www.phpclasses.org.

 

Eu estava precisando criar um arquivo em excel e fiz algumas modificações para atender as minhas necessidades.

 

O código já está funcionando, mas gostaria da ajuda de vocês para incrementar alguns recursos nesta classe como, por exemplo, mudar o nome da planilha (o nome da planilha - sheet - e não do arquivo - workbook), mudar a cor da fonte e das células, criar mais de uma planilha, etc...

 

É só criar o arquivo excelwriter.inc.php e um outro arquivo exemplo.php e deixar na mesma pasta.

 

 

Bom, abaixo segue o código:

 

---------------------------------------------------------------------------------------------------

excelwriter.inc.php

---------------------------------------------------------------------------------------------------

<?php		 /*	 ###############################################	 ####									   ####	 ####	Author : Harish Chauhan			####	 ####	Date   : 31 Dec,2004			   ####	 ####	Updated:						   ####	 ####									   ####	 ###############################################	 */	 	 /*	 * Class is used for save the data into microsoft excel format.	 * It takes data into array or you can write data column vise.	 */Class ExcelWriter{   var $fp=null;	var $error;	var $state="CLOSED";	var $newRow=false;			/*	* @Params : $file  : file name of excel file to be created.	* @Return : On Success Valid File Pointer to file	* 			On Failure return false	*/	function ExcelWriter($file="",$bsc="CELLPAR"){		return $this->open($file);	}			/*	* @Params : $file  : file name of excel file to be created.	* 	   		if you are using file name with directory i.e. test/myFile.xls	* 		   	then the directory must be existed on the system and have permissioned properly	* 			   to write the file.	* @Return : On Success Valid File Pointer to file	* 	   		On Failure return false	*/	function open($file){		if($this->state!="CLOSED"){			$this->error="Error : Another file is opend .Close it to save the file";			return false;		}					if(!empty($file)){		   $this->fp=@fopen($file,"w+");		}else{		   $this->error="Usage : New ExcelWriter('fileName')";			return false;		}	  if($this->fp==false){		 $this->error="Error: Unable to open/create File.You may not have permmsion to write the file.";			return false;	  }		$this->state="OPENED";		fwrite($this->fp,$this->GetHeader());		return $this->fp;   }			function close(){	   if($this->state!="OPENED"){		  $this->error="Error : Please open the file.";			return false;	   }		if($this->newRow){		   fwrite($this->fp,"</tr>");			$this->newRow=false;		}		fwrite($this->fp,$this->GetFooter());		fclose($this->fp);		$this->state="CLOSED";		return;	}		/* @Params : Void		*  @return : Void		* This function write the header of Excel file.		*/   function GetHeader(){		$header = <<<EOH		<html xmlns:o="urn:schemas-microsoft-com:office:office"		   	xmlns:x="urn:schemas-microsoft-com:office:excel"				xmlns="http://www.w3.org/TR/REC-html40">				<head>				<meta http-equiv=Content-Type content="text/html; charset=us-ascii">				<meta name=ProgId content=Excel.Sheet>				<!--[if gte mso 9]><xml>				 <o:DocumentProperties>				  <o:LastAuthor>Sriram</o:LastAuthor>				  <o:LastSaved>2005-01-02T07:46:23Z</o:LastSaved>				  <o:Version>10.2625</o:Version>				 </o:DocumentProperties>				 <o:OfficeDocumentSettings>				  <o:DownloadComponents/>				 </o:OfficeDocumentSettings>				</xml><![endif]-->				<style>				<!--table					{mso-displayed-decimal-separator:"\.";					mso-displayed-thousand-separator:"\,";}				@page					{margin:1.0in .75in 1.0in .75in;					mso-header-margin:.5in;					mso-footer-margin:.5in;}				tr					{mso-height-source:auto;}				col					{mso-width-source:auto;}				br					{mso-data-placement:same-cell;}				.style0					{mso-number-format:General;					text-align:general;					vertical-align:bottom;					white-space:nowrap;					mso-rotate:0;					mso-background-source:auto;					mso-pattern:auto;					color:windowtext;					font-size:10.0pt;					font-weight:400;					font-style:normal;					text-decoration:none;					font-family:Arial;					mso-generic-font-family:auto;					mso-font-charset:0;					border:none;					mso-protection:locked visible;					mso-style-name:Normal;					mso-style-id:0;}				td					{mso-style-parent:style0;					padding-top:1px;					padding-right:1px;					padding-left:1px;					mso-ignore:padding;					color:windowtext;					font-size:10.0pt;					font-weight:400;					font-style:normal;					text-decoration:none;					font-family:Arial;					mso-generic-font-family:auto;					mso-font-charset:0;					mso-number-format:General;					text-align:general;					vertical-align:bottom;					border:none;					mso-background-source:auto;					mso-pattern:auto;					mso-protection:locked visible;					white-space:nowrap;					mso-rotate:0;}				.xl24					{mso-style-parent:style0;					white-space:normal;}				-->				</style>				<!--[if gte mso 9]><xml>				 <x:ExcelWorkbook>				  <x:ExcelWorksheets>				   <x:ExcelWorksheet>					<x:Name>NOME_PLANILHA</x:Name>					<x:WorksheetOptions>					 <x:Selected/>					 <x:ProtectContents>False</x:ProtectContents>					 <x:ProtectObjects>False</x:ProtectObjects>					 <x:ProtectScenarios>False</x:ProtectScenarios>					</x:WorksheetOptions>				   </x:ExcelWorksheet>				  </x:ExcelWorksheets>				  <x:WindowHeight>10005</x:WindowHeight>				  <x:WindowWidth>10005</x:WindowWidth>				  <x:WindowTopX>120</x:WindowTopX>				  <x:WindowTopY>135</x:WindowTopY>				  <x:ProtectStructure>False</x:ProtectStructure>				  <x:ProtectWindows>False</x:ProtectWindows>				 </x:ExcelWorkbook>				</xml><![endif]-->				</head>				<body link=blue vlink=purple>				<table x:str border=0 cellpadding=0 cellspacing=0 style='border-collapse: collapse;table-layout:fixed;'>EOH;			return $header;   }	function GetFooter(){	   return "</table></body></html>";	}			/*	* @Params : $line_arr: An valid array	* @Return : Void	*/		 	function writeLine($line_arr){	   if($this->state!="OPENED"){		  $this->error="Error : Please open the file.";			return false;	   }		if(!is_array($line_arr)){		   $this->error="Error : Argument is not valid. Supply an valid Array.";			return false;		}		fwrite($this->fp,"<tr>");		foreach($line_arr as $col)		   fwrite($this->fp,"<td class=xl24 width=64 >$col</td>");		fwrite($this->fp,"</tr>");	}	/*	* @Params : Void	* @Return : Void	*/	function writeRow(){	  if($this->state!="OPENED"){		  $this->error="Error : Please open the file.";			return false;	   }	   if($this->newRow==false){		 fwrite($this->fp,"<tr>");	   }else{		   fwrite($this->fp,"</tr><tr>");			$this->newRow=true;			}   }	/*	* @Params : $value : Coloumn Value	* @Return : Void	*/	function writeCol($value){	   if($this->state!="OPENED"){		  $this->error="Error : Please open the file.";			return false;	   }		fwrite($this->fp,"<td class=xl24 width=64 >$value</td>");	}}?>
---------------------------------------------------------------------------------------------------

exemplo.php

---------------------------------------------------------------------------------------------------

<?php   //Incluir a classe excelwriter   include("excelwriter.inc.php");   ??Você pode colocar aqui o nome do arquivo que você deseja salvar.	$excel=new ExcelWriter("excel.xls");		if($excel==false){		echo $excel->error;   }      //Escreve o nome dos campos de uma tabela   $myArr=array('campo1','campo2','campo3');   $excel->writeLine($myArr);   //Seleciona os campos de uma tabela   $sql = "SELECT * tabela";   $resultado = mysql_query($sql, $link);   if($resultado==true){	  while($linha = mysql_fetch_array($resultado)){		 $myArr=array($linha['campo1'],$linha['campo2'],$linha['campo3']);		 $excel->writeLine($myArr);	  }   }//Existem duas maneiras de salvar os dados:	$myArr=array("Name","Last Name","Address","Age");	$excel->writeLine($myArr);	$excel->writeRow();	$excel->writeCol("Manoj");	$excel->writeCol("Tiwari");	$excel->writeCol("80 Preet Vihar");	$excel->writeCol(24);	$myArr=array("Harish","Chauhan","115 Shyam Park Main",21);	$excel->writeLine($myArr);	$excel->close();	//echo "O arquivo foi salvo com sucesso.";?>
Se alguém testar o código, avisa que é pra gente ver se tá funcionando tudo.

 

Bom, qualquer dúvida (que eu souber ajudar), só perguntar. Valeu... http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

E então, alguém testou esta classe?Eu estou em dúvida de como mudar o nome da planilha, não consegui ainda...Eu sei que o nome fica onde está escrito "NOME_PLANILHA", mas não consigo pegar o valor deste campo dinamicamente.Se alguém puder me ajudar, agradeço.Valeu!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Thiago, valeu pela ajuda, mas vim aqui avisar que passei o dia inteiro tentando entender como funciona esta classe.

 

Eu tinha tentado isto que você falou, mas não estava dando certo. Isto porque quando eu colocava pra pegar alguma variável, ela retornava vazia. Mas eu não tinha percebido que a função que constroe esta linha não tinha o parâmetro da variável que eu queria. Então eu já consegui ajeitar isso.

 

Quero dizer que descobri outras coisas muito interessantes.

 

Quendo você abre um arquivo excel, vá na barra:

 

TOOLS (Ferramentas) -> MACRO -> Microsoft Script Editor (Alt+Shift+F11)

 

Lá mostra um monte de códigos de informações de um arquivo XLS.

 

Então eu descobri como formatar a planilha exatamente do jeito que quero.

 

Tinha percebido que esta classe pega um cabeçalho, depois acrescenta tabelas (vindas de banco de dados, por exemplo) e então acrescenta o rodapé e fecha o arquivo.

 

Com isso, o PHP cria um arquivo XLS.

 

Agora a minha dúvida é outra: como é possível criar DUAS ou mais planilhas em um arquivo.

 

O problema é que quando você abre o Microsoft Script Editor ele mostra uma escrutura que não está em um único arquivo. E eu não sei como montar esta estrutura na classe Excel para depois montar o arquivo.

 

Se alguém tiver um pouco de paciência pra me ajudar, agradeço MUITO desde já.

 

Galera, me ajuda aê, vai..........

 

VALEU!!!

 

Ah, esqueci de dizer.

 

Uma coisa que eu não entendi foi a linha que está assim:

 

$header = <<<EOH

 

Alguém sabe o que significa isso?? Tem alguma coisa a ver com operador de bit (deslocamento para a esquerda)???

 

Mas porque está aí desta maneira??

 

Se alguém souber esta também... VALEU!!

 

Pessoal, vamos tentar desvendar os mistérios de arquivos no EXCEL porque tem muita gente que usa isso.

 

Até mais...

Compartilhar este post


Link para o post
Compartilhar em outros sites
Uma coisa que eu não entendi foi a linha que está assim:

 

$header = <<<EOH

 

Alguém sabe o que significa isso?? Tem alguma coisa a ver com operador de bit (deslocamento para a esquerda)???

 

Isso não é um operador bit a bit no PHP... em outras linguagens, como JAVA, é... mas no PHP isso se chama "heredoc". É só uma forma de definir uma string... dê uma olhada no manual do PHP: http://br2.php.net/types.string

 

Eu não sei a resposta para sua outra pergunta (como juntar 2 planilhas em 1 arquivo), mas dou dar uma pesquisada. Se descobrir algo, eu posto aqui...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Descobri como fazer isso! =)

 

Abra a sua planilha, clique em "salvar como" e escolha "Planilha em XML". Depois você abre o arquivo e estuda ele. Tem muitas opções... pelo o que vi, cada planilha é definida numa tag <Worksheet>.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Illidan,valeu pela ajuda, com isso que você descobriu, já dá pra fazer muita coisa. Fiz uns pequenos testes e alguns deram certo e outros errado. Mas pelo menos já tenho uma idéia de onde buscar.Acho que agora é possível fazer um arquivo em excel bem formatado.Thiago, valeu pela ajuda também....Era mais ou menos isso que eu queria: novas maneiras de formatar um arquivo excel através do PHP.Essa dica que o Illidan descobriu foi um grande avanço.Vou fazer mais uns testes pra descobrir a melhor maneira de escrever o código em PHP e depois posto o resultado aqui pro pessoal que estiver interessado.Valeu pela ajuda!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na realidade, o que eu descobri foi um documento que ensinava essa dica... :)

http://www.oreilly.com/catalog/phphks/chapter/hack49.pdf

 

É um capítulo de um livro que eu não conhecia, mas fiquei muito interessado. O livro é "PHP Hacks - Tips & Tools For Creating Dynamic Websites"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Illidan,

 

não importa onde você achou a informação, o importante é que achou. Na internet tem tudo, o difícil é achar... :lol:

 

 

Ah, eu consegui pegar este livro que você falou no emule.

 

Não sei se é permitido colocar este tipo de coisas aqui, mas se não for, só me avisar que eu tiro.

 

Pra quem estiver interessado, o link é:

 

OReilly PHP Hacks Tips and Tools For Creating Dynamic Websites

 

***** EDITADO *****

 

Amigo, realmente não pode postar esse tipo de coisa aqui. Os livros possuem direitos autorais, e vai contra as regras do fórum postá-lo para download. O capítulo que eu postei ali em cima está no site da própria editora, portanto presumo que não tem problema... mas postar o livro inteiro, não pode mesmo.

De qualquer forma, valeu! Sei que sua intenção foi boa... :)

 

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu D+, essa classe é uma beleza!!!mas gostaria de saber se tem como formatar a tabela que foi gerada, por exemplo, deixar o nome das colunas no excel em negrito, se alguém souber me diga por favor.abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá gostaria de aproveitar e dizer que eu testei, gostei muito da classe, porém estou com um probleminha.

 

o meu banco de dados(MySql) está configurado para aceitar inclusão de registros com acentuação.

 

o problema é que quando eu gero o arquivo .csv os as letras que contêm acentos são trocados por caracteres especiais!

e eu preciso que o .csv seja gerado com os acentos.

 

acredito que o problema seja a codificação, porém não sei onde eu defino o charset, pois já tentei modificar aqui:

 

<head>

<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">

<meta name=ProgId content=Excel.Sheet>

 

e não mudou nada! =/

 

como posso fazer isso? alguém tem alguma idéia!?

 

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um detalhe, fiz alguns relatórios em um sistema em formato tabela. Enquanto formava a tabela concatenei em uma variável todo o código HMTL de formação, gravei em um arquivo com a extensão XLS. Minha superpresa: abri no excel 2002 e XP perfeitamente, respeitando cores, formatos e tamanhos. Não é fantástico? Qual a explicação? Não usei calsses, rotinas, etc.. Só o arquivo em HMTL das tabela formado pelo PHP.

 

abraço

Plínio Cruz

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para não ter problemas de acentuação é simples:

 

Edite o arquivo excelwriter.inc.php na linha 93

 

onde está escrito:

 

<meta http-equiv=Content-Type content="text/html; charset=us-ascii">

 

Substitua por:

 

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

 

Pronto! Espero ter ajudado! Foi só ler a classe com calma!

 

Abçs a todos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pô muito bom este script .Mas eu fiz umas pequenas alterações só que não sei o q eu mudei q tá dando um probleminha..Eu preciso que ele exporte um total de 30 sequências de 10 linhas da tabela cada , já comecei com 3 sequências.Só que quando eu exporto ele pula a mesma quantidade de sequências q eu coloquei...Onde estou errando ? :unsure: Quem poder me ajudar agradeço muito ..... http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Exemplo:Já no arquivo exportado em (.xls) ele exporta +ou- como no exemplo abaixo.

 

Título1 - Título2 - Título3 - Título4 - Título5 - Título6 - Título7 - Título8 - Título9 - Título10

pula uma linha

pula duas linhas

pula três linhas

exibe primeira sequência de 10 linhas da tabela

exibe segunda sequência de 10 linhas da tabela

exibe terceira sequência de 10 linhas da tabela

 

 

 

 

 

<?php
include "../validar_session.php";

include "../Config/config_sistema.php";

include("excelwriter.inc.php");


$excel=new ExcelWriter("excel3.xls");

if($excel==false){
echo $excel->error;
}

//Escreve o nome dos campos de uma tabela
$myArr=array('Título1','Título2','Título3','Título4','Título5','Título6','Título7','Título8','Título9','Título10');
$excel->writeLine($myArr);

//Seleciona os campos de uma tabela
$conn = mysql_connect("localhost", "usuario", "senha") or die ('Não foi possivel conectar ao banco de dados! Erro: ' . mysql_error());
if($conn)
{
mysql_select_db("nome-do-banco", $conn);
}
$consulta = "select * from nome-da-tabela";
$resultado = mysql_query($consulta);
if($resultado==true){
while($linha = mysql_fetch_array($resultado)){
// QUANDO ALTERO ESTA PARTE NA HORA DA EXPORTAÇÃO ELE PULA A MESMA QUANTIDADE DE LINHAS QUE EU IMPLANTO .NESTE CASO 3 LINHAS//
$myArr1=array($linha['Lan1'],$linha['Cli1'],$linha['CPF1'],$linha['OP1'],$linha['Per1'],$linha['PZ1'],$linha['Pg1'],$linha['Com1'],$linha['ORG1'],$linha['BC1']);
$myArr2=array($linha['Lan2'],$linha['Cli2'],$linha['CPF2'],$linha['OP2'],$linha['Per2'],$linha['PZ2'],$linha['Pg2'],$linha['Com2'],$linha['ORG2'],$linha['BC2']);
$myArr3=array($linha['Lan3'],$linha['Cli3'],$linha['CPF3'],$linha['OP3'],$linha['Per3'],$linha['PZ3'],$linha['Pg3'],$linha['Com3'],$linha['ORG3'],$linha['BC3']);
$excel->writeLine($myArr1);
$excel->writeLine($myArr2);
$excel->writeLine($myArr3);
}
}


$excel->close();
echo "O arquivo foi salvo com sucesso. <a href=\"excel3.xls\">excel.xls</a>";

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala galera!

 

Estou usando esse código e está funcionando perfeitamente...

Minha dúvida é como colocar o valor de uma coluna do MySQL em uma célula específica de um arquivo já criado.

Exemplo:

ID na célula A2;

Nome na célula B5...

Código usado:

<?php
   
   include("excelwriter.inc.php");
   //Aqui ele cria um arquivo novo... gostaria de usar um já existente.
   $excel=new ExcelWriter("modelo.xls");

    if($excel==false){
        echo $excel->error;
   }

   //Seleciona os campos de uma tabela
	$conn = mysql_connect("localhost", "root", "") or die ('Não foi possivel conectar ao banco de dados! Erro: ' . mysql_error());
	if($conn)
	{
	mysql_select_db("meu_banco", $conn);
	}
   $consulta = "SELECT data,numero,de FROM tabela WHERE id = '".$_GET['id']."'";
   $resultado = mysql_query($consulta);
   if($resultado==true){
      while($linha = mysql_fetch_array($resultado)){
        //aqui gostaria de pre-definir a célula que será usada. Exemplo: $linha['data'] na célula A2.
        $excel->writeRow();
        $excel->writeCol($linha['data']);
        $excel->writeCol($linha['numero']);
        $excel->writeCol($linha['de']);
      }
   }
    $excel->close();
    echo "O arquivo foi salvo com sucesso. <a href=\"modelo.xls\">modelo.xls</a>";

?>
Agradeço desde já!!

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.