PHP+MYSQL para o MS-WORD com PHPWord

Deparei-me recentemente com a elaboração de um projecto em SC onde a emissão de relatórios tinha de ser em Word.
Inicialmente, fiquei apreensivo pela trabalheira que iria dar, e principalmente sendo uma exportação que ainda não tinha efectuado,
apesar do SC ter a exportação para RTF.
Mas a implicação aqui neste processo teria de ser elaborado um relatório personalizado, onde o SC através de várias tabelas teria de escrever num documento
WORD.
Após alguma pesquisa decobri um produto que me resolveu desde logo o meu problema, e consegui criar documentos com excelente
perfomance em WORD.
O produto é free e chama-se PHPWord e pode ser baixado em http://phpword.codeplex.com/ onde tem um pequeno manual de ajuda em
http://phpword.codeplex.com/releases/view/49543#DownloadId=138036
Possui logo a partida um exemplo de como podemos aplicar o codigo.
No SC a instalação aconselho a colocar dentro do directorio
…/apps/nomedoprojecto/PHPWord
na definição do PATH no dicheiro PHPWord.php
/** PHPWORD_BASE_PATH */
if(!defined(‘PHPWORD_BASE_PATH’)) {
define(‘PHPWORD_BASE_PATH’, ‘…/PHPWord/’);
require PHPWORD_BASE_PATH . ‘PHPWord/Autoloader.php’;
PHPWord_Autoloader::Register();
}

Neste Exemplo cloquei o botão PHP para elaborar um relatorio de varias tabelas:

$wnumero={numero};

// Include the PHPWord.php, all other classes were loaded by an autoloader
chdir(’…/PHPWord’);
require_once ‘PHPWord.php’;

// Create a new PHPWord Object
$PHPWord = new PHPWord();
$PHPWord->setDefaultFontName(‘Arial Narrow’);
$PHPWord->setDefaultFontSize(10);
// Every element you want to append to the word document is placed in a section. So you need a section:

$section = $PHPWord->createSection();
$fontStyle = array (‘bold’ => true);
$paraStyle = array (‘align’ => ‘center’);
$header = $section->createHeader();
$imageStyle = array(‘width’=>50, ‘height’=>50, ‘align’=>‘center’);
$header->addImage(‘logocmrb2.jpg’, $imageStyle);
$header->addPreserveText(‘Câmara Municipal da Ribeira Brava’,$fontStyle,$paraStyle);

// report footer
$paraStyle = array(‘align’ => ‘center’);
$testVariable = 'Imp.04|DAS.CMRB ';
$footer = $section->createFooter();

$footer->addPreserveText( $testVariable.’{ DATE @“d, MMMM yyyy” }’, null, $paraStyle );

// After creating a section, you can append elements:
$fontStyle = array (‘bold’ => true);
$paraStyle = array (‘align’ => ‘center’);
$section->addText( ‘RELATÓRIO SOCIAL’, $fontStyle, $paraStyle );
$PHPWord->setDefaultFontSize(8);
$styleTable = array(‘borderColor’=>‘006699’,‘borderSize’=>6, ‘cellMarginTop’=>100);
$styleFirstRow = array(‘bgColor’=>’ #F0F0F0’);
$PHPWord->addTableStyle(‘myTable’, $styleTable, $styleFirstRow);

$table = $section->addTable(‘myTable’);
$table->addRow(50);
$table->addCell(20000)->addText(‘I - Identificação do Munícipe’, $fontStyle, $paraStyle);

$styleTable = array(‘borderColor’=>‘006699’,‘borderSize’=>6, ‘cellMarginTop’=>100);
$styleFirstRow = array(‘bgColor’=>’#FFFFFF ');
$PHPWord->addTableStyle(‘myTable2’, $styleTable, $styleFirstRow);

$table = $section->addTable(‘myTable2’);
$table->addRow(50);
$table->addCell(2000)->addText(‘Nome:’);
$table->addCell(20000)->addText({nome});
$table->addRow(50);
$table->addCell(2000)->addText(‘Morada:’);
$table->addCell(20000)->addText({morada}.", “.{freguesia}.”, “.{codpostal}.”-".{cpostal});
$table->addRow(50);
$table->addCell(2000)->addText(‘Contactos:’);
$table->addCell(20000)->addText(“Telefones: “.{telefones}.”, EMail:”.{email});

$section->addText(" ",$paraStyle);

$styleTable = array(‘borderColor’=>‘006699’,‘borderSize’=>6, ‘cellMarginTop’=>100);
$styleFirstRow = array(‘bgColor’=>’ #F0F0F0’);
$PHPWord->addTableStyle(‘myTable’, $styleTable, $styleFirstRow);

$table = $section->addTable(‘myTable’);
$table->addRow(50);
$table->addCell(20000)->addText(‘II - Composição do Agregado Familiar’, $fontStyle, $paraStyle);

$PHPWord->setDefaultFontSize(8);
$styleTable = array(‘borderColor’=>‘006699’,‘borderSize’=>6, ‘cellMarginTop’=>100);
$styleFirstRow = array(‘bgColor’=>’#FFFFFF ');
$PHPWord->addTableStyle(‘myTable2’, $styleTable, $styleFirstRow);

$table = $section->addTable(‘myTable2’);
$table->addRow(50);
$table->addCell(8000)->addText(‘Nome’, $fontStyle, $paraStyle);
$table->addCell(3000)->addText(‘Data Nasc.’, $fontStyle, $paraStyle);
$table->addCell(2000)->addText(‘Parentesco’, $fontStyle, $paraStyle);
$table->addCell(2000)->addText(‘Est.Civil’, $fontStyle, $paraStyle);
$table->addCell(2000)->addText(‘NºB.I.’, $fontStyle, $paraStyle);
$table->addCell(2000)->addText(‘NIF’, $fontStyle, $paraStyle);
$table->addCell(2000)->addText(‘Habilitações’, $fontStyle, $paraStyle);
$table->addCell(2000)->addText(‘Ocupação’, $fontStyle, $paraStyle);

$query = mysql_query(“SELECT nome,datanasc,parentesco,estadocivil,bi,nif,habilitacoes,ocupacao FROM agregadofamiliar where registo=$wnumero”);
while($array = mysql_fetch_array($query))
{
$table->addRow(50);
$table->addCell(8000)->addText( $array[‘nome’]);
$table->addCell(3000)->addText( $array[‘datanasc’]);
$table->addCell(2000)->addText( $array[‘parentesco’]);
$table->addCell(2000)->addText( $array[‘estadocivil’]);
$table->addCell(2000)->addText( $array[‘bi’]);
$table->addCell(2000)->addText( $array[‘nif’]);
$table->addCell(2000)->addText( $array[‘habilitacoes’]);
$table->addCell(2000)->addText( $array[‘ocupacao’]);

}
$section->addText(" ",$paraStyle);
$styleTable = array(‘borderColor’=>‘006699’,‘borderSize’=>6, ‘cellMarginTop’=>100);
$styleFirstRow = array(‘bgColor’=>’ #F0F0F0’);
$PHPWord->addTableStyle(‘myTable’, $styleTable, $styleFirstRow);
$table = $section->addTable(‘myTable’);
$table->addRow(50);
$table->addCell(20000)->addText(‘III-Situação Socioeconómica e Familiar’, $fontStyle, $paraStyle);

$styleTable = array(‘borderColor’=>‘006699’,‘borderSize’=>6, ‘cellMarginTop’=>100);
$styleFirstRow = array(‘bgColor’=>’#FFFFFF ');
$PHPWord->addTableStyle(‘myTable2’, $styleTable, $styleFirstRow);

$table = $section->addTable(‘myTable2’);
$table->addRow(50);
$table->addCell(2000)->addText(‘Data’, $fontStyle, $paraStyle);
$table->addCell(8000)->addText(‘Nome’, $fontStyle, $paraStyle);
$table->addCell(2000)->addText(‘Rendimento’, $fontStyle, $paraStyle);
$table->addCell(2000)->addText(‘Despesa’, $fontStyle, $paraStyle);
$table->addCell(2000)->addText(‘Valor Mensal’, $fontStyle, $paraStyle);

$query = mysql_query(“SELECT data,nome,rendimento,despesa,valormensal FROM rendimentosdespesas where registo=$wnumero”);
while($array = mysql_fetch_array($query))
{
$table->addRow(50);
$table->addCell(2000)->addText( $array[‘data’]);
$table->addCell(8000)->addText( $array[‘nome’]);
$table->addCell(2000)->addText( $array[‘rendimento’]);
$table->addCell(2000)->addText( $array[‘despesa’]);
$table->addCell(2000)->addText( $array[‘valormensal’]);

}
$section->addText(" ");
$styleTable = array(‘borderColor’=>‘006699’,‘borderSize’=>6, ‘cellMarginTop’=>100);
$styleFirstRow = array(‘bgColor’=>’#FFFFFF ');
$PHPWord->addTableStyle(‘myTable2’, $styleTable, $styleFirstRow);

$table = $section->addTable(‘myTable2’);
$table->addRow(50);
$table->addCell(8000)->addText(‘Total dos Rendimentos do Agregado:’, $fontStyle, $paraStyle);
$table->addCell(2000)->addText(’.00€’, $fontStyle, $paraStyle);

$section->addText(" ");
$styleTable = array(‘borderColor’=>‘006699’,‘borderSize’=>6, ‘cellMarginTop’=>100);
$styleFirstRow = array(‘bgColor’=>’#FFFFFF ');
$PHPWord->addTableStyle(‘myTable2’, $styleTable, $styleFirstRow);

$table = $section->addTable(‘myTable2’);
$table->addRow(500);
$table->addCell(20000)->addText(’ descrever dinâmica familiar no que respeita à atitude face ao trabalho, escola e prestação de cuidados a dependentes, organização familiar, apoios de outras entidades, etc.’);

$PHPWord->setDefaultFontSize(8);
$section->addText(" ");
$styleTable = array(‘borderColor’=>‘006699’,‘borderSize’=>6, ‘cellMarginTop’=>100);
$styleFirstRow = array(‘bgColor’=>’ #F0F0F0’);
$PHPWord->addTableStyle(‘myTable’, $styleTable, $styleFirstRow);

$table = $section->addTable(‘myTable’);
$table->addRow(50);
$table->addCell(20000)->addText(‘IV - Situação Habitacional’, $fontStyle, $paraStyle);

$styleTable = array(‘borderColor’=>‘006699’,‘borderSize’=>6, ‘cellMarginTop’=>100);
$styleFirstRow = array(‘bgColor’=>’#FFFFFF ');
$PHPWord->addTableStyle(‘myTable2’, $styleTable, $styleFirstRow);

$table = $section->addTable(‘myTable2’);
$query = mysql_query(“SELECT tipohabitacao,reg_ocupacao,desc_tipologia,agua,luz,gas,esgotos,conservacao,acessibilidade,mobi_electro,observacoes FROM situacaohabitacional where registo=$wnumero”);

while($array = mysql_fetch_array($query))
{
$table->addRow(50);
$table->addCell(22000)->addText( $array[‘tipohabitacao’].", “.$array[‘reg_ocupacao’].” Agua: “.$array[‘agua’].” Luz: “.$array[‘luz’].” Gás: “.$array[‘gas’].” Esgotos: “.$array[‘esgotos’].”, “.$array[‘conservacao’].”, “.$array[‘acessibilidade’].”, “.$array[‘mobi_electro’].”, ".$array[‘observacoes’]);

}
$section->addText(" ");
$table = $section->addTable(‘myTable’);
$table->addRow(50);
$table->addCell(20000)->addText(‘V-Conclusão’, $fontStyle, $paraStyle);

$styleTable = array(‘borderColor’=>‘006699’,‘borderSize’=>6, ‘cellMarginTop’=>100);
$styleFirstRow = array(‘bgColor’=>’#FFFFFF ');
$PHPWord->addTableStyle(‘myTable2’, $styleTable, $styleFirstRow);

$table = $section->addTable(‘myTable2’);
$table->addRow(500);
$table->addCell(20000)->addText(’ ', $fontStyle, $paraStyle);

$section->addText(" “);
$section->addText(” ");
// report footer
$paraStyle = array(‘align’ => ‘center’);
$testVariable = 'Ribeira Brava, ';
$xdata=date(‘d-m-Y’);
$section->addText( $testVariable.$xdata, null, $paraStyle );

// After creating a section, you can append elements:
$fontStyle = array (‘bold’ => false);
$paraStyle = array (‘align’ => ‘center’);
$section->addText( ‘A Assistente Social,’, $fontStyle, $paraStyle );
$section->addText(" ");

$section->addText( ‘_______________________’, $fontStyle, $paraStyle );
$section->addText( ‘(Ana Nunes)’, $fontStyle, $paraStyle );

// At least write the document to webspace:
$objWriter = PHPWord_IOFactory::createWriter($PHPWord, ‘Word2007’);
$objWriter->save(’…/documentos_word/Relatorio.doc’);

// ABrir o DOCUMENTO
header(“Location: http://www.???/???/documentos_word/Relatorio.doc”);

2 Curtidas

Excelente Herberto!!!

Muito bom, parabéns.

Show di bola!!

Muito legal Herberto. Eu estava procurando por isto a um tempinho. Vai ajudar um bocado.

Herberto,

Uma dica dessas não pode se perder por aí não… coloca lá no site (www.auscriptcase.com.br)

Parabéns!!!

Para os mais distraídos… já se encontra no www.auscriptcase.com.br, DICAS, incluindo o resultado do relatório, apesar da formatação dos paragrafos não estar correcto, mas dá para ter uma ideia.

O Jovito ele postou lá antes de postar aqui, vi ontem o post dele. E aí a associação vai virar ou não!!?

Herberto,

Existe um botão [ENVIAR EMAIL] na barra de ferramentas de cada form… ao postar, clica lá pra todo mundo ficar sabendo.

[]´s

Já se passaram alguns anos que esse topico foi criado. Aconteceu alguma evolução na forma de exportar relatorios para o WORD no scriptcase ? Existe alguma ferramenta para visualizar o layout durante o desenvolvimento?

Sim, cria o seu documento no Word grava o arquivo como .rtf coloca os campos onde vão fazer substituição como xNomex, xCodigoClientex, ai abre ester arquivo .rtf com o fopen do php faz a substituição dos xCamposx pelo valor
desejado e grava a cópia do documento, pronto você tem arquivo do Word desejado.

O RTF, acrônimo de Rich Text Format ou Formato Rico de Texto, é um formato de arquivo de documento desenvolvido e de propriedade da Microsoft desde 1987 para intercâmbio de documentos entre diversas plataformas.
https://pt.wikipedia.org/wiki/Rich_Text_Format

Meus emails também faço assim, gero o html normalizo ele padrão w3c e depois só faço substituição, isso a anos.

Então você manda apenas substituir as palavras no arquivo rtf pelo valor das variáveis pesquisadas no banco ?
Teria como mandar um exemplo dessa manipulação de abertura de arquivo e substituição dos valores dos campos?

Oi Jailton, faço meu o pedido do tamnet.

Então você manda apenas substituir as palavras no arquivo rtf pelo valor das variáveis pesquisadas no banco ?
Teria como mandar um exemplo dessa manipulação de abertura de arquivo e substituição dos valores dos campos?

Compartilha aí irmão… Te agradeço muito!

Jailton,

Boa dica, o documento word pode conter imagens?

Obrigado

Sim normal um RTF tem tudo que se quiser.

Quero agradecer ao colega Jailton pelas dicas, sem sua ajuda não teria conseguido criar o script para gerar o arquivo ‘rtf’ e abri-lo com o Word.

Muito obrigado.

Olá poderiam enviar os exemplos para criar o doc word e preencher os dados rtf

Bom dia,

Crie o arquivo Word conforme sua necessidade;

Nomeie os campos que vão receber valor, estou utilizando cab01, cab02, campo01, campo02, etc…;

Salve o arquivo Word como .rtf 'Rich Text Format ';

Estou salvando na pasta ‘tamplates’ criada dentro do diretório _lib do sistema.

O código: - Parte do código é inerente a minha aplicação

// PA
$pa_numero = ‘Processo administrativo n° ‘.substr({documento_seq}, 0, -4).’/’.substr({documento_seq}, -4);

// FORMATAR A DATA
switch (date(“m”)) {
case “01”: $vmes = ‘Janeiro’; break;
case “02”: $vmes = ‘Fevereiro’; break;
case “03”: $vmes = ‘Março’; break;
case “04”: $vmes = ‘Abril’; break;
case “05”: $vmes = ‘Maio’; break;
case “06”: $vmes = ‘Junho’; break;
case “07”: $vmes = ‘Julho’; break;
case “08”: $vmes = ‘Agosto’; break;
case “09”: $vmes = ‘Setembro’; break;
case “10”: $vmes = ‘Outubro’; break;
case “11”: $vmes = ‘Novembro’; break;
case “12”: $vmes = ‘Dezembro’; break;
}

$vdata = 'Recife, ‘. date(“d”).’ de ‘.$vmes.’ de '.date(“Y”);

sc_lookup(ds_tipo, “select tipo
from doc_tipos
where tipo_id = ‘{tipo_id}’”);
$vtipo = {ds_tipo[0][0]};
$vtipo = trim($vtipo);

$vdocumento = $vtipo.’ n° ‘.substr({documento_numero}, 0, -4).’/’.substr({documento_numero}, -4);
$vassunto = 'Assunto: '.{assunto};

// INICIO FORMATA WORD
$arquivo = “…/_lib/templates/layout_documentos.rtf”;

$arq = fopen($arquivo,‘r’);

// LER O ARQUIVO
$mensagem = fread($arq, filesize($arquivo));

// FECHA O ARQUIVO
fclose($arq);

// VALORES DOS CAMPOS
$mensagem = str_replace(‘cab01’, $pa_numero, $mensagem);
$mensagem = str_replace(‘campo01’, $vdata, $mensagem);
$mensagem = str_replace(‘campo02’, $vdocumento, $mensagem);

if({requer} == ‘3’){
$mensagem = str_replace(‘campo03’, $vassunto, $mensagem);
$mensagem = str_replace(‘campo04’, 'Destinatário: ', $mensagem);
}elseif({requer} == ‘1’){
$mensagem = str_replace(‘campo03’, $vassunto, $mensagem);
$mensagem = str_replace(‘campo04’, ‘’, $mensagem);
}elseif({requer} == ‘2’){
$mensagem = str_replace(‘campo03’, 'Destinatário: ', $mensagem);
$mensagem = str_replace(‘campo04’, ‘’, $mensagem);
}else{
$mensagem = str_replace(‘campo03’, ‘’, $mensagem);
$mensagem = str_replace(‘campo04’, ‘’, $mensagem);
}

$mensagem = str_replace(‘campo05’, [var_usuario_nome], $mensagem);

// SALVA ARQUIVO
$vtipo = strtr($vtipo, “áàãâéêíóôõúüçÁÀÃÂÉÊÍÓÔÕÚÜÇ”, “aaaaeeiooouucAAAAEEIOOOUUC”);
$vtipo = strtolower($vtipo);
$vtipo = str_replace(’ ‘, ‘_’, $vtipo);
$vtipo = $vtipo.’.rtf’;

$arquivo = “…/_lib/templates/”.$vtipo;

$fp = fopen($arquivo, ‘w’);
fwrite($fp, $mensagem);
fclose($fp);

// DIRECIONA
sc_redir(doc_word_exibir_cons, vcaminho=$arquivo; vdocumento={documento_id});

Redireciono para uma aplicação consulta que exibe o link para o arquivo.

No evento onRecord da consulta:

$caminho_fil = [vcaminho];
{word} = “”;

É imprescindível configurar a máquina do cliente para abrir arquivos rtf com o Word.

Obrigado!.. vou testar

Muito bom, George e Jailton. Vou guardar estas dicas aqui também.