JasperReports - Dúvidas URGENTE!

Nosso código:

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;

import net.sf.jasperreports.engine.data.;
import net.sf.jasperreports.engine.util.
;
import net.sf.jasperreports.engine.export.;
import net.sf.jasperreports.engine.
;
import java.util.HashMap;

public class Relatorio {

  public static void main(String[] args) throws Exception {

              String reportFileName = "addressbook.jasper";
              String outFileName = "addressbook.pdf";

      JRXmlDataSource jrxmlds = new JRXmlDataSource(new

BufferedInputStream(new
FileInputStream(“bd.xml”)),"/Northwind/Customers");

      HashMap hm = new HashMap();

      try
      {
          JasperPrint print =

JasperFillManager.fillReport(reportFileName,hm,jrxmlds);

          JRExporter exporter = new

net.sf.jasperreports.engine.export.JRPdfExporter();

          exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,outFileName);
          exporter.setParameter(JRExporterParameter.JASPER_PRINT,print);

          exporter.exportReport();
          System.out.println("Created file: " + outFileName);
      }
      catch (JRException e)
      {
          e.printStackTrace();
          System.exit(1);
      }
      catch (Exception e)
      {
          e.printStackTrace();
          System.exit(1);
      }

  }

}


…::::::::::::::::Problema apresentado::::::::::…

C:\j2sdk1.4.2_08\bin\java.exe -classpath
“C:\j2sdk1.4.2_08\jre\lib\rt.jar;C:\j2sdk1.4.2_08\lib\tools.jar;C:\j2sdk1.4.2_08\jasperreports-0.6.6.jar;C:\j2sdk1.4.2_08\jdom.jar;E:\relatorio”
Relatorio
org.xml.sax.SAXParseException: Document root element is missing.
at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3376)
at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3364)
at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:668)
at org.apache.crimson.parser.Parser2.parse(Parser2.java:337)
at org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.java:448)
at org.apache.crimson.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:185)
at net.sf.jasperreports.engine.data.JRXmlDataSource.parse(JRXmlDataSource.java:248)
at net.sf.jasperreports.engine.data.JRXmlDataSource.<init>(JRXmlDataSource.java:197)
at Relatorio.main(Relatorio.java:19)

NESTED BY :
org.xml.sax.SAXParseException: Document root element is missing.
at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3376)
at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3364)
at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:668)
at org.apache.crimson.parser.Parser2.parse(Parser2.java:337)

			at org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.java:448)
			at org.apache.crimson.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:185)
			at net.sf.jasperreports.engine.data.JRXmlDataSource.parse(JRXmlDataSource.java:248)
			at net.sf.jasperreports.engine.data.JRXmlDataSource.&lt;init&gt;(JRXmlDataSource.java:197)
			at Relatorio.main(Relatorio.java:19)

NESTED BY :
net.sf.jasperreports.engine.JRException: Failed to parse the xml document
at net.sf.jasperreports.engine.data.JRXmlDataSource.parse(JRXmlDataSource.java:250)
at net.sf.jasperreports.engine.data.JRXmlDataSource.<init>(JRXmlDataSource.java:197)
at Relatorio.main(Relatorio.java:19)
Caused by: org.xml.sax.SAXParseException: Document root element is missing.
at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3376)
at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3364)
at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:668)
at org.apache.crimson.parser.Parser2.parse(Parser2.java:337)
at org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.java:448)

			at org.apache.crimson.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:185)
			at net.sf.jasperreports.engine.data.JRXmlDataSource.parse(JRXmlDataSource.java:248)
			... 2 more

Exception in thread “main” Finished executing

O QUE FAÇO AGORA??? HELP!!!

Parece que seu arquivo de xml ta com erro!
Vc consegue rodar pelo iReport???

Só uma coisinha, não fique duplicando posts, já é a terceira vez que manda
a mesma coisa em locais diferentes

de boa

O XML roda perfeitamente no IReport.
O que será que está acontecendo???
Grata pelo retorno.

Vc está usando um arquivo XML para passar os dados para esta classe ai que gera o relatorio, não é?

o erro pode estar ai,

JRXmlDataSource jrxmlds = new JRXmlDataSource&#40;new
BufferedInputStream&#40;new
FileInputStream&#40;&quot;bd.xml&quot;&#41;&#41;,&quot;/Northwind/Customers&quot;&#41;; 

Esse JRXMLDataSoruce é uma classe feita por vocês? Eu implemetei uma usando a interface JRDataSource do JasperReport mas tive que fazer os métodos na mão. Se essa sua classe lê um arquivo XML que seria a fonte de dados. Parece que o problema está nesse arquivo. Segundo o SAX ele nem tem cabeçalho. O problema parece ser o XML de dados. Analise o DTD dele se existe um…

caitiff-jVampire,

Estou colocando o nosso XML, para verificar o erro.
Como faço para analisar se ele tem um DTD???

Código fonte XML:

<?xml version=“1.0” encoding=“UTF-8” ?>

  • <lista>
  • <usuarios>
    <usuarioID>00001</usuarioID>
    <CompanyName>Alex Murcet</CompanyName>
    <Phone>3000-7321</Phone>
    </usuarios>
  • <usuarios>
    <usuarioID>00002</usuarioID>
    <CompanyName>Ana Trujillo Emparedados y helados</CompanyName>
    <Phone>5555-4729</Phone>
    </usuarios>
  • <usuarios>
    <usuarioID>00003</usuarioID>
    <CompanyName>Antonio Moreno Taquería</CompanyName>
    <Phone>5555-3932</Phone>
    </usuarios>
  • <usuarios>
    <usuarioID>00004</usuarioID>
    <CompanyName>Around the Horn</CompanyName>
    <Phone>(171) 555-7788</Phone>
    </usuarios>
  • <usuarios>
    <usuarioID>00005</usuarioID>
    <CompanyName>Berglunds snabbköp</CompanyName>
    <Phone>9211-2346</Phone>
    </usuarios>
  • <usuarios>
    <usuarioID>00006</usuarioID>
    <CompanyName>Blauer See Delikatessen</CompanyName>
    <ContactName>Hanna Moos</ContactName>
    <Phone>6210-8460</Phone>
    </usuarios>
  • <usuarios>
    <usuarioID>00007</usuarioID>
    <CompanyName>Blondesddsl père et fils</CompanyName>
    <Phone>8860-1531</Phone>
    </usuarios>
  • <usuarios>
    <usuarioID>00008</usuarioID>
    <CompanyName>Bólido Comidas preparadas</CompanyName>
    <Phone>9155-5228</Phone>
    </usuarios>
  • <usuarios>
    <usuarioID>00009</usuarioID>
    <CompanyName>Bon app’</CompanyName>
    <Phone>9124-4540</Phone>
    </usuarios>
  • <usuarios>
    <usuarioID>00010</usuarioID>
    <CompanyName>Bottom-Dollar Markets</CompanyName>
    <Phone>(604) 555-4729</Phone>
    </usuarios>
  • <usuarios>
    <usuarioID>00011</usuarioID>
    <CompanyName>B’s Beverages</CompanyName>
    <Phone>(171) 555-1212</Phone>
    </usuarios>
  • <usuarios>
    <usuarioID>00012</usuarioID>
    <CompanyName>Cactus Comidas para llevar</CompanyName>
    <Phone>1135-5555</Phone>
    </usuarios>
  • <usuarios>
    <usuarioID>00013</usuarioID>
    <CompanyName>Centro comercial Moctezuma</CompanyName>
    <Phone>5555-3392</Phone>
    </usuarios>
  • <usuarios>
    <usuarioID>00014</usuarioID>
    <CompanyName>Chop-suey Chinese</CompanyName>
    <Phone>4520-7655</Phone>
    </usuarios>
  • <usuarios>
    <usuarioID>00015</usuarioID>
    <CompanyName>Gustavo Cardoso</CompanyName>
    <Phone>3386-1080</Phone>
    </usuarios>
  • <usuarios>
    <usuarioID>00016</usuarioID>
    <CompanyName>Suelen Vinter</CompanyName>
    <Phone>3242-6444</Phone>
    </usuarios>
  • <usuarios>
    <usuarioID>00017</usuarioID>
    <CompanyName>Hermínio Filho</CompanyName>
    <Phone>3396-4799</Phone>
    </usuarios>
  • <usuarios>
    <usuarioID>00018</usuarioID>
    <CompanyName>Victor Lucas</CompanyName>
    <Phone>3242-0326</Phone>
    </usuarios>
  • <usuarios>
    <usuarioID>00019</usuarioID>
    <CompanyName>Jairo Filho</CompanyName>
    <Phone>3340-0730</Phone>
    </usuarios>
    </lista>

Bom, como que faz? Teria que olhar no codigo que lê esse xml. Olha seu xml tem cabeçalho sim. Ta complicado em… Seria melhor você debugar a aplicação você vai ter que procurar em todos os lugares num tem jeito.
Essa classe: “…JRXmlDataSource.java:248…”. Foi implementada por vocês ou é do proprio JasperReport? Se for dele veja se não é necessario seguir um padrão. Se foi implementada por vocês debugue o código que faz a leitura do XML. Veja se ele não faz nenhuma referencia a um arquivo .DTD. Seu xml não tem nada de errado, mas o parse do SAX diz que está faltando o elemento Root que seria o seu <lista>. Talvez venha uma tag antes dessa.

Queremos saber o que fazer para resolver o problema apresentado na figura abaixo:

Pq os métodos aparecem todos riscados???
OBS - somente os métodos do JasperManager ficam assim!!!

…::::::::::::::::: CÓDIGO FONTE :::::::::::::;…

import net.sf.jasperreports.engine.JasperManager;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.view.JasperViewer;

import java.util.HashMap;
import java.sql.*;

public class MostraRelatorio {

private static final String driver = "org.hsqldb.jdbcDriver";
private static final String url = "jdbc:hsqldb:/home/lozano/bd/vendas";
private static final String login = "sa";
private static final String passwd = "";

public static void main(String[] args) throws Exception {

// compila o relatório
JasperReport relatorio = JasperManager.compileReport(args[0]);

// estabelece uma conexão JDBC
Class.forName(driver);
Connection con = DriverManager.getConnection(url,login, passwd);

// executa o relatório
JasperPrint impressao = JasperManager..fillReport(relatorio, new HashMap(), con);

//exibe o resultado da impressão na previsualização padrão Swing
JasperViewer viewer = new JasperViewer(impressao, true);
viewer.show();
}

}

Acho que é classpath ou versão do jasperReport.

Conseguimos modificaro código e fazer com que ele gere o relatório.
Gostaríamos de implementar um método que, após gerar o relatório, mostre automaticamente na tela.
Poderia nos ajudar???

…:::::::::::::::: NOSSO CÓDIGO ::::::::::…

import net.sf.jasperreports.engine.data.;
import net.sf.jasperreports.engine.util.
;
import net.sf.jasperreports.engine.export.;
import net.sf.jasperreports.engine.
;
import net.sf.jasperreports.engine.base.;
import net.sf.jasperreports.view.
;
import java.util.HashMap;

public class Relatorio {

  public static void main(String[] args) throws Exception {

              String reportFileName = "relatorio.jasper";
              String outFileName = "relatorio.pdf";
              String bancodados = "bd.xml";
              String recordpath = "/lista/usuarios";

      HashMap hm = new HashMap();
      JRXmlDataSource xml = new JRXmlDataSource(bancodados,recordpath);

      try
      {
          JasperPrint print = JasperFillManager.fillReport(reportFileName,hm,xml);

          JRExporter exporter = new net.sf.jasperreports.engine.export.JRPdfExporter();

          exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,outFileName);
          exporter.setParameter(JRExporterParameter.JASPER_PRINT,print);

          exporter.exportReport();
          System.out.println("Created file: " + outFileName);



      }
      catch (JRException e)
      {
          e.printStackTrace();
          System.exit(1);
      }
      catch (Exception e)
      {
          e.printStackTrace();
          System.exit(1);
      }

  }

}

Conseguimos fazer com que a classe gere o relatorio.
Gostriamos de fazer com que ele imprimar automaticamente na tela.

…:::::::::::::::: NOSSO CÓDIGO FONTE:::::::::::::…

// IMPORTANDO AS CLASSES

import net.sf.jasperreports.engine.data.;
import net.sf.jasperreports.engine.util.
;
import net.sf.jasperreports.engine.export.;
import net.sf.jasperreports.engine.
;
import net.sf.jasperreports.engine.base.;
import net.sf.jasperreports.view.
;
import java.util.HashMap;

// MÉTODO CONSTRUTOR
public class Relatorio {

  public static void main(String[] args) throws Exception {
    // /Criação de Strings para fazer delas constantes
              final String reportFileName = "relatorio.jasper";
              final String outFileName = "relatorio.pdf";
              final String bancodados = "bd.xml";
              final String recordpath = "/lista/usuarios";

      // HashMap de parâmetros utilizados no relatório. Sempre instanciados
      HashMap hm = new HashMap();
      // Realiza conexão com Banco de Dados XML
      JRXmlDataSource xml = new JRXmlDataSource(bancodados,recordpath);

      try    // Tratamento de Erros
      {
          // Criando e Gerando o Relatório
          // Arquivo para Impressão
          JasperPrint print = JasperFillManager.fillReport(reportFileName,hm,xml);
          // Arquivo para PDF
          JRExporter exporter = new net.sf.jasperreports.engine.export.JRPdfExporter();

          exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,outFileName);
          exporter.setParameter(JRExporterParameter.JASPER_PRINT,print);

          exporter.exportReport();
          System.out.println("Created file: " + outFileName);

      // Tratamento de Erros

      }
      catch (JRException e)
      {
          e.printStackTrace();
          System.exit(1);
      }
      catch (Exception e)
      {
          e.printStackTrace();
          System.exit(1);
      }

  }

}

Imprimir direto na impressora não da, mas você pode usar o net.sf.jasperreports.view.JasperViewer para visualizar em PDF e alem de imprimir, salvar em varios formatos. Caso queira fazer um personalizado ou colocalo em uma applet. É facil de usar ele. Basta passar o seu JasperPrint no construtor da classe que ja aparece a tela com o relatório em PDF. Caso queria usar em uma applet. Crie um Objeto JRViewer passando em seu construtor o JasperPrint e set o contentPanel da applet com o Jpanel do JRViewer. É simples facil e rapido. Não tem segredo não. E procure na net que você acha muito codigo fazendo isso. Um abraço