Olá
No meu último post eu expliquei como exportar dados formatados em html para o excel.
Hoje vou explicar como exportar para word.
Na verdade, só vamos mudar a extensão do arquivo a ser exportado e o parâmetro application do header.
Vamos forçar o download do arquivo através da função header() que é nativa do PHP.
Coloquei a function como método estático (igual ao método toXLS) dentro de uma classe (Util.php) para que a coleção de funções de uso geral fiquem mais organizadas e acessíveis.
Segue o método (Util.php):
<?php
class Util
{
/**
* @author Rodrigo Régis Palmeira
* @link http://www.rodrigoregis.com.br
* @param string $html
* @return file.doc
*/
public static function toDOC($html, $nome = 'file.doc', $destino = null)
{
if (!$destino)
{
header("Content-type: application/vnd.ms-word");
header("Content-type: application/force-download");
header("Content-Disposition: attachment; filename=\"{$nome}\"");
header("Pragma: no-cache");
echo $html;
exit();
}
else
{
file_put_contents($destino.'/'.$nome, $html);
exit();
}
}
}
?>
Vamos implementá-lo (relatorio.php):
<?php
require('Util.php');
$html = <<<HTML
<table width='90%' border='1'>
<tr>
<th>Título </th>
<th>Título 2</th>
<th>Título 3</th>
</tr>
<tr>
<td>Dados 1</td>
<td>Dados 2</td>
<td>Dados 3</td>
</tr>
<tr>
<td>Dados 4</td>
<td>Dados 5</td>
<td>Dados 6</td>
</tr>
<tr>
<td>Dados 7</td>
<td>Dados 8</td>
<td>Dados 9</td>
</tr>
</table>
HTML;
//Chamando o método
Util::toDOC($html);
?>
Por hoje é só!
Espero ter ajudado!

Ou, legal esse post heim régis, tava procurando algo parecido para aplicar no sistema de agenda.
Vou testar aqui… vlw.
Ótima solução.
simples e eficiente.
abraço
Não consegui utilizar.
O que deve ser feito? Salvar os arquivos com que nome?
Abraços e obrigado
Me diga o que aconteceu!
Retornou algum erro?
Qual versão do word vc tem?
Qual sua versão do PHP e qual seu Sistema Operacional?
Primeiramente, obrigado pela resposta.
Tenho dúvida na hora de gerar os arquivos. São dois arquivos diferentes? Ou junta?
Salvo com qual nome?
Por nada! É sempre bom ajudar (e nunca se sabe quando vamos precisar tbm).
São dois aquivos diferentes.
O primeiro (o arquivo com a classe) eu costumo chamar de Util.php (tem jente que prefere Util.class.php) e é uma classe onde geralmente eu guardo meus métodos que podem ser utilizadas em qualquer parte do sistema.
O segundo arquivo você pode chamar da forma que quiser, porém, você não pode se esquecer de colocar um require(‘Util.php’) no topo do arquivo.
Vou adicionar essa parte do código no post p/ ficar mais claro.
Cara parabéns. Uma mão na roda esse seu script. Não estava precisando agora, mas vou precisar no futuro. Valeu
Olá Régis. Antes de + nada, parabéns pelo post, ajudou muito. Agora tenho um novo problema: preciso exportar algo com mais recursos de formatação para Word. Precisei fazer algo parecido para PDF e o FPDF serviu. Saberia me dizer se existe algo parecido que exporte para Word? Grande abraço.
Olá!
Nunca precisei de algo que não pudesse resolver com o HTML + CSS.
Já usei FPDF e me atendeu bem (apesar de eu preferir DOMPDF).
Vou dar uma pesquisada e se encontrar algo parecido com o que você precisa eu posto aqui ok?
Muito bom mesmo, estava procurando isso! Abraço!
Rodrigo, bacana d+, funciona perfeitamente.
Valeu!!!
Ola Rodrigo, excelente esta função, estou desenvolvendo uma proposta técnica que é montada no php, depois exportada para o word, acredito que vai dar certo, mas a duvida é a seguinte:
Gostaria que quando clicar fosse direto para o word sem ter que aparecer aquele pop perguntando abrir ou download, se existe essa possibilidade , como faço ?
Obrigado desde já.
Parabens pelo post e o codigo funcionou certinho.
Eu tava precisando desse sistema msm soque ao invés dele salvar no meu pc tava querendo q ele fosse salvo no servidor de hospedagem ou ser enviado como anexo pela função mail().
Vc saberia como fazer um dos dois ?
Abraço
Provavelmente existe sim!
Só é preciso pesquisar um pouco mais sobre header!
Uma outra opção seria você salvar o arquivo em disco e abrí-lo após isso!
Olá!
Você pode salvar o arquivo em disco sim!
Segue uma atualização da classe:
public static function toDOC($html, $nome = 'file.doc', $destino = null) { if (!$destino) { header("Content-type: application/vnd.ms-word"); header("Content-type: application/force-download"); header("Content-Disposition: attachment; filename=\"{$nome}\""); header("Pragma: no-cache"); echo $html; } else { file_put_contents($destino.'/'.$nome, $html); } }Olá amigo… parabéns pelo post. . .
Consegui aplicar esta solução em uma página totalmente em HTML, mas preciso que um formulário de 30 páginas seja exportado para msword, levando em consideração que 80% das informações serão consultadas de um banco MySQL, ou seja haverá MUITOS campos dinâmicos. . . há alguma dica para a minha tristeza??? ;-(
Olá Dalto!
Sem problemas! Aqui no trabalho exportamos arquivos gigantescos gerados dinamicamente.
Olá Rodrigo Régis Palmeira! ! !
Mas como que fica as partes em HTML e as Partes em PHP, pois tentei de várias formas e não tive exito, poderia me mandar algumas linha de demonstração, coisa pequena mesmo, só para que eu tenha como base. . .
Obrigado pela Atenção. . .
Olá Rodrigo Régis Palmeira! ! !
Consegui adaptar e fazer exportas os códigos em PHP + MySQL, precisa usar o mysql_fatch_object, ou seja, os retornos têm que ser em forma de objetos, segue o exemplo:
$resultado = mysql_query(“SELECT * FROM cad_importador WHERE id_cad_importador = ’3′”) or die (mysql_error());
$linha = mysql_fetch_object($resultado);
require(‘Util.php’);
$html = <<<HTML
Nome
Endereço
CPF / CNPJ
$linha->cli_nome
$linha->cli_end
$linha->cli_doc_1
Dados 4
Dados 5
Dados 6
Dados 7
Dados 8
Dados 9
HTML;
//Chamando o método
Util::toDOC($html);
Você tem que montar o relatório como se fosse imprimir o html mesmo!
Se voce der um echo na sua variável $html e funcionar o relatório na formatação que desejar, então vai funcionar para a exportação.
Existem várias formas de extrair o resultado de uma query.
No seu caso foi utilizado o mysql, então você também poderia ter utilizado o mysql_fecth_array().
Quando tiver um tempo, dê uma olhada em alguma ORM para abstração de banco.
Gosto muito e recomendo o uso da doctrine
Olá Rodrigo Régis Palmeira! ! !
rsrsrsrs. HELP! ! !
Amigo, sinceramente muito obrigado, por toda a ajuda, mas ainda me falta um pequeno detalhe, há uma determinada tabela do mysql, que terá várias linhas com várias colunas, e preciso que uma seja preenchida por LOOP com os dados de todas as linhas, já tentei com “mysql_fetch_object”, com “mysql_num_rows”, com “mysql_num_rows”, com o “mysql_fetch_object”, mas com nenhum destes LOOPs estou conseguindo repetir a com os valores desta tabela do banco mysql, lembrando que este LOOP deverá acontecer + – no meio do form que irá ser exportador para o MsWord.
E +1X lhe parabenizo pelo post, pois de todos os que já testei é o único que funciona, mas estou apanhando para este LOOP.
Olá Dalto!
Obrigado pelo retorno!
Não tive problemas quanto à loop.
Imagino que o seu código fonte esteja sendo impresso, portanto, tente trocar o uso do heredoc por aspas e concatene as linhas com o sinal (.=).
Ex.:
$html = ''; while ($resultado = mysql_fecth_array($query)) { $html.= $resultado['nome']; $html.= '<br />'; }bom comeco
Nice art, I would say thanks to author because i have found a lot good knowledge. Im waiting for more posts. Best wishes
Couldnt agree more with that, very attractive article
You are a very intelligent individual!
I got what you intend, thanks for posting .
Cara valeu pelo post! muito bom! Só que me deparei com um problema aqui na geração de relatórios, que não sei se html e CSS vão resolver na hora de gerar componentes para o Word. Por exemplo, eu gostaria que alguns textos fossem gerados em “caixas de texto” do Word e também gostaria de gerar cabeçalhos e rodapés para meus relatórios do word.
Algum material/ajuda ??
Obrigado!
Tive uma necessidade dessas uma vez e criei uma tabela e coloquei o conteúdo do meu relatório dentro da tabela.
O cabeçalho você coloca na tag e o rodapé na tag
Bom dia amigo,
Estou utilizando deste código para exportar currículos cadastrados em nosso site, com PHP e MySQL.
Mas acontece um probleminha que não consigo resolver, quando mando exportar ele vem com algum tipo de codificação diferente, e o Word apresenta aquela tela de seleção de Codificação do arquivo. E para gerar vários arquivos acaba atrapalhando um pouco. Sabe alguma solução para isso?
Valew!
Bom dia Samuel! Eu nunca tive esse problema! Vc está usando UTF-8 ou ISO-8859-1?
Se possível poste o HTML de um currículo para que eu possa fazer um teste e encontrar uma solução.
Poisé Rodrigo, não especifico a codificação. Onde colocaria ela? Quando tento colocar dentro do código que entra no doc word ele aparece o código HTML no documento, se coloco antes de todo o código PHP, meu doc do word aparece como página da web.
Meu código é o seguinte:
require(‘Util.php’);
$nome = $nomec.”.doc”;
$html = <<<HTML
Dados do Formulário Currículum
Vaga: $vaga
Nome: $nomec
Data de nascimento: $nascimento
Endereço
Avenida/Rua: $av
Número: $n
Bairro: $bairro
Cidade: $cidade
Estado: $estado
Telefone de contato: $telefone
Celular: $celular
E-mail: $email
Escolaridade
Formação: $escolaridade
Curso: $curso
Período: $periodo
Ultimos empregos
Empresa: $empresa
Cargo: $cargo
Período: $periodoe
Empresa: $empresa1
Cargo: $cargo1
Período: $periodoe1
Empresa: $empresa2
Cargo: $cargo2
Período: $periodoe2
Mensagem: $mensagem
Data de cadastro do currículo: $datacadastro
HTML;
//Chamando o método
Util::toDOC($html, $nome);
Antes disso tem a chamada do MySQL e o registro de cada variável que é utilizada para montar o currículo.
Tentei mudar o nome de .doc para .docx, mas aí ele nem abrir consegue, diz que ta faltando algo.
Mas da forma que está agora, ele pede para selecionar a codificação, e depois abre como "Texto sem formatação"
Coloca onde vc gera o HTML.