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”);

3 Curtidas

Excelente Herberto!!!

1 Curtida

Muito bom, parabéns.

1 Curtida

Show di bola!!

1 Curtida

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

1 Curtida

Herberto,

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

Parabéns!!!

1 Curtida

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.

1 Curtida

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

1 Curtida

Herberto,

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

[]´s

1 Curtida

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?

1 Curtida

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.

1 Curtida

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?

1 Curtida

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!

1 Curtida

Jailton,

Boa dica, o documento word pode conter imagens?

Obrigado

1 Curtida

Sim normal um RTF tem tudo que se quiser.

1 Curtida

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.

1 Curtida

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

1 Curtida

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.

1 Curtida

Obrigado!.. vou testar

1 Curtida

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

1 Curtida