Roteiro
●

Introdução
–

Apresentação;

–

Bibliotecas para relatórios:
●

–

Bibliotecas para gráficos:
●

–

JPGraph, pChart;

Desacoplamento:
●

–

XLS, PDF, RTF;

A importância de desacoplar;

Implementação:
●

Strategy para relatórios;

●

Bridge para gráficos.

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#2
Apresentação
●

Clipper (1994-1998): comercial, bibliotecas, funções;

●

Delphi (1998-1999): automação, componentes;

●

PHP (2000): SAGU (php+html+sql)

●

PHP-GTK(2001): PHP só com classes;

●

Agata Report (2001-2006);

●

Design Patterns (2004): Aprendizado na Unisinos;

●

PHP: Criando Aplicações Gráficas com PHP (2004);

●

PHP: Programando com Orientação a Objetos (2007);

●

Criando Relatórios com PHP (2011);

●

Adianti Framework para PHP (2012).
Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#3
Objetivo
●

O que não queremos:
–
–

●

Não queremos mini-curso de geração de relatórios;
Provavelmente a maioria já conhece bem uma
biblioteca;

O que queremos:
–

Explorar várias bibliotecas e suas principais
características;

–

Analisar boas formas de integrá-las em nossa aplicação;

–

Estudar padrões de projeto que podem ser utilizados
para isso.

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#4
Bibliotecas para relatórios
Relatórios em XLS
●

Bom para:
–
–

●

Relatórios tabulares (linhas, colunas);
Permite formatações, totalizações.

Spreadsheet Writer (304 Kb):
–
–

Pequeno, funciona bem, mas sem novos releases;

–
●

http://pear.php.net/package/Spreadsheet_Excel_Writer
Depende do pacote OLE, não gera XLSX (só XLS - BIFF).

PHPExcel (4.3 Mb):
–

http://phpexcel.codeplex.com

–

Bastante ativo, maior, com muitas funcionalidades;

–

Trabalha com Open XML (XLSX).

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#6
Relatórios em XLS
<?php
require_once 'Spreadsheet/Excel/Writer.php';
$workbook = new Spreadsheet_Excel_Writer('test.xls');
// Cria uma planilha
$worksheet = $workbook->addWorksheet('My first worksheet');
// escreve os dados
$worksheet->write(0,
$worksheet->write(0,
$worksheet->write(1,
$worksheet->write(1,
$worksheet->write(2,
$worksheet->write(2,
$worksheet->write(3,
$worksheet->write(3,

0,
1,
0,
1,
0,
1,
0,
1,

'Nome');
'Idade');
'Maria');
30);
'Joao');
31);
'Mariana');
32);

// Finaliza, gravando
$workbook->close();
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#7
Relatórios em XLS
<?php
require_once 'Spreadsheet/Excel/Writer.php';
$workbook = new Spreadsheet_Excel_Writer('test2.xls');
$formato_bold = $workbook->addFormat();
$formato_bold->setBold();
$formato_title = $workbook->addFormat();
$formato_title->setBold();
$formato_title->setColor('white');
$formato_title->setPattern(1);
$formato_title->setFgColor('gray');
$worksheet = $workbook->addWorksheet();
$worksheet->write(0, 0, "Titulo",
$formato_title);
$worksheet->write(1, 0, "Coluna 1", $formato_bold);
$worksheet->write(1, 1, "Coluna 2", $formato_bold);
$workbook->close();
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#8
Relatórios em PDF
●

Bom para:
–
–

Documentos (NFE, atestados, diplomas);

–
●

Quase qualquer coisa, relatórios tabulares;
Posicionamento fixo dos objetos.

FPDF (46k fpdf.php):
–

●

TCPDF (864k tcpdf.php):
–

●

http://www.fpdf.org (Bom, pequena, mas não ativa);
http://www.tcpdf.org/ (Ativa, Grande, milhões de
funcionalidades, baseada na FPDF, chars, codabar, forms);

MPDF (1.3 Mb mpdf.php):
–

http://www.mpdf1.com/ (Ativa, Grande, Gera PDF baseado
em HTML, boa com tables e formatações, FPDF based);

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#9
Relatórios em PDF
<?php
require('fpdf/fpdf.php');
$pdf = new FPDF('P', 'pt', 'A4');
$pdf->AddPage();
$pdf->SetFont('Courier', 'B', 16);
$pdf->SetTextColor(50, 50, 100);
$pdf->SetY(70);
$pdf->SetX(260);
// não desloca o cursor
$pdf->Write(30, 'Titulo');
$pdf->Ln(30); // Espaçamento
$txt = str_repeat('write ', 30);
$pdf->SetX(200);
// altera a posição X
$pdf->SetTextColor(100, 50, 50); // tom de vermelho
$pdf->SetFont('Times', 'B', 14);
$pdf->Write(20, $txt);
$pdf->Output('test.pdf');
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#10
Relatórios em PDF
<?php
require('fpdf/fpdf.php');
$pdf = new FPDF('P', 'pt', 'A4');
$pdf->AddPage();
$pdf->SetFont('Arial','B',16);
$pdf->Cell(510, 20, 'Titulo com borda', 1, 1, 'C');
$pdf->Ln(20);
$pdf->SetFillColor(255,120,120);
$pdf->Cell(170, 30,'Alinhado a esquerda', 1, 0, 'L', TRUE);
$pdf->SetFillColor(170,255,120);
$pdf->Cell(170, 30,'Alinhado ao centro', 1, 0, 'C', TRUE);
$pdf->SetFillColor(100,100,255);
$pdf->Cell(170, 30,'Alinhado a direita', 1, 1, 'R', TRUE);
$pdf->Output('test2.pdf');
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#11
Relatórios em RTF
●

Bom para:
–
–

Documentos editáveis (contratos, cartas);

–

Trabalha com escrita de elementos de texto e tabelas;

–
●

Relatórios tabulares;

Abre bem no Word e LibreOffice.

PhpRtfLite(372 Kb):
–

sf.net/projects/phprtf/

–

Pequeno;

–

Funciona bem;

–

Ativa.

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#12
Relatórios em RTF
<?php
require 'PHPRtfLite/lib/PHPRtfLite.php';
PHPRtfLite::registerAutoloader();
$rtf = new PHPRtfLite;
$secao = $rtf->addSection(); // adiciona seção
$fontTitulo = new PHPRtfLite_Font(16, 'Arial');
$fontTitulo->setBold();
$fontTitulo->setUnderline();
$secao->writeText('Título', $fontTitulo,
new PHPRtfLite_ParFormat('center'));

$texto = 'Texto c/<b>negrito</b>,<i>italico</i>, <u>sublinhado</u>. ';
$secao->writeText(str_repeat($texto, 12),
new PHPRtfLite_Font(12),
new PHPRtfLite_ParFormat('justify'));
$rtf->save('test.rtf');
?>
Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#13
Relatórios em RTF

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#14
Relatórios em RTF
<?php
require '...';
$dados
= array();
$dados[] = array( 1, 'Brazil', 'Ayrton Senna', 90);
$dados[] = array( 2, 'France', 'Alain Prost', 87);
// ...
$rtf = new PHPRtfLite;
$table = $rtf->addSection()->addTable();
$table->addColumn(3); // larguras
$table->addColumn(5);
// ...
$row = 1;
foreach($dados as $linha) {
$table->addRow(0.5); $col = 1;
foreach ($linha as $coluna) {
$table->writeToCell($row, $col, $coluna, $fonte, ...);
$col++;
}
$row ++;
}
$rtf->save('test2.rtf');
?>
Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#15
Relatórios em RTF

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#16
Bibliotecas para gráficos
Gráficos
●

Algumas opções:
–

JpGraph (http://jpgraph.net/) - não ativa;
●

●

–

325Kb para gráfico de linhas, barras e pizza;
Interface das classes mais clean;

PChart (http://www.pchart.net/) - não ativa;
●

692Kb no total.

●

Interface mais fragmentada, gráficos mais bonitos;

●

Geração em formato de imagem em desuso (HTML5, canvas);

●

Outras opções:
–

Highcharts (http://www.highcharts.com/);

–

PHPChart (http://phpchart.net/).

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#18
Gráficos com jpGraph
<?php
require_once ('jpgraph/src/jpgraph.php');
require_once ('jpgraph/src/jpgraph_line.php');
$dados = array(100, 300, 200, 500, 200, 400, 300);
$graph = new Graph(400,250);
$graph->SetScale('textlin');
$graph->SetMargin(40,20,40,40);
$graph->title->Set('Título do gráfico');
// Cria uma plotagem linear
$lineplot = new LinePlot($dados);
$lineplot->SetColor( 'maroon' );
$lineplot->SetWeight( 2 ); // espessura
$lineplot->mark->SetType(MARK_FILLEDCIRCLE);
$lineplot->mark->SetColor('blue');
$lineplot->mark->SetFillColor('red');
$lineplot->value->Show();
$graph->Add($lineplot); // adiciona a plotagem
$graph->Stroke('j1.png');
?>
Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#19
Gráficos com jpGraph
<?php
require_once ('jpgraph/src/jpgraph.php');
require_once ('jpgraph/src/jpgraph_bar.php');
$dados = array(120,80,170,40,100);
$graph = new Graph(400,250);
$graph->SetScale("textlin");
$graph->SetMargin(40,20,40,40);
$graph->title->Set('Vendas por mes');
$barplot = new BarPlot($dados);
$barplot->SetFillColor('orange');
$barplot->value->Show();
$barplot->value->SetColor("blue");
$graph->Add($barplot);
$graph->Stroke('j2.png');
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#20
Gráficos com pChart
<?php
include 'pChart/class/pData.class.php';
// + pDraw e pImage
$dados = new pData;
$dados->addPoints(array(23, 21, 14, 12, 8, 6),'Chile');
$dados->addPoints(array( 4, 10, 12, 14, 20, 23),'Canadá');
$dados->addPoints(array('Janeiro','Fevereiro','Março',...);
$dados->setAbscissa('Meses');
$imagem = new pImage(700, 330, $dados); // borda
$imagem->drawRectangle(0, 0, 699, 329,array('R'=>0,'G'=>0,'B'=>0));
$imagem->setFontProperties(array('FontName'=>'verdana',...));
$imagem->setGraphArea(60,40,650,280);
$scaleSettings = array('XMargin'=>10,'YMargin'=>10);
$imagem->drawScale($scaleSettings); // escala
$imagem->drawLineChart(array('DisplayValues'=>TRUE));
$imagem->render('c1.png');
?>
Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#21
Gráficos com pChart

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#22
Evolução
●

As bibliotecas evoluem constantemente;

●

Novas tecnologias surgem;

●

Nosso código não deve referenciar a biblioteca utilizada;

●

Devemos separar nosso código do código de terceiros;

●

Isso tudo, para facilitar o reuso e a evolução.

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#23
Acoplamento
Acoplamento
●

●

●

O acoplamento é quanto
um módulo (classe,
método) conhece e
depende de outro;
O objetivo é criar modelos
com baixo acoplamento;
O alto acoplamento
diminui a reusabilidade de
objetos porque objetos
não podem ser usados
sozinhos.

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#25
Acoplamento
●

É impossível criar um sistema com 0% de acoplamento.

●

Uma classe com BAIXO acoplamento:
–
–

●

Não depende de muitas outras e facilita a manutenção;
Evita que as modificações produzam efeitos colaterais;

Uma classe com ALTO acoplamento:
–

É menos inteligível isoladamente e menos reutilizável;

–

É mais sensível a mudanças nas classes da qual ela
depende.

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#26
Acoplamento
●

Acoplamento concreto:
–

RelatorioControl e FPDF estão fortemente acopladas;

–

RelatorioControl conhece muito sobre FPDF.

<?php
class RelatorioControl
{
public function onGenerate()
{
$pdf = new FPDF('P', 'pt', 'A4');
$pdf->AddPage();
$pdf->SetFont('Courier', 'B', 16);
$pdf->SetTextColor(50, 50, 100);
$pdf->SetY(70);
$pdf->SetX(260);
$pdf->Write(30, 'Titulo');
$pdf->Output('test.pdf');
}
}
?>
Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#27
Acoplamento
●

●

●

●

●

Mas existem outra formas de dependências...
O objeto A envie uma mensagem para o objeto B sem ter
conhecimento da verdadeira classe desse último;
Essa forma de dependência corresponde ao que
chamamos de acoplamento abstrato;
A acoplamento abstrato é preferível ao concreto.
Classes abstratas e interfaces permitem implementar o
acoplamento abstrato.

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#28
Acoplamento
Realização
<?php
interface IGenerator
{
function addPage();
function setFontColor($color);
function writeText($height, $text);
function setFontFace($font, $style, $size);
function saveFile($path);
}
class PDFGenerator implements IGenerator
{
//...
}
class RTFGenerator implements IGenerator
{
//...
}
?>
Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#29
Acoplamento
Uso
<?php
class RelatorioControl
{
public function onGenerate(IGenerator $gen)
{
$gen->addPage();
$gen->setFontFace('Courier', 'B', 16);
$gen->setFontColor('#FF0000');
$gen->writeText(30, 'Titulo');
$gen->saveFile('test.pdf');
}
}
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#30
Acoplamento
●

●

Uma forma de diminuir o acoplamento é criando um
facade;
Oferece uma interface única para um conjunto de
interfaces de um subsistema.

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#31
Acoplamento
<?php
class GraficoLinhas
{
public function __construct()
{
include 'class/pData.class.php';
include 'class/pImage.class.php';
}

Mas e se quiséssemos
Tornar a biblioteca
Intercambiável?

public function addSerie($legend, $data)
…
public function setTitle($title, $font)
…
public function draw()
…
}
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#32
Implementações
Implementações
●

As interfaces das bibliotecas:
– PDF;
–
–

●

RTF;
HTML.

São muito diferentes entre si:
–

RTF é texto fluído;

–

PDF é por posicionamento fixo;

–

HTML é por marcação.

●

Para usar todas elas de maneira intercalada...

●

É necessário criar uma camada de compatibilização.

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#34
Strategy
●

Permite a seleção de algoritmos durante a execução do sw;

●

Fornece um meio de declarar uma família de algoritmos;

●

●

Permite encapsular estes algoritmos como um objeto, e
torná-los intercambiáveis;
Evita-se a criação de mega-classes com N métodos.

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#35
Table Writer's
●

Escritor de relatórios definido pela classe da esquerda;

contexto

Adianti Solutions Ltda © Pablo Dall'Oglio

implementação

Criando Relatórios com PHP

#36
Table Writer's
<?php
// inclui as bibliotecas...
require_once 'app.reports/ITableWriter.iface.php';
$widths = array(70, 150, 150, 100);
$tr = new TTableWriterPDF($widths);
$tr->addStyle('title', 'Arial', '10', 'B', '#ffffff', '#737373');
$tr->addStyle('data', 'Arial', '10', '', '#000000', '#ffffff');
$tr->addRow();
$tr->addCell('Código', 'left', 'title');
$tr->addCell('Nome',
'left', 'title');
$tr->addRow();
$tr->addCell('001',
'left',
$tr->addCell('Ayrton Senna da Silva', 'left',

'data');
'data');

$tr->addRow();
// ...
$tr->save("saida1.pdf"); // salva
?>
Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#37
Table Writer's
<?php
require_once 'app.reports/ITableWriter.iface.php';
// ...

Implementação

$widths = array(70, 150, 150, 100);
$tr = new TTableWriterPDF($widths);
// cria os estilos
$tr->addStyle('title', 'Arial', '12', 'B', '#ffffff', '#733131');
// atribui o escritor ao relatório
$sr = new TSimpleReport;
$sr->setReportWritter($tr);

Contexto

// adiciona as colunas do relatório
$sr->addColumn('id',
'Código', 'center');
$sr->addColumn('nome',
'Nome',
'left');
// define o banco de dados e a consulta
$sr->setDatabase('exemplos');
$sr->setQuery('SELECT id, nome, telefone, endereco from ...');
$sr->generate(); // gera o relatório
$sr->save('saida4.pdf');
?>
Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#38
Bridge
●

Separa uma abstração de sua implementação;

●

As duas podem variar de maneira independente;

●

Usa encapsulamento, agregação e herança para separar
responsabilidades.

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#39
Jeito tosco
●

Proliferação de níveis. Estrutura não-flexível;

●

Alto grau de acoplamento. O cliente especifica a classe;

●

Quantas novas classes para novo tipo de gráfico (gauge)?

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#40
Bridge
<?php
require_once 'app.reports/TChart.class.php';
require_once 'app.reports/TBarChart.class.php';
require_once 'app.reports/TPieChart.class.php';
// ...
$data['maria'] = array( 1, 2, 3, 4, 5, 6, 7);
$data['pedro'] = array(12, 3, 12, 4, 12, 4, 2);
$data['joao'] = array( 9, 8, 7, 6, 5, 4, 3);
$chart = new TBarChart(new TPChartDesigner);
$chart->setTitle('Título do gráfico', NULL, NULL);
$chart->setSize(500, 300);
$chart->setXLabels(array('a', 'b', 'c', 'd', 'e', 'f', 'g'));
$chart->setYLabel('label do eixo Y');
$chart->setOutputPath('tmp/teste.png');
$chart->addData('maria', $data['maria']);
$chart->addData('pedro', $data['pedro']);
$chart->addData('joao', $data['joao']);
$chart->generate();
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#42
Bridge
<?php
require_once 'app.reports/TChart.class.php';
require_once 'app.reports/TBarChart.class.php';
require_once 'app.reports/TPieChart.class.php';
// ...
// cria um gráfico de pizza usando a JPGraph
$chart = new TPieChart(new TJPGraphDesigner);
$chart->setTitle('Título do gráfico', NULL, NULL);
$chart->setSize(500, 300);
$chart->setOutputPath('tmp/teste2.png');
$chart->addData('maria', 40);
$chart->addData('pedro', 30);
$chart->addData('joao', 30);
$chart->generate();
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#43
Obrigado
●

Livro
–

●

Adianti Framework:
–

●

www.adianti.com.br/bkrpt
www.adianti.com.br/framework

Contato:
–

–

@pablodalloglio

–
●

www.dalloglio.net

fb.com/pablodalloglio

Não esquecer de falar do Sorteio!

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#44

Criando relatórios com PHP - PHP Conference Brasil 2013

  • 2.
    Roteiro ● Introdução – Apresentação; – Bibliotecas para relatórios: ● – Bibliotecaspara gráficos: ● – JPGraph, pChart; Desacoplamento: ● – XLS, PDF, RTF; A importância de desacoplar; Implementação: ● Strategy para relatórios; ● Bridge para gráficos. Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #2
  • 3.
    Apresentação ● Clipper (1994-1998): comercial,bibliotecas, funções; ● Delphi (1998-1999): automação, componentes; ● PHP (2000): SAGU (php+html+sql) ● PHP-GTK(2001): PHP só com classes; ● Agata Report (2001-2006); ● Design Patterns (2004): Aprendizado na Unisinos; ● PHP: Criando Aplicações Gráficas com PHP (2004); ● PHP: Programando com Orientação a Objetos (2007); ● Criando Relatórios com PHP (2011); ● Adianti Framework para PHP (2012). Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #3
  • 4.
    Objetivo ● O que nãoqueremos: – – ● Não queremos mini-curso de geração de relatórios; Provavelmente a maioria já conhece bem uma biblioteca; O que queremos: – Explorar várias bibliotecas e suas principais características; – Analisar boas formas de integrá-las em nossa aplicação; – Estudar padrões de projeto que podem ser utilizados para isso. Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #4
  • 5.
  • 6.
    Relatórios em XLS ● Bompara: – – ● Relatórios tabulares (linhas, colunas); Permite formatações, totalizações. Spreadsheet Writer (304 Kb): – – Pequeno, funciona bem, mas sem novos releases; – ● http://pear.php.net/package/Spreadsheet_Excel_Writer Depende do pacote OLE, não gera XLSX (só XLS - BIFF). PHPExcel (4.3 Mb): – http://phpexcel.codeplex.com – Bastante ativo, maior, com muitas funcionalidades; – Trabalha com Open XML (XLSX). Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #6
  • 7.
    Relatórios em XLS <?php require_once'Spreadsheet/Excel/Writer.php'; $workbook = new Spreadsheet_Excel_Writer('test.xls'); // Cria uma planilha $worksheet = $workbook->addWorksheet('My first worksheet'); // escreve os dados $worksheet->write(0, $worksheet->write(0, $worksheet->write(1, $worksheet->write(1, $worksheet->write(2, $worksheet->write(2, $worksheet->write(3, $worksheet->write(3, 0, 1, 0, 1, 0, 1, 0, 1, 'Nome'); 'Idade'); 'Maria'); 30); 'Joao'); 31); 'Mariana'); 32); // Finaliza, gravando $workbook->close(); ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #7
  • 8.
    Relatórios em XLS <?php require_once'Spreadsheet/Excel/Writer.php'; $workbook = new Spreadsheet_Excel_Writer('test2.xls'); $formato_bold = $workbook->addFormat(); $formato_bold->setBold(); $formato_title = $workbook->addFormat(); $formato_title->setBold(); $formato_title->setColor('white'); $formato_title->setPattern(1); $formato_title->setFgColor('gray'); $worksheet = $workbook->addWorksheet(); $worksheet->write(0, 0, "Titulo", $formato_title); $worksheet->write(1, 0, "Coluna 1", $formato_bold); $worksheet->write(1, 1, "Coluna 2", $formato_bold); $workbook->close(); ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #8
  • 9.
    Relatórios em PDF ● Bompara: – – Documentos (NFE, atestados, diplomas); – ● Quase qualquer coisa, relatórios tabulares; Posicionamento fixo dos objetos. FPDF (46k fpdf.php): – ● TCPDF (864k tcpdf.php): – ● http://www.fpdf.org (Bom, pequena, mas não ativa); http://www.tcpdf.org/ (Ativa, Grande, milhões de funcionalidades, baseada na FPDF, chars, codabar, forms); MPDF (1.3 Mb mpdf.php): – http://www.mpdf1.com/ (Ativa, Grande, Gera PDF baseado em HTML, boa com tables e formatações, FPDF based); Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #9
  • 10.
    Relatórios em PDF <?php require('fpdf/fpdf.php'); $pdf= new FPDF('P', 'pt', 'A4'); $pdf->AddPage(); $pdf->SetFont('Courier', 'B', 16); $pdf->SetTextColor(50, 50, 100); $pdf->SetY(70); $pdf->SetX(260); // não desloca o cursor $pdf->Write(30, 'Titulo'); $pdf->Ln(30); // Espaçamento $txt = str_repeat('write ', 30); $pdf->SetX(200); // altera a posição X $pdf->SetTextColor(100, 50, 50); // tom de vermelho $pdf->SetFont('Times', 'B', 14); $pdf->Write(20, $txt); $pdf->Output('test.pdf'); ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #10
  • 11.
    Relatórios em PDF <?php require('fpdf/fpdf.php'); $pdf= new FPDF('P', 'pt', 'A4'); $pdf->AddPage(); $pdf->SetFont('Arial','B',16); $pdf->Cell(510, 20, 'Titulo com borda', 1, 1, 'C'); $pdf->Ln(20); $pdf->SetFillColor(255,120,120); $pdf->Cell(170, 30,'Alinhado a esquerda', 1, 0, 'L', TRUE); $pdf->SetFillColor(170,255,120); $pdf->Cell(170, 30,'Alinhado ao centro', 1, 0, 'C', TRUE); $pdf->SetFillColor(100,100,255); $pdf->Cell(170, 30,'Alinhado a direita', 1, 1, 'R', TRUE); $pdf->Output('test2.pdf'); ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #11
  • 12.
    Relatórios em RTF ● Bompara: – – Documentos editáveis (contratos, cartas); – Trabalha com escrita de elementos de texto e tabelas; – ● Relatórios tabulares; Abre bem no Word e LibreOffice. PhpRtfLite(372 Kb): – sf.net/projects/phprtf/ – Pequeno; – Funciona bem; – Ativa. Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #12
  • 13.
    Relatórios em RTF <?php require'PHPRtfLite/lib/PHPRtfLite.php'; PHPRtfLite::registerAutoloader(); $rtf = new PHPRtfLite; $secao = $rtf->addSection(); // adiciona seção $fontTitulo = new PHPRtfLite_Font(16, 'Arial'); $fontTitulo->setBold(); $fontTitulo->setUnderline(); $secao->writeText('Título', $fontTitulo, new PHPRtfLite_ParFormat('center')); $texto = 'Texto c/<b>negrito</b>,<i>italico</i>, <u>sublinhado</u>. '; $secao->writeText(str_repeat($texto, 12), new PHPRtfLite_Font(12), new PHPRtfLite_ParFormat('justify')); $rtf->save('test.rtf'); ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #13
  • 14.
    Relatórios em RTF AdiantiSolutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #14
  • 15.
    Relatórios em RTF <?php require'...'; $dados = array(); $dados[] = array( 1, 'Brazil', 'Ayrton Senna', 90); $dados[] = array( 2, 'France', 'Alain Prost', 87); // ... $rtf = new PHPRtfLite; $table = $rtf->addSection()->addTable(); $table->addColumn(3); // larguras $table->addColumn(5); // ... $row = 1; foreach($dados as $linha) { $table->addRow(0.5); $col = 1; foreach ($linha as $coluna) { $table->writeToCell($row, $col, $coluna, $fonte, ...); $col++; } $row ++; } $rtf->save('test2.rtf'); ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #15
  • 16.
    Relatórios em RTF AdiantiSolutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #16
  • 17.
  • 18.
    Gráficos ● Algumas opções: – JpGraph (http://jpgraph.net/)- não ativa; ● ● – 325Kb para gráfico de linhas, barras e pizza; Interface das classes mais clean; PChart (http://www.pchart.net/) - não ativa; ● 692Kb no total. ● Interface mais fragmentada, gráficos mais bonitos; ● Geração em formato de imagem em desuso (HTML5, canvas); ● Outras opções: – Highcharts (http://www.highcharts.com/); – PHPChart (http://phpchart.net/). Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #18
  • 19.
    Gráficos com jpGraph <?php require_once('jpgraph/src/jpgraph.php'); require_once ('jpgraph/src/jpgraph_line.php'); $dados = array(100, 300, 200, 500, 200, 400, 300); $graph = new Graph(400,250); $graph->SetScale('textlin'); $graph->SetMargin(40,20,40,40); $graph->title->Set('Título do gráfico'); // Cria uma plotagem linear $lineplot = new LinePlot($dados); $lineplot->SetColor( 'maroon' ); $lineplot->SetWeight( 2 ); // espessura $lineplot->mark->SetType(MARK_FILLEDCIRCLE); $lineplot->mark->SetColor('blue'); $lineplot->mark->SetFillColor('red'); $lineplot->value->Show(); $graph->Add($lineplot); // adiciona a plotagem $graph->Stroke('j1.png'); ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #19
  • 20.
    Gráficos com jpGraph <?php require_once('jpgraph/src/jpgraph.php'); require_once ('jpgraph/src/jpgraph_bar.php'); $dados = array(120,80,170,40,100); $graph = new Graph(400,250); $graph->SetScale("textlin"); $graph->SetMargin(40,20,40,40); $graph->title->Set('Vendas por mes'); $barplot = new BarPlot($dados); $barplot->SetFillColor('orange'); $barplot->value->Show(); $barplot->value->SetColor("blue"); $graph->Add($barplot); $graph->Stroke('j2.png'); ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #20
  • 21.
    Gráficos com pChart <?php include'pChart/class/pData.class.php'; // + pDraw e pImage $dados = new pData; $dados->addPoints(array(23, 21, 14, 12, 8, 6),'Chile'); $dados->addPoints(array( 4, 10, 12, 14, 20, 23),'Canadá'); $dados->addPoints(array('Janeiro','Fevereiro','Março',...); $dados->setAbscissa('Meses'); $imagem = new pImage(700, 330, $dados); // borda $imagem->drawRectangle(0, 0, 699, 329,array('R'=>0,'G'=>0,'B'=>0)); $imagem->setFontProperties(array('FontName'=>'verdana',...)); $imagem->setGraphArea(60,40,650,280); $scaleSettings = array('XMargin'=>10,'YMargin'=>10); $imagem->drawScale($scaleSettings); // escala $imagem->drawLineChart(array('DisplayValues'=>TRUE)); $imagem->render('c1.png'); ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #21
  • 22.
    Gráficos com pChart AdiantiSolutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #22
  • 23.
    Evolução ● As bibliotecas evoluemconstantemente; ● Novas tecnologias surgem; ● Nosso código não deve referenciar a biblioteca utilizada; ● Devemos separar nosso código do código de terceiros; ● Isso tudo, para facilitar o reuso e a evolução. Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #23
  • 24.
  • 25.
    Acoplamento ● ● ● O acoplamento équanto um módulo (classe, método) conhece e depende de outro; O objetivo é criar modelos com baixo acoplamento; O alto acoplamento diminui a reusabilidade de objetos porque objetos não podem ser usados sozinhos. Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #25
  • 26.
    Acoplamento ● É impossível criarum sistema com 0% de acoplamento. ● Uma classe com BAIXO acoplamento: – – ● Não depende de muitas outras e facilita a manutenção; Evita que as modificações produzam efeitos colaterais; Uma classe com ALTO acoplamento: – É menos inteligível isoladamente e menos reutilizável; – É mais sensível a mudanças nas classes da qual ela depende. Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #26
  • 27.
    Acoplamento ● Acoplamento concreto: – RelatorioControl eFPDF estão fortemente acopladas; – RelatorioControl conhece muito sobre FPDF. <?php class RelatorioControl { public function onGenerate() { $pdf = new FPDF('P', 'pt', 'A4'); $pdf->AddPage(); $pdf->SetFont('Courier', 'B', 16); $pdf->SetTextColor(50, 50, 100); $pdf->SetY(70); $pdf->SetX(260); $pdf->Write(30, 'Titulo'); $pdf->Output('test.pdf'); } } ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #27
  • 28.
    Acoplamento ● ● ● ● ● Mas existem outraformas de dependências... O objeto A envie uma mensagem para o objeto B sem ter conhecimento da verdadeira classe desse último; Essa forma de dependência corresponde ao que chamamos de acoplamento abstrato; A acoplamento abstrato é preferível ao concreto. Classes abstratas e interfaces permitem implementar o acoplamento abstrato. Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #28
  • 29.
    Acoplamento Realização <?php interface IGenerator { function addPage(); functionsetFontColor($color); function writeText($height, $text); function setFontFace($font, $style, $size); function saveFile($path); } class PDFGenerator implements IGenerator { //... } class RTFGenerator implements IGenerator { //... } ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #29
  • 30.
    Acoplamento Uso <?php class RelatorioControl { public functiononGenerate(IGenerator $gen) { $gen->addPage(); $gen->setFontFace('Courier', 'B', 16); $gen->setFontColor('#FF0000'); $gen->writeText(30, 'Titulo'); $gen->saveFile('test.pdf'); } } ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #30
  • 31.
    Acoplamento ● ● Uma forma dediminuir o acoplamento é criando um facade; Oferece uma interface única para um conjunto de interfaces de um subsistema. Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #31
  • 32.
    Acoplamento <?php class GraficoLinhas { public function__construct() { include 'class/pData.class.php'; include 'class/pImage.class.php'; } Mas e se quiséssemos Tornar a biblioteca Intercambiável? public function addSerie($legend, $data) … public function setTitle($title, $font) … public function draw() … } ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #32
  • 33.
  • 34.
    Implementações ● As interfaces dasbibliotecas: – PDF; – – ● RTF; HTML. São muito diferentes entre si: – RTF é texto fluído; – PDF é por posicionamento fixo; – HTML é por marcação. ● Para usar todas elas de maneira intercalada... ● É necessário criar uma camada de compatibilização. Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #34
  • 35.
    Strategy ● Permite a seleçãode algoritmos durante a execução do sw; ● Fornece um meio de declarar uma família de algoritmos; ● ● Permite encapsular estes algoritmos como um objeto, e torná-los intercambiáveis; Evita-se a criação de mega-classes com N métodos. Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #35
  • 36.
    Table Writer's ● Escritor derelatórios definido pela classe da esquerda; contexto Adianti Solutions Ltda © Pablo Dall'Oglio implementação Criando Relatórios com PHP #36
  • 37.
    Table Writer's <?php // incluias bibliotecas... require_once 'app.reports/ITableWriter.iface.php'; $widths = array(70, 150, 150, 100); $tr = new TTableWriterPDF($widths); $tr->addStyle('title', 'Arial', '10', 'B', '#ffffff', '#737373'); $tr->addStyle('data', 'Arial', '10', '', '#000000', '#ffffff'); $tr->addRow(); $tr->addCell('Código', 'left', 'title'); $tr->addCell('Nome', 'left', 'title'); $tr->addRow(); $tr->addCell('001', 'left', $tr->addCell('Ayrton Senna da Silva', 'left', 'data'); 'data'); $tr->addRow(); // ... $tr->save("saida1.pdf"); // salva ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #37
  • 38.
    Table Writer's <?php require_once 'app.reports/ITableWriter.iface.php'; //... Implementação $widths = array(70, 150, 150, 100); $tr = new TTableWriterPDF($widths); // cria os estilos $tr->addStyle('title', 'Arial', '12', 'B', '#ffffff', '#733131'); // atribui o escritor ao relatório $sr = new TSimpleReport; $sr->setReportWritter($tr); Contexto // adiciona as colunas do relatório $sr->addColumn('id', 'Código', 'center'); $sr->addColumn('nome', 'Nome', 'left'); // define o banco de dados e a consulta $sr->setDatabase('exemplos'); $sr->setQuery('SELECT id, nome, telefone, endereco from ...'); $sr->generate(); // gera o relatório $sr->save('saida4.pdf'); ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #38
  • 39.
    Bridge ● Separa uma abstraçãode sua implementação; ● As duas podem variar de maneira independente; ● Usa encapsulamento, agregação e herança para separar responsabilidades. Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #39
  • 40.
    Jeito tosco ● Proliferação deníveis. Estrutura não-flexível; ● Alto grau de acoplamento. O cliente especifica a classe; ● Quantas novas classes para novo tipo de gráfico (gauge)? Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #40
  • 42.
    Bridge <?php require_once 'app.reports/TChart.class.php'; require_once 'app.reports/TBarChart.class.php'; require_once'app.reports/TPieChart.class.php'; // ... $data['maria'] = array( 1, 2, 3, 4, 5, 6, 7); $data['pedro'] = array(12, 3, 12, 4, 12, 4, 2); $data['joao'] = array( 9, 8, 7, 6, 5, 4, 3); $chart = new TBarChart(new TPChartDesigner); $chart->setTitle('Título do gráfico', NULL, NULL); $chart->setSize(500, 300); $chart->setXLabels(array('a', 'b', 'c', 'd', 'e', 'f', 'g')); $chart->setYLabel('label do eixo Y'); $chart->setOutputPath('tmp/teste.png'); $chart->addData('maria', $data['maria']); $chart->addData('pedro', $data['pedro']); $chart->addData('joao', $data['joao']); $chart->generate(); ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #42
  • 43.
    Bridge <?php require_once 'app.reports/TChart.class.php'; require_once 'app.reports/TBarChart.class.php'; require_once'app.reports/TPieChart.class.php'; // ... // cria um gráfico de pizza usando a JPGraph $chart = new TPieChart(new TJPGraphDesigner); $chart->setTitle('Título do gráfico', NULL, NULL); $chart->setSize(500, 300); $chart->setOutputPath('tmp/teste2.png'); $chart->addData('maria', 40); $chart->addData('pedro', 30); $chart->addData('joao', 30); $chart->generate(); ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #43
  • 44.