Flex - Gerar Relatorio JasperViewer no lado do cliente

9 respostas
A

Boa tarde.
Preciso gerar relatorio no JasperViewer no lado do cliente.
Consegui gerar apenas do lado do servidor…
Nao quero exibir em pdf, pois necessito que o usuario escolha o formato que quer salvar (doc, xls, rtf)…
Estou usando a biblioteca POI para salvar como xls…

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRPrintPage;
import net.sf.jasperreports.engine.JRRuntimeException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JasperViewer;
import br.gov.sp.polmil.framework.utils.MapUtil;
import flex.messaging.FlexContext;
import flex.messaging.FlexSession;

@SuppressWarnings("unchecked")
public class GenerateRTF{

	private String uuid;
	private String sessionid;
	private List<JasperPrint> jasperPrintList;

	public Object generate(Map<String, Object> params) {

		FlexSession session = FlexContext.getFlexSession();
		
		uuid = params.get("uuid").toString();
		
		sessionid = params.get("sessionid").toString();

		try {
			jasperPrintList = (List<JasperPrint>) session.getAttribute(sessionid);
		} catch (Exception e) {
		}
		
		if (jasperPrintList==null) {
			jasperPrintList = new ArrayList<JasperPrint>();
		}
		
		Map map = new HashMap();
		
		map.putAll(params);

		MapUtil.castToJRBean(map);

		jasperPrintList.add(gerarJasperPrint(map));

		session.setAttribute(sessionid, jasperPrintList);  // sessionid guarda a lista 

		byte[] pdf = gerarPDFArray();

		Boolean	isRemote = ((String)map.get("isRemote")).equalsIgnoreCase("true");
		
		if(isRemote){

			String contextRoot = FlexContext.getHttpRequest().getRequestURL().toString();
			
			contextRoot = contextRoot.substring(0,contextRoot.indexOf("messagebroker/amf"));

			session.setAttribute(uuid, pdf);  	// uuid guarda a imagem do report
								
			String url = contextRoot + "dynamic-pdf?id=" + uuid +"&jsessionid="+ sessionid;
					
			return url; 
			
		}else{
			
			return pdf;
		}
	}

	private JasperPrint gerarJasperPrint(Map map) {

		String jasperFile = (String)map.get("reportName");
		String pathJasper = ((String)map.get("pathJasper")) + jasperFile + ".jasper";
		JasperPrint jasperPrint = null;
		
		try {

			JasperReport jasperReport = (JasperReport) JRLoader.loadObject(pathJasper);
			
			//JREmptyDataSource ED = new JREmptyDataSource();   
						
			
			if (map.containsKey("REPORT_DATA_SOURCE")) {
				JRDataSource ds = (JRDataSource) map.get("REPORT_DATA_SOURCE");
				//jasperPrint = JasperFillManager.fillReport(jasperReport, map, ds);
				
				JasperPrint impressao = new JasperPrint();   
				impressao = JasperFillManager.fillReport(jasperReport, map, ds); 
				//JasperViewer viewer = new JasperViewer(impressao , false);     
				
				JasperViewer.viewReport(impressao, false);
				
								
			} else {
				jasperPrint = JasperFillManager.fillReport(jasperReport, map, new JREmptyDataSource());
			}
			
		
		}catch (JRException e) {
			
			e.printStackTrace();
			
		}catch (JRRuntimeException e) {
			
			System.out.println("ERRO NO JRXML");
			
			e.printStackTrace();
		}catch (Exception e) {
			
			e.printStackTrace();
		}
		
		return jasperPrint;
	}
	
	
	private byte[] gerarPDFArray(){

		JasperPrint jasperPrint = appendReports();

		byte[] pdf = null;
		
		try {
			
			pdf = JasperExportManager.exportReportToPdf(jasperPrint);
			
		} catch (JRException e) {

			e.printStackTrace();
			
		}
		
		return pdf;
	}
	
	private JasperPrint appendReports(){
		
		JasperPrint jasperPrint = null;
		JasperPrint pages = jasperPrintList.get(0);

		synchronized (pages)
		{
			if (jasperPrintList.size()>1) {

				jasperPrint = jasperPrintList.get(jasperPrintList.size()-1);
				
				List<JRPrintPage> list = jasperPrint.getPages();

				for (JRPrintPage jRPrintPage : list) {
					pages.addPage(jRPrintPage);
				}
			}
		}
		
		return pages;
	}
	

	
}

9 Respostas

drsmachado

Não entendi a dificuldade…

A

Como gerar em Flex, relatorio no JasperViewer no lado do cliente???

felipedamiani

cara, tais querendo gerar o relatório e abrir no visualizador do iReport?? se sim no flex não dá, no meu caso eu gero e o servidor manda o rel para o cliente baixar… pelo que já pesquisei sobre isso, tem umas ferramentas pra abrir pdf dentro do flex… achei meio gambiarra e pra mim não resolveu, pois tinha mais de um formato que podia ser gerado alem de pdf… a melhor solução que achei foi essa, mandar pro cliente baixar.

Abraço

A

Como faço esse tipo de relatório???
Alguem tem um exemplo passo a passo de como gerar relatorio para que o usuario escolha o padrao para salvar (doc, xls, pdf)

felipedamiani

cara, na tela do relatorio vc vai colocar por exemplo botões tipo radio para escolher a saida do relatório (pdf, rtf e txt), dae de acordo com a opção selecionada vc vai programar…
aqui tem um exemplo de como gerar .rtf: http://javafree.uol.com.br/topic-872233-Relatorio-rtf-com-JasperReports-RESOLVIDO.html

o .pdf tu já deve ter, e .txt tem aqui no guj tbm se não me engano.

A

Consegui salvar no formato para excel, utilizando export…

Como utilizo servlet para que o cliente possa salvar o arquivo em sua maquina e não no servidor…

package auditoria;

import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRAbstractExporter;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JRPrintPage;
import net.sf.jasperreports.engine.JRRuntimeException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.export.JExcelApiExporter;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.export.JRRtfExporter;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JasperViewer;
import flex.messaging.FlexContext;
import flex.messaging.FlexSession;

@SuppressWarnings("unchecked")
public class GenerateRTF{

	private String uuid;
	private String sessionid;
	private List<JasperPrint> jasperPrintList;

	public Object generate(Map<String, Object> params) {

		FlexSession session = FlexContext.getFlexSession();
		
		uuid = params.get("uuid").toString();
		
		sessionid = params.get("sessionid").toString();
//
		try {
			jasperPrintList = (List<JasperPrint>) session.getAttribute(sessionid);
		} catch (Exception e) {
		}
//		
		if (jasperPrintList==null) {
			jasperPrintList = new ArrayList<JasperPrint>();
		}
		
		Map map = new HashMap();
		
		map.putAll(params);

		MapUtil.castToJRBean(map);

		jasperPrintList.add(gerarJasperPrint(map));

		session.setAttribute(sessionid, jasperPrintList);  // sessionid guarda a lista 

		byte[] rtf = gerarRTFArray();

		Boolean	isRemote = ((String)map.get("isRemote")).equalsIgnoreCase("true");
		
		if(isRemote){

			String contextRoot = FlexContext.getHttpRequest().getRequestURL().toString();
			
			contextRoot = contextRoot.substring(0,contextRoot.indexOf("messagebroker/amf"));

			session.setAttribute(uuid, rtf);  	// uuid guarda a imagem do report
								
			String url = contextRoot + "dynamic-pdf?id=" + uuid +"&jsessionid="+ sessionid;
					
			return url; 
			
		}else{
			
			return rtf;
		}
	}

	private JasperPrint gerarJasperPrint(Map map) {

		String jasperFile = (String)map.get("reportName");
		String pathJasper = ((String)map.get("pathJasper")) + jasperFile + ".jasper";
		JasperPrint jasperPrint = null;
		
		try {

			JasperReport jasperReport = (JasperReport) JRLoader.loadObject(pathJasper);
						
			if (map.containsKey("REPORT_DATA_SOURCE")) {
				JRDataSource ds = (JRDataSource) map.get("REPORT_DATA_SOURCE");
				jasperPrint = JasperFillManager.fillReport(jasperReport, map, ds);
				
				JExcelApiExporter xlsExporter = new JExcelApiExporter();
				xlsExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
				xlsExporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,jasperFile+".xls");
				System.out.println("Exporting report...");
				xlsExporter.exportReport();
				System.out.println("Done!");
				
				
				
				
			} else {
				jasperPrint = JasperFillManager.fillReport(jasperReport, map, new JREmptyDataSource());
			}
			
		
		}catch (JRException e) {
			
			e.printStackTrace();
			
		}catch (JRRuntimeException e) {
			
			System.out.println("ERRO NO JRXML");
			
			e.printStackTrace();
		}catch (Exception e) {
			
			e.printStackTrace();
		}
		
		return jasperPrint;
	}
	
	
	private byte[] gerarRTFArray(){

		JasperPrint jasperPrint = appendReports();

		byte[] pdf = null;
		
		try {
			
			pdf = JasperExportManager.exportReportToPdf(jasperPrint);
			
		} catch (JRException e) {

			e.printStackTrace();
			
		}
		
		return pdf;
	}
	
	private JasperPrint appendReports(){
		
		JasperPrint jasperPrint = null;
		JasperPrint pages = jasperPrintList.get(0);

		synchronized (pages)
		{
			if (jasperPrintList.size()>1) {

				jasperPrint = jasperPrintList.get(jasperPrintList.size()-1);
				
				List<JRPrintPage> list = jasperPrint.getPages();

				for (JRPrintPage jRPrintPage : list) {
					pages.addPage(jRPrintPage);
				}
			}
		}
		
		return pages;
	}
	
}
luistiagos

Esqueça jasper… use o AlivePDF roda 100% em client
é muito bom pra gerar pdfs e csvs de maneira rapida…

http://alivepdf.bytearray.org/

A

O projeto já está utilizando o IReport, não posso voltar atrás…

Preciso salvar o arquivo no cliente, devo utilizar servlet???
Estou tentando com o codigo abaixo…

package auditoria;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
public class PDFResourceServlet extends HttpServlet { 
    private static final long serialVersionUID = 8178787853519803189L; 
 
    protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{ 
        
    	doPost(req, res); 
    } 
 
    protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
    	
        String id = (String)req.getParameter("id"); 
       
        if (id != null) {
        	
            HttpSession session = req.getSession(true); 
            
            try {
            	
                byte[] pdf = (byte[])session.getAttribute(id); 
 
                if (pdf != null){
                	
                	res.setHeader("Expires", "0");
                	res.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
                	res.setHeader("Pragma", "public");
                	res.setContentType("application/pdf"); 
                	
                    res.setContentLength(pdf.length); 
                    res.getOutputStream().write(pdf); 
                    session.invalidate();                 
                }else{
                	
                    res.setStatus(404); 
                } 
            }catch (Throwable t){
            	
                System.err.println(t.getMessage()); 
            } 
        } 
    } 
}
F

Entao, voce pode fazer o seguinte, criar um servico em Java para gerar um byte [], receber em flex com a classe ByteArray(), usar a classe FileReference em ActionScript para salvar no cliente em Flex :smiley: e se funcionar let me know :smiley:

Criado 28 de janeiro de 2011
Ultima resposta 10 de fev. de 2011
Respostas 9
Participantes 5