JasperReports + JFreeChart

13 respostas
danieldestro

Alguém já fez algo com JasperReports + JFreeChart ???

Estou apanhando feio dos dois.

Segue meu JRXML:

<?xml version="1.0" encoding="ISO-8859-1"  ?>
<!-- Created with iReport - A designer for JasperReports -->
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport
		 name="relatorio_jm"
		 columnCount="1"
		 printOrder="Vertical"
		 orientation="Portrait"
		 pageWidth="595"
		 pageHeight="842"
		 columnWidth="535"
		 columnSpacing="0"
		 leftMargin="30"
		 rightMargin="30"
		 topMargin="20"
		 bottomMargin="20"
		 whenNoDataType="NoPages"
		 isTitleNewPage="false"
		 isSummaryNewPage="false">
	<property name="ireport.scriptlethandling" value="2" />
	<import value="java.util.*" />
	<import value="net.sf.jasperreports.engine.*" />
	<import value="net.sf.jasperreports.engine.data.*" />
	<parameter name="graf1" isForPrompting="false" class="java.awt.Image"/>
		<background>
			<band height="0"  isSplitAllowed="true" >
			</band>
		</background>
		<title>
			<band height="0"  isSplitAllowed="true" >
			</band>
		</title>
		<pageHeader>
			<band height="0"  isSplitAllowed="true" >
			</band>
		</pageHeader>
		<columnHeader>
			<band height="0"  isSplitAllowed="true" >
			</band>
		</columnHeader>
		<detail>
			<band height="337"  isSplitAllowed="true" >
				<image  scaleImage="FillFrame" vAlign="Top" hAlign="Left" isUsingCache="false" evaluationTime="Now" hyperlinkType="None"  hyperlinkTarget="Self" >
					<reportElement
						mode="Opaque"
						x="52"
						y="51"
						width="421"
						height="281"
						forecolor="#000000"
						backcolor="#FFFFFF"
						key="image-1"
						stretchType="NoStretch"
						positionType="FixRelativeToTop"
						isPrintRepeatedValues="true"
						isRemoveLineWhenBlank="false"
						isPrintInFirstWholeBand="false"
						isPrintWhenDetailOverflows="false"/>
					<box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#FFFFFF" bottomBorder="None" bottomBorderColor="#000000"/>
					<graphicElement stretchType="NoStretch" pen="None" fill="Solid" />
					<imageExpression class="java.awt.Image">[CDATA[$P{graf1}]]</imageExpression>				</image>
				<staticText>
					<reportElement
						mode="Opaque"
						x="4"
						y="5"
						width="526"
						height="32"
						forecolor="#000000"
						backcolor="#FFFFFF"
						key="staticText-1"
						stretchType="NoStretch"
						positionType="FixRelativeToTop"
						isPrintRepeatedValues="true"
						isRemoveLineWhenBlank="false"
						isPrintInFirstWholeBand="false"
						isPrintWhenDetailOverflows="false"/>
					<box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#FFFFFF" bottomBorder="None" bottomBorderColor="#000000"/>
					<textElement textAlignment="Center" verticalAlignment="Top" rotation="None" lineSpacing="Single">
						<font fontName="Arial" pdfFontName="Helvetica" size="18" isBold="true" isItalic="false" isUnderline="false" isPdfEmbedded ="false" pdfEncoding ="Cp1252" isStrikeThrough="false" />
					</textElement>
				<text>[CDATA[Relatorio de Teste]]</text>
				</staticText>
			</band>
		</detail>
		<columnFooter>
			<band height="0"  isSplitAllowed="true" >
			</band>
		</columnFooter>
		<pageFooter>
			<band height="0"  isSplitAllowed="true" >
			</band>
		</pageFooter>
		<summary>
			<band height="0"  isSplitAllowed="true" >
			</band>
		</summary>
</jasperReport>

Meu Java:

package teste;
import java.awt.image.BufferedImage;
import java.io.InputStream;
import java.sql.*;
import java.util.*;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.design.JasperDesign;
import org.jfree.chart.*;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.xy.*;

public class RelatorioComGrafico {
    
    public static void main(String[] args) {
        Connection conn = null;
        InputStream is = null;
        try {
            Map parameters = new HashMap();
            parameters.put("graf1", criarGrafico());
            conn = conectar();

            is = RelatorioComGrafico.class.getClass().getResourceAsStream("/relatorio.jrxml");

            JasperDesign jasperDesign = JasperManager.loadXmlDesign(is);
            JasperReport jasperReport = JasperManager.compileReport(jasperDesign);
            JasperPrint jasperPrint = JasperManager.fillReport(jasperReport, parameters, conn);
            JasperManager.printReportToPdfFile(jasperPrint, "c:\\relatorio.pdf");
        } catch(Exception e) {
            e.printStackTrace();
        } finally {
            try { is.close(); } catch( Exception e ) {}
            try { conn.close(); } catch( Exception e ) {}
        }
    }
    
    private static BufferedImage criarGrafico() {
      //gera o BufferedImage  do grafico corretamente
      // e o retorna
   }
}
BAT para rodar a app
set CP=.;../lib/commons-beanutils.jar;../lib/commons-collections.jar;../lib/commons-digester.jar;../lib/commons-logging.jar;../lib/commons-logging-api.jar;../lib/itext-1.02b.jar;../lib/jasperreports-0.6.4.jar;../lib/jcommon-1.0.0-pre2.jar;../lib/jfreechart-1.0.0-pre2.jar;../lib/mysql.jar

java -cp %CP% teste.RelatorioComGrafico

Ele me gera apenas um PDF vazio...

Alguém tem idéia do que fiz de errado?

13 Respostas

mister_m

Já tentou simplificar o seu problema?

  1. Exibir esse relatório de outra forma (sem exportar pra PDF)
  2. Gerar sem imagem

Com respeito a imagens, existem uns erros interessantes, do tipo a imagem ficar muito grande e ser “clipada”, i.e., aparecer somente o pedaço visível no tamanho destinado a ela, e ainda acontecer de, por uma desgraça, a área clipada ser justamente a área branca da imagem.

danieldestro

É Michael, vou tentar dividir o problema e ver onde ele está.
Sei que o gráfico está sendo gerado pelo JFreeChart pq eu o salvei como PNG e o exibi em uma tela Swing.

Valeu!

danieldestro

Eu jogo uma conexão para o Jasper, mas na verdade o relatório não tem nenhuma query a ser executada. Será que é isso? Bizarro!

danieldestro

Realmente o problema parece ser a falta de uma query no relatório mesmo, porque sem um ele não exibe nada. BIZARRO!

Mesmo assim, lí este artigo: http://ireport.sourceforge.net/cap8.html#8.1
Seguí os passos, mas o maldito não rola. Quando eu compilo me gra o seguinte erro:

<blockquote>Compiling file C:\Documents and Settings\discovertechnology\Desktop\javinha\artigo-jfreechart2\src\relatorio_jm.jrxmScriptlet.java -> C:\Documents and Settings\discovertechnology\Desktop\javinha\artigo-jfreechart2\src\relatorio_jmScriptlet.java

Error compiling the Scriptlet java source! java.lang.ClassNotFoundException: com.sun.tools.javac.Main

at java.net.URLClassLoader$1.run(Unknown Source)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(Unknown Source)

at java.lang.ClassLoader.loadClass(Unknown Source)

at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)

at java.lang.ClassLoader.loadClass(Unknown Source)

at java.lang.ClassLoader.loadClassInternal(Unknown Source)

at java.lang.Class.forName0(Native Method)

at java.lang.Class.forName(Unknown Source)

at net.sf.jasperreports.engine.util.JRClassLoader.loadClassForName(JRClassLoader.java:116)

at net.sf.jasperreports.engine.design.JRJdk13Compiler.compileClass(JRJdk13Compiler.java:111)

at it.businesslogic.ireport.IReportCompiler.run(IReportCompiler.java:233)

at java.lang.Thread.run(Unknown Source)
NESTED BY : net.sf.jasperreports.engine.JRException: Error compiling report java source file : C:\Documents and Settings\discovertechnology\Desktop\javinha\artigo-jfreechart2\src\relatorio_jmScriptlet.java

at net.sf.jasperreports.engine.design.JRJdk13Compiler.compileClass(JRJdk13Compiler.java:124)

at it.businesslogic.ireport.IReportCompiler.run(IReportCompiler.java:233)

at java.lang.Thread.run(Unknown Source)

Caused by: java.lang.ClassNotFoundException: com.sun.tools.javac.Main

at java.net.URLClassLoader$1.run(Unknown Source)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(Unknown Source)

at java.lang.ClassLoader.loadClass(Unknown Source)

at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)

at java.lang.ClassLoader.loadClass(Unknown Source)

at java.lang.ClassLoader.loadClassInternal(Unknown Source)

at java.lang.Class.forName0(Native Method)

at java.lang.Class.forName(Unknown Source)

at net.sf.jasperreports.engine.util.JRClassLoader.loadClassForName(JRClassLoader.java:116)

at net.sf.jasperreports.engine.design.JRJdk13Compiler.compileClass(JRJdk13Compiler.java:111)

 2 more</blockquote>

Mas não sei como faço pra configurar o caminho do JDK nele. Procurei e não achei. Mesmo assim, meu PATH está ok como meu JDK.

Alguém já passou por isso?

danieldestro

Acabei resolvendo assim:

No iReports cria um relatório novo. Na banda “title” eu adicionei um textio estático e uma imagem.

Depois adicionei uma query no “Report SQL Query”. Isso foi feito porque sem uma query que traz os dados, o JasperReports NÃO gera o relatório (a não ser uma página em branco).

E no Java, eu faço assim:

InputStream is = RelatorioComGrafico.class.getClass().getResourceAsStream("/relatorio.jrxml"); JasperDesign jasperDesign = JasperManager.loadXmlDesign(is); JasperReport jasperReport = JasperManager.compileReport(jasperDesign); JasperPrint jasperPrint = JasperManager.fillReport(jasperReport, parameters, conn); JasperManager.printReportToPdfFile(jasperPrint, "c:\\relatorio.pdf");

mister_m

Daniel, seu relatório está configurado para usar um custom Scriptlet, o que é bizarro. Além disso, parece que você está rodando o processo de compilação com a JRE e não com a JVM.

Recomendo que você use o processo do Ant para compilar o relatório e verifique a necessidade de usar um custom Scriplet.

mister_m

Isso deve ter matado o custom Scriplet que deve ter sido inserido sem querer enquanto você brincava com a ferramenta :slight_smile:

Primeiro que você poderia fazer de outro jeito, passando simplesmente um JRDataSource com uma linha. Mas acho que existe um jeito de forçar os elementos a serem impressos mesmo que o relatório esteja vazio, embora não esteja muito certo disso.

Agora, por curiosidade, por que você quer gerar um relatório com um texto estático e uma imagem???

danieldestro

Olha o que acabei de ver. No JRXML eu posso editar a tag <jasperReport>, colocando o valor do atributo whenNoDataType=“AllSectionsNoDetail”. Isso garante que ele vai renderizar todas bandas (menos DETAIL) do relatório mesmo sem ter dados.

E matando sua curiosidade Michael, é só pra um programa de exemplo para mostrar como integrar JFC e JR.

danieldestro

Quanto ao problema de compilar o relatório com gráfico no iReport, é que eu não tinha colocado o tools.jar no classpath. Resolvido!

A

poderia me dizer a relação dentre: iReport JasperReports iText JFreeChart?

N

Existe algo registro no BD?
Quando faço alguns relatórios, e não tem nada no BD, ele abre o adobe com uma mensagem, dizendo que não tem dados a serem exibidos.

N

Você está usando o esquema de fazer o chart pelo JasperReports? Será que isso não precisa configurar algo a mais? *-)

Eu fiz uns testes gerando a imagem fora do jasper, e passando pra ele apenas como um parametro. Foi bem simples.

N

Empresa faliu! :mrgreen:

Criado 25 de abril de 2005
Ultima resposta 26 de abr. de 2005
Respostas 13
Participantes 4