Autor Tópico: PHP+MYSQL para o MS-WORD com PHPWord  (Lida 5689 vezes)

Herberto Silva

  • Avançado
  • ****
  • Mensagens: 334
  • Programador Freelancer
    • Desenvolvimento de Software
    • Email
PHP+MYSQL para o MS-WORD com PHPWord
« Online: Maio 10, 2012, 06:12:49 am »
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");

Cumprimentos,
Herberto Silva
herberto.silva@sapo.pt
skype: herbertobfsilva
www.software-global.info

Cleyton Euler

  • Expert
  • *****
  • Mensagens: 1149
    • Associação de Usuários Scriptcase
    • Email
Re:PHP+MYSQL para o MS-WORD com PHPWord
« Responder #1 Online: Maio 10, 2012, 09:20:36 am »
Excelente Herberto!!!
Associação de Usuários Scriptcase
http://www.auscriptcase.com.br

Consultoria Scriptcase Versão 5
http://www.infinitusweb.com.br

George Carvalho

  • Expert
  • *****
  • Mensagens: 1371
    • Email
Re:PHP+MYSQL para o MS-WORD com PHPWord
« Responder #2 Online: Maio 10, 2012, 09:27:28 am »
Muito bom, parabéns.
George Carvalho
Porto de Galinhas/PE

saulobborges

  • Expert
  • *****
  • Mensagens: 1392
    • SGi Sistemas
    • Email
Re:PHP+MYSQL para o MS-WORD com PHPWord
« Responder #3 Online: Maio 10, 2012, 10:39:53 am »
Show di bola!!

Kleyber

  • Expert
  • *****
  • Mensagens: 2237
    • Email
Re:PHP+MYSQL para o MS-WORD com PHPWord
« Responder #4 Online: Maio 10, 2012, 10:45:57 am »
Muito legal Herberto. Eu estava procurando por isto a um tempinho. Vai ajudar um bocado.
Kleyber Derick

ITIL® V3 Foundation Certified
Analista de Sistemas
São Luís - Maranhão
www.tkinformidia.net

jovitomelo

  • Global Moderator
  • Expert
  • *****
  • Mensagens: 916
    • Simples Assim
    • Email
Re:PHP+MYSQL para o MS-WORD com PHPWord
« Responder #5 Online: Maio 10, 2012, 12:00:33 pm »
Herberto,

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

Parabéns!!!!!!!!!!
Jovito Melo
Maceió - Alagoas

Herberto Silva

  • Avançado
  • ****
  • Mensagens: 334
  • Programador Freelancer
    • Desenvolvimento de Software
    • Email
Re:PHP+MYSQL para o MS-WORD com PHPWord
« Responder #6 Online: Maio 10, 2012, 03:11:58 pm »
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.
Cumprimentos,
Herberto Silva
herberto.silva@sapo.pt
skype: herbertobfsilva
www.software-global.info

saulobborges

  • Expert
  • *****
  • Mensagens: 1392
    • SGi Sistemas
    • Email
Re:PHP+MYSQL para o MS-WORD com PHPWord
« Responder #7 Online: Maio 10, 2012, 03:38:42 pm »
Herberto,

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

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

jovitomelo

  • Global Moderator
  • Expert
  • *****
  • Mensagens: 916
    • Simples Assim
    • Email
Re:PHP+MYSQL para o MS-WORD com PHPWord
« Responder #8 Online: Maio 10, 2012, 04:01:09 pm »
Herberto,

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

[]´s
Jovito Melo
Maceió - Alagoas

tamnet

  • Novato
  • *
  • Mensagens: 37
Re:PHP+MYSQL para o MS-WORD com PHPWord
« Responder #9 Online: Outubro 13, 2015, 02:53:16 pm »
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?

Jailton

  • Expert
  • *****
  • Mensagens: 2038
Re:PHP+MYSQL para o MS-WORD com PHPWord
« Responder #10 Online: Outubro 13, 2015, 06:57:48 pm »
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.
O Princípio da Vibração. "Nada está parado, tudo se move, tudo vibra". Caibalion.

tamnet

  • Novato
  • *
  • Mensagens: 37
Re:PHP+MYSQL para o MS-WORD com PHPWord
« Responder #11 Online: Outubro 14, 2015, 10:21:13 am »
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?

Edi

  • Novato
  • *
  • Mensagens: 35
    • Email
Re:PHP+MYSQL para o MS-WORD com PHPWord
« Responder #12 Online: Outubro 14, 2015, 11:36:08 am »
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!

George Carvalho

  • Expert
  • *****
  • Mensagens: 1371
    • Email
Re:PHP+MYSQL para o MS-WORD com PHPWord
« Responder #13 Online: Novembro 05, 2015, 08:22:54 am »
Jailton,

Boa dica, o documento word pode conter imagens?

Obrigado
George Carvalho
Porto de Galinhas/PE

Jailton

  • Expert
  • *****
  • Mensagens: 2038
Re:PHP+MYSQL para o MS-WORD com PHPWord
« Responder #14 Online: Novembro 05, 2015, 09:36:21 am »
Jailton,

Boa dica, o documento word pode conter imagens?

Obrigado

Sim normal um RTF tem tudo que se quiser.
O Princípio da Vibração. "Nada está parado, tudo se move, tudo vibra". Caibalion.