[Resolvido - ]IReports - msg[O Documento não contem páginas]

11 respostas
A

Opa galerinha quaneu uso o codigo abaixo pra chamar um report ele da essa mensagem de erro : Odocumento não contem paginas alguem poderia me ajudar?

view plaincopy to clipboardprint?

   public teste() throws Exception{  
    conexao conex = new conexao();     
      //supondo que o teu ficheiro teste.jasper esteja dentro da tiua aplicação  
      URL arquivo = getClass().getResource("report1.jasper");  
      HashMap map = new HashMap();  
      JasperReport jasperReport = (JasperReport) JRLoader.loadObject(arquivo);  
      //aqui, como não vais passar parâmetros para dentro do relatório, e porque estou a assumir que não tenhas ligação com base de dados, os dois ultimos parametros são nulos  
      JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, map);  
      //isto mostra.te o viewer, penso que é a melhor maneira, pois assim a pessoa escolhe o formato em que quer gravar, e o sitio onde gravar  
      JasperViewer jrviewer = new JasperViewer(jasperPrint, false);  
      jrviewer.setVisible(true);  
      }

11 Respostas

T

amigo um dos erros que eu vi você não ta passando a conexão para o JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, map);

A

sim mas quando eu boto a conexao ele diz que não existe a classe

L
acidotherwise:
Opa galerinha quaneu uso o codigo abaixo pra chamar um report ele da essa mensagem de erro : Odocumento não contem paginas alguem poderia me ajudar?
view plaincopy to clipboardprint?

   public teste() throws Exception{  
    conexao conex = new conexao();     
      //supondo que o teu ficheiro teste.jasper esteja dentro da tiua aplicação  
      URL arquivo = getClass().getResource("report1.jasper");  
      HashMap map = new HashMap();  
      JasperReport jasperReport = (JasperReport) JRLoader.loadObject(arquivo);  
      //aqui, como não vais passar parâmetros para dentro do relatório, e porque estou a assumir que não tenhas ligação com base de dados, os dois ultimos parametros são nulos  
      JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, map);  
      //isto mostra.te o viewer, penso que é a melhor maneira, pois assim a pessoa escolhe o formato em que quer gravar, e o sitio onde gravar  
      JasperViewer jrviewer = new JasperViewer(jasperPrint, false);  
      jrviewer.setVisible(true);  
      }

Olá bom dia...
O problema não seria pq o seu HashMap está vazio?

A

bom vou te falar que eu não entendi oque seria esse hashmap , tem como algume me explicar, na verdade esse exemplo eu peguei para alguem que não usaria conexao com BD tem como me mostrar como seria com conexao?

L

Então esse hashmap vai servir para vc passar os parametros que vc tem dentro do seu relatório, dentre eles o seu sql, por exemplo…
Por isso é necessário q ele contenha informações, se vc passar ele vazio, e o relatório depender de parâmetros e informações da sua tela, não vai conseguir gerar mesmo…

Veja este exemplo…

http://www.guj.com.br/content/articles/reports/JasperReportsIReport.pdf

Depois posta ae o q deu…

A

tche eu dei uma anlizada bem legal o material so como eu to muito cru eu to precisnado de algum codigo que implemente isso pra ver na pratica entendeu tipo o meu layout é mais ou menos o seguinte eu to desenvolvendo uma aplicação desktop no netbeans, ai instalei o plugin do ireports e todas seus jars ai desenheio relatorio gerou o .jasper ta conectando com o banco e tudo ai eu queria clicar num botão e chamr o relatorio mas ta meio escuro pra mim se der pra me dar um força eu te agradeço, rsssss, mais do que ja ta dando

M

Boa tarde!

(acidotherwise) segue ai um código que utilizo para converter e exportar os relatórios para PDF, HTML, etc… , enviar por email os relatórios e também te mostra como utilizar o HashMap para passar os parametros, contem alguns comentários de problemas que podem ocorrer na interação entre os ireport e as demais linguagens e plataformas e entre as diferentes versões do ireport, é só implementar seus controles(botão) e chamar esse método.

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.sql.Connection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import javax.imageio.ImageIO;
import javax.mail.internet.InternetAddress;
import javax.naming.NamingException;
import javax.sql.DataSource;

import mm.util.DateUtil;
import mm.util.FileUtil;
import mm.util.JasperUtil;
import mm.util.Mail;
import mm.util.NamedFileDataSource;
import mm.util.StrUtil;
import mm.util.Util;
import mm.util.web.ReportService;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.export.JRHtmlExporter;
import net.sf.jasperreports.engine.export.JRHtmlExporterParameter;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.fill.JRSwapFileVirtualizer;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.engine.util.JRSwapFile;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class Report extends BaseReport implements ReportResponder
{
	private static final Logger log = LoggerFactory.getLogger(Report.class);
	private static final int SWAP_WHEN = 2;
	private static final int SWAP_BLOCK_SIZE = 1000;
	private static final int SWAP_GROW = 500;
	private ReportManager manager;
	private DataSource dataSource;
	private HashMap<String, Object> parametros = new HashMap<String, Object>();
	private String encoding = "UTF-8";
	private String hash;
	private String host;
	private String port;
	private String sistema;
	private String funcao;
	private String remetente;
	private String destinatario;
	private String observacoes;

	public Report(ReportManager manager, Map<String, String[]> parameters) throws NamingException
	{
		this.manager = manager;
		this.dataSource = manager.lookupDataSource();

		for (Iterator<String> i = parameters.keySet().iterator(); i.hasNext(); )
		{
			String name = i.next();
			Object value = parameters.get(name)[0];

			if (name.startsWith("DATA_") || name.equals("DATA"))
				value = new Date(Long.parseLong((String) value));

			if (ReportService.PARAM_FORMATO.equals(name))
				formato = (String) value;
			else if (ReportService.PARAM_ENCODING.equals(name))
				encoding = (String) value;
			else if (ReportService.PARAM_HASH.equals(name))
				hash = (String) value;
			else if (ReportService.PARAM_HOST.equals(name))
				host = (String) value;
			else if (ReportService.PARAM_PORT.equals(name))
				port = (String) value;
			else if (ReportService.PARAM_SISTEMA.equals(name))
				sistema = (String) value;
			else if (ReportService.PARAM_FUNCAO.equals(name))
				funcao = (String) value;
			else if (ReportService.PARAM_REMETENTE.equals(name))
				remetente = (String) value;
			else if (ReportService.PARAM_DESTINATARIO.equals(name))
				destinatario = (String) value;
			else if (ReportService.PARAM_OBSERVACOES.equals(name))
				observacoes = (String) value;
			else if (value != null)
				parametros.put(name, value);
		}
	}

	@Override
	public void run()
	{
		try
		{
			log.info("Iniciando execução do relatório " + funcao);

			File jrxmlFile = new File(
				manager.getJasperReportsPath(sistema), funcao + ".jrxml");
			File jasperFile = new File(
				manager.getJasperReportsPath(sistema), funcao + ".jasper");

			File tempFile0;
			if (jrxmlFile.exists() || jasperFile.exists())
				tempFile0 = genJasper(dataSource, parametros);
			else
				tempFile0 = genOracle(parametros);

			tempFile = tempFile0;

			if (destinatario != null)
			{
				// Obs.: Apenas relatórios em PDF serão enviados corretamente por e-mail.

				if (observacoes == null)
					observacoes = "Relatório em anexo.";

				try
				{
					Mail mail = new Mail();
					mail.setFrom(new InternetAddress(remetente));

					InternetAddress[] destAddress = Mail.parseAddressList(destinatario);
					if (Util.getConfig() == Util.Config.PRODUCAO)
						mail.setToRecipients(destAddress);
					else
					{
						// Envia para o mesmo email do remetente, mas com o nome do destinatário.
						mail.setToRecipient(new InternetAddress(
							mail.getFrom().getAddress(), destAddress[0].getPersonal()));
					}

					mail.setSubject("Relatório " + funcao);
					mail.setBody(observacoes);
					mail.getAttachments().add(new NamedFileDataSource(tempFile,
						funcao + "." + formato));
					mail.send();
				}
				catch (Exception e)
				{
					throw new RuntimeException(e);
				}
				finally
				{
					tempFile.delete();
				}
			}
		}
		catch (Exception e)
		{
			throw new RuntimeException(e);
		}
	}

	public void close()
	{
		if (!StrUtil.isEmpty(hash))
			return;

		try
		{
			if (tempFile != null)
				tempFile.delete();

			if (tempDir != null)
				FileUtil.deleteDir(tempDir);
		}
		catch (Exception e)
		{
			log.error("Erro finalizando relatório", e);
		}
	}

	@Override
	protected boolean deleteMainFileAfterRespond()
	{
		return StrUtil.isEmpty(hash);
	}

	private File genJasper(DataSource dataSource, HashMap<String, Object> parametros)
		throws Exception
	{
		String s = manager.getJasperReportsPath(null).getAbsolutePath();
		if (!s.endsWith(File.separator))
			s += File.separator;
		parametros.put("SUBREPORT_DIR", s);

		File reportFile = JasperUtil.getReport(manager.getJasperReportsPath(sistema),
			funcao, false);

		// Cria um virtualizador, para evitar uso excessivo de memória.
		JRSwapFileVirtualizer virtualizer = new JRSwapFileVirtualizer(SWAP_WHEN,
			new JRSwapFile(System.getProperty("java.io.tmpdir"), SWAP_BLOCK_SIZE, SWAP_GROW));
		parametros.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);

		try
		{
			Connection conn = dataSource.getConnection();
			try
			{
				JasperReport jasperReport;

				// Alguns relatórios salvos com o iReport 3.0 apresentam problema de
				// carregamento com o JasperReports 3.6.x Tentamos recompilar para contornar.
				try
				{
					jasperReport = (JasperReport) JRLoader.loadObject(reportFile.getPath());
				}
				catch (JRException e)
				{
					log.info("Erro ao carregar relatório. Tentando recompilá-lo.", e);

					reportFile = JasperUtil.getReport(manager.getJasperReportsPath(sistema),
						funcao, true);
					jasperReport = (JasperReport) JRLoader.loadObject(reportFile.getPath());
				}

				for (JRParameter param : jasperReport.getParameters())
				{
					Object value = parametros.get(param.getName());

					if (value != null)
					{
						if (param.getValueClass() == Integer.class)
							parametros.put(param.getName(), Integer.valueOf((String) value));
						else if (param.getValueClass() == Long.class)
							parametros.put(param.getName(), Long.valueOf((String) value));
						else if (param.getValueClass() == BigDecimal.class)
							parametros.put(param.getName(), new BigDecimal((String) value));
						else if (param.getValueClass() == Boolean.class)
							parametros.put(param.getName(), Boolean.parseBoolean((String) value));
					}
				}

				parametros.put(JRParameter.REPORT_LOCALE, Util.getLocale());

				JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
					parametros, conn);

				File tempFile = null;
				try
				{
					JRExporter exporter;

					if ("pdf".equals(formato))
					{
						exporter = new JRPdfExporter();
						tempFile = File.createTempFile("tmprel", "." + formato);
					}
					else if ("html".equals(formato))
					{
						String imagesUri = "";
						if (host != null && port != null)
							imagesUri = "http://" + host + ":" + port;

						exporter = new JRHtmlExporter();

						tempDir = new File(manager.getReportCachePath(),
							manager.getReportCachePrefix() + hash);

						if (!tempDir.mkdir())
						{
							throw new Exception("Diretório " + tempDir.getAbsolutePath() +
								" já existia");
						}

						tempFile = new File(tempDir, HTML_FILENAME);

						exporter.setParameter(JRHtmlExporterParameter.IMAGES_DIR, tempDir);

						exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI,
							imagesUri + "/ExecRelatorios/ReportCached/" + hash + "/");

						exporter.setParameter(JRHtmlExporterParameter.SIZE_UNIT,
							JRHtmlExporterParameter.SIZE_UNIT_PIXEL);

						exporter.setParameter(JRHtmlExporterParameter.HTML_HEADER,
							"<center><table cellpadding=\"1\" cellspacing=\"0\"><tr><td>");
						exporter.setParameter(JRHtmlExporterParameter.BETWEEN_PAGES_HTML, "");
						exporter.setParameter(JRHtmlExporterParameter.HTML_FOOTER,
							"</td></tr></table></center>");

						exporter.setParameter(
							JRHtmlExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,
							Boolean.TRUE);

						exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, encoding);
					}
					else
						throw new Exception("Formato de relatório inválido");

					exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
					exporter.setParameter(JRExporterParameter.OUTPUT_FILE, tempFile);
					exporter.exportReport();

					if (tempDir != null)
					{
						// Converte imagem para GIF, pois o Internet Explorer 6 não exibe arquivos
						// PNG corretamente.
						for (String name : tempDir.list())
						{
							if (tempFile.equals(new File(tempDir, name)))
								continue;

							File file = new File(tempDir, name);
							BufferedImage image = ImageIO.read(file);

							BufferedImage imageCopy = new BufferedImage(
								image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
							imageCopy.getGraphics().drawImage(image, 0, 0, Color.WHITE, null);
							image = imageCopy;

							ImageIO.write(image, "gif", file);
						}
					}

					return tempFile;
				}
				catch (Exception e)
				{
					if (tempFile != null)
						tempFile.delete();
					throw e;
				}
			}
			finally
			{
				conn.close();
			}
		}
		finally
		{
			virtualizer.cleanup();
		}
	}

	private File genOracle(HashMap<String, Object> parametros) throws Exception
	{
		File tempFile = File.createTempFile("tmprel", ".pdf");
		File reportPath = new File(manager.getOracleReportsPath(sistema), funcao + ".rdf");

		String cmd = manager.getOracleReportsCmd();
		cmd += " Destype=file paramform=no desformat=PDF";
		cmd += " module=" + reportPath.getAbsolutePath();
		cmd += " desname=" + tempFile.getAbsolutePath();

		for (Entry<String, Object> param : parametros.entrySet())
		{
			Object value = param.getValue();
			if (value instanceof Date)
				value = DateUtil.formatDMA((Date) value);
			/*** Colocar os parâmetros entre aspas causa erros no servidor Unix.
			else
				value = value.toString().replace('"', '\'');

			cmd += " \"p_" + param.getKey() + "=" + value + "\"";
			***/

			cmd += " p_" + param.getKey() + "=" + value;
		}

		log.debug("cmd: " + cmd);

		Process process = Runtime.getRuntime().exec(cmd);
		if (process.waitFor() != 0)
		{
			tempFile.delete();

			StringBuilder sb = new StringBuilder();
			String s;

			BufferedReader reader =
				new BufferedReader(new InputStreamReader(process.getErrorStream()));
			sb.append("--- stderr ---\n");
			while ((s = reader.readLine()) != null)
				sb.append(s + "\n");

			reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
			sb.append("\n--- stdout ---\n");
			while ((s = reader.readLine()) != null)
				sb.append(s + "\n");

			throw new Exception("Erro ao gerar relatório. Cmd: " + cmd + "\n" +
				sb.toString());
		}

		return tempFile;
	}
}

Att.

A

Bom galera agora ta quase la falta so um pouco rssss, ta dando outro erro unknown e o nome do field da minha tabela no momento que eu tento abrir o relatorio o codigo de abertura esta ai abaixo:

conexao conex = new conexao(); conex.conecta(); conex.executeSql("select * from bairro"); JRResultSetDataSource jrRS = new JRResultSetDataSource(conex.resultset); //supondo que o teu ficheiro teste.jasper esteja dentro da tiua aplicação URL arquivo = getClass().getResource("report2.jasper"); HashMap map = new HashMap(); JasperReport jasperReport = (JasperReport) JRLoader.loadObject(arquivo); //aqui, como não vais passar parâmetros para dentro do relatório, e porque estou a assumir que não tenhas ligação com base de dados, os dois ultimos parametros são nulos JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, map, jrRS); //isto mostra.te o viewer, penso que é a melhor maneira, pois assim a pessoa escolhe o formato em que quer gravar, e o sitio onde gravar JasperViewer jrviewer = new JasperViewer(jasperPrint, false); jrviewer.setVisible(true);

A

galera depois de muito apanhar e mecher e futricar e arrancar o cabelos ta resolvido abrindo relatorio!!!

M

Boa tarde!

Amigo, posta a solução que vc encontrou para esse problema!!

Att

A

na verdade esse ultimo erro foi distração mesmo eu tava chamando uma tabela e consultando outra ai não tava achando o campo que deveria achar rsssss

Criado 2 de dezembro de 2009
Ultima resposta 8 de dez. de 2009
Respostas 11
Participantes 4