Gerar excel pelo ireport

2 respostas
G

Pessoal, estou tentando gerar um arquivo excel utilizando o ireport. Estou recebendo esse erro:

net.sf.jasperreports.engine.JRException: Error retrieving field value from bean : 
	at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getBeanProperty(JRAbstractBeanDataSource.java:123)
	at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getFieldValue(JRAbstractBeanDataSource.java:96)
	at net.sf.jasperreports.engine.data.JRBeanCollectionDataSource.getFieldValue(JRBeanCollectionDataSource.java:100)
	at net.sf.jasperreports.engine.fill.JRFillDataset.setOldValues(JRFillDataset.java:821)
	at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:785)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1482)
	at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:126)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:946)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:864)
	at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:84)
	at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:624)
	at br.gov.pgfn.scif.web.controller.LoteRemessaController.fecharLote(LoteRemessaController.java:178)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
	at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426)
	at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoSuchMethodException: Unknown property ''
	at org.apache.commons.beanutils.PropertyUtilsBean.getSimpleProperty(PropertyUtilsBean.java:1122)
	at org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUtilsBean.java:686)
	at org.apache.commons.beanutils.PropertyUtilsBean.getProperty(PropertyUtilsBean.java:715)
	at org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils.java:290)
	at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getBeanProperty(JRAbstractBeanDataSource.java:111)
	... 40 more
classe Servidor
@Entity
@Table(name="servidor")
public class Servidor extends AbstractBean implements Serializable {

	private static final long serialVersionUID = 7831737513880564868L;
	
	@Column(name="cpf", nullable=true, length=11)
	private String cpf;
	
	@NotEmpty
	@Column(name="nome", nullable=true, length=70)
	private String nome;

	//get e set
	
}
Aqui eu gero o Excel, quando o método fecharLote() é chamado, no corpo dele, chamo o método gerarXSL() que gera o excel:
@Controller
@RequestMapping(value="/lote-remessa-form")
public class LoteRemessaController extends AbstractController {
	
	@Autowired
	private LoteRemessaFacadeService loteRemessaFacadeProxy;
	
	@Autowired
	private ServidorFacadeService servidorFacadeProxy;
	
	protected final String fileSeparator = System.getProperty("file.separator");
	private static final Logger logger = Logger.getLogger(JasperReportGenerator.class);	
	
	
	@RequestMapping(value="/fecharLote", method=RequestMethod.POST)
	public String fecharLote(LoteRemessaFormBean loteRemessaFormBean, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response){
		
		LoteRemessa loteRemessa = loteRemessaFacadeProxy.pesquisaNumeroLote(loteRemessaFormBean.getNumeroLote());
		loteRemessa.setDtRemessa(new Date());
		loteRemessaFacadeProxy.saveOrUpdate(loteRemessa);
		
		gerarXSL(loteRemessa.getIdLoteRemessa(), response);
		
		carregaFormLotePosPersistencia(loteRemessaFormBean, request, loteRemessa);
		model.addAttribute("loteRemessaFormBean", loteRemessaFormBean);
		return "logged/loteRemessa";
		
	}    
  
    public void gerarXSL(Integer idLoteRemessa, HttpServletResponse response) {
		try {			
			JRXlsExporter exporterXLS = new JRXlsExporter();    	
			
			JasperReport jasperReport = (JasperReport) JRLoader.loadObject(getJasper());
			JasperPrint print = JasperFillManager.fillReport(jasperReport, null, getDataSource(idLoteRemessa));		

			ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

			exporterXLS.setParameter(JRXlsExporterParameter.JASPER_PRINT, print); 
			exporterXLS.setParameter(JRXlsExporterParameter.OUTPUT_STREAM, byteArrayOutputStream); 
			exporterXLS.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.TRUE); 
			exporterXLS.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE); 
			exporterXLS.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE); 
			exporterXLS.exportReport();
			response.reset();
			response.setContentType( "application/vnd.ms-excel" );
			response.setContentLength( byteArrayOutputStream.toByteArray().length );
			response.getOutputStream().write(byteArrayOutputStream.toByteArray());
			response.getOutputStream().flush();

    	} catch (JRException e) {
			logger.error(e);
			e.printStackTrace();
		} catch (IOException e) {			
			e.printStackTrace();
		} catch (SQLException e) {			
			e.printStackTrace();
		}

    }   
    
    public InputStream getJasper() throws IOException {
		return new ClassPathResource("jasper" + fileSeparator + "lote-remessa-excel"+".jasper").getInputStream();
	}
    
    public JRBeanCollectionDataSource getDataSource(Integer idLote) throws SQLException {
		return new JRBeanCollectionDataSource(getLista(idLote));		
	}
   
 private List<Servidor> getLista(Integer idLote){    	
    	List<Servidor> lista = new ArrayList<Servidor>();
    	for(Servidor serv : servidorFacadeProxy.getListaServidorLoteExcel(idLote)){
    		lista.add(serv);    		
    	}
    	return lista;
    }


}

Alguém poderia me ajudar para ver onde eu estou errando?

Obrigado!!!

2 Respostas

G

Resolvi o erro fazendo o seguinte:

Passei false no isUseFieldDescription quando criei o bean data source, ex.new JRBeanCollectionDataSource(getLista(idLote), false).

Só que agora, o excel esta aparecendo assim no sistema:


G

Consegui gerar o excel, gravando direto no disco.

Estava precisando fazer com que abrisse aquela janela que pergunta se vc quer abrir o arquivo ou fazer o download. Configurei o contentType para "application/vnd.ms-excel" e nada, alguém consegue visualizar porque não abre a janela?

Obrigado.

public void gerarXSL(Integer idLoteRemessa, HttpServletResponse response) {
    	try {
    		
			JasperReport jasperReport = (JasperReport) JRLoader.loadObject(getJasper());
			
			JasperPrint print = JasperFillManager.fillReport(jasperReport, null, getDataSource(idLoteRemessa));
	
	    	ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
	    	OutputStream outputfile= new FileOutputStream(new File("c://"+jasperReport.getName()+".xls")); 
	
	    	JRExporter exporterXLS = new JRXlsExporter();	    	
	    	exporterXLS.setParameter(JRXlsExporterParameter.JASPER_PRINT, print);
	    	exporterXLS.setParameter(JRXlsExporterParameter.OUTPUT_STREAM, byteArrayOutputStream);
	    	exporterXLS.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.TRUE); 
	    	exporterXLS.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE); 
	    	exporterXLS.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
	    	exporterXLS.setParameter(JRXlsExporterParameter.CHARACTER_ENCODING, "UTF-8");	    	
	    	exporterXLS.exportReport(); 
	    	
	    	response.reset();   
	    	response.setContentType("application/vnd.ms-excel");
			response.setHeader("Content-Disposition","attachment; filename="+jasperReport.getName()+".xls");
	    	response.setContentLength( byteArrayOutputStream.toByteArray().length );		
			response.addHeader("Pragma", "no-cache");
			response.addHeader("Cache-Control", "no-cache");
			response.setDateHeader("Expires", -1);
			
			outputfile.write(byteArrayOutputStream.toByteArray());
			byteArrayOutputStream.flush(); 
			byteArrayOutputStream.close();
			
    	} catch (JRException e) {
			logger.error(e);
			e.printStackTrace();
		} catch (IOException e) {			
			e.printStackTrace();
		} catch (SQLException e) {			
			e.printStackTrace();
		}

    }
Criado 4 de abril de 2013
Ultima resposta 9 de abr. de 2013
Respostas 2
Participantes 1