Criando o Modelo no iReport
Agora vamos criar um modelo no iReport para receber:
- Os dados que geraram o gráfico apresentados em forma de listagem;
- A imagem do gráfico;
Vamos Criar 3 fields para receber os valores que darão origem ao gráfico. Repare que tem os mesmos nomes da entidade ModeloGraficoItem.
Nesta mesma tela, na aba Parameters vamos criar o parâmetro que irá receber a imagem. Observe que este parâmetro deve ser do tipo java.lang.Object:
Para mostrar a imagem do gráfico vamos criar um campo na Banda Sumary com a ferramenta ImageTools que receberá um objeto imagem por parâmetro:
A montagem final do Modelo ficou assim (salvo com o nome de ModeloGrafico):
Criando o Servlet
O código a seguir é de um Servlet que tem como única função:
- Receber os valores gerados pela classe ComposicaoDadosItemGrafico;
- Chamar a classe GeradorGrafico para criar um gráfico a partir dos da dados recebidos;
- Chamar o ModeloGrafico.jasper exibindo o relatório em formato PDF em uma janela do browser.
Para criar a imagem do gráfico vamos usar a classe BufferedImage que será o objeto adicionado ao parâmetro. Como os métodos da classe GeradorGrafico são estáticos a chamada é feita da seguinte forma:
BufferedImage imagem = GeradorGrafico.gerarGraficoLinha3D("Titulo", "Mes", "Quantidade", array);
A classe HashMap de java.util é usada para passar os parâmetros para o relatório:
HashMap parametros = new HashMap();
parametros.put("imagem", imagem);
Repare o nome do parâmetro: é o mesmo nome do objeto criado com a ferramenta ImageTools.
public class ServletRelatorioGrafico extends HttpServlet {
//Initialize global variables
public void init() throws ServletException {
}
//Process the HTTP Post request
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
//Clean up resources
public void destroy() {
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
try {
ComposicaoDadosItemGrafico composicao = new ComposicaoDadosItemGrafico();
ArrayList array = composicao.getArray();
//BufferedImage imagem = GeradorGrafico.gerarGraficoBarraVertical3D("Titulo", "Mes", "Quantidade", array);
//BufferedImage imagem = GeradorGrafico.gerarGraficoBarraVertical("Titulo", "Mes", "Quantidade", array);
//BufferedImage imagem = GeradorGrafico.gerarGraficoLinha("Titulo", "Mes", "Quantidade", array);
BufferedImage imagem = GeradorGrafico.gerarGraficoLinha3D("Titulo", "Mes", "Quantidade", array);
// A String pathJasper garda o caminho para o relatório compilado ModeloGrafico.jasper localizado na subpasta
//relatorio/grafico
String pathJasper = getServletContext().getRealPath("/relatorio/grafico") + "/TesteGrafico.jasper";
HashMap parametros = new HashMap();
parametros.put("imagem", imagem);
JRDataSource jrDataSourse = new JRBeanArrayDataSource(array.toArray());
JasperPrint impressao = JasperFillManager.fillReport(pathJasper, parametros, jrDataSourse);
byte[] bytes = JasperExportManager.exportReportToPdf(impressao);
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
Um formulário simples em HTML dever ser criado para fazer a chamada ao Servlet.
A saída da Aplicação é mostrada abaixo:
Conclusão
Vimos neste tutorial que a ferramenta JFreeChart pode ser usada juntamente com iReport / JasperReports para se criar relatórios mais completos usando também recursos de criação de gráficos.