Erro ao gerar excel via jasper com java

Bom dia a todos!
Estou com erro ao tentar gerar um relatório via jasper.

    java.lang.NoSuchMethodError: org.apache.poi.hssf.usermodel.HSSFCellStyle.setFillPattern(S)V
    	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)
    	at javax.faces.component.UICommand.broadcast(UICommand.java:330)
    	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:870)
    	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1418)
    	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
    	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:670)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    	at org.ocpsoft.rewrite.servlet.RewriteFilter.doFilter(RewriteFilter.java:226)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712)
    	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:459)
    	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:384)
    	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
    	at org.ocpsoft.rewrite.servlet.impl.HttpRewriteResultHandler.handleResult(HttpRewriteResultHandler.java:42)
    	at org.ocpsoft.rewrite.servlet.RewriteFilter.rewrite(RewriteFilter.java:297)
    	at org.ocpsoft.rewrite.servlet.RewriteFilter.doFilter(RewriteFilter.java:198)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    	at br.com.ikponto.controle.sessao.Filtro.doFilter(Filtro.java:74)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367)
    	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860)
    	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1598)
    	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    	at java.lang.Thread.run(Unknown Source)
     private byte[] getBytesExcel(JasperPrint print) throws Exception {		
    		byte[] bytes = null;
    		ByteArrayOutputStream byteArrayOutputStream = null;
    		try {
    			byteArrayOutputStream = new ByteArrayOutputStream();
    			JRExporter exporterXLS = new JRXlsExporter();			
    			exporterXLS.setParameter(JRXlsExporterParameter.JASPER_PRINT, print);
    			exporterXLS.setParameter(JRXlsExporterParameter.OUTPUT_STREAM, byteArrayOutputStream);
    	        exporterXLS.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.TRUE);
    	        exporterXLS.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_COLUMNS, Boolean.TRUE);
    	        exporterXLS.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
    	        exporterXLS.setParameter(JRXlsExporterParameter.IS_COLLAPSE_ROW_SPAN, Boolean.TRUE);
    	        exporterXLS.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE);
    	        exporterXLS.setParameter(JRXlsExporterParameter.MAXIMUM_ROWS_PER_SHEET, 65000);
    	        Map<String,String> formats = new HashMap<String, String>();
    	        // Key - Formato Java, Value - Formato Externo
    	        formats.put("hh:mm:ss","[h]:mm:ss");	      
    	        exporterXLS.setParameter(JRXlsExporterParameter.FORMAT_PATTERNS_MAP, formats);			
    			exporterXLS.exportReport();
    			bytes = byteArrayOutputStream.toByteArray();
    		} catch (Exception e) {
    			logg.error("Erro ao gerar os bytes", e);
    			throw new Exception(e);
    		}
    		finally {
    			if(byteArrayOutputStream != null) {
    				byteArrayOutputStream.close();
    			}
    		}
    		return bytes;
    	}

Parece um problema de versão de lib, pois não foi encontrado o método setFillPattern na classe HSSFCellStyle.

Estou usando a versão POI 3.17 e Ireport 5.1.

Vc está usando algum gerenciador de dependência como o maven ou gradle no seu projeto?

Não.

Vc consegue listar aqui todos os jars que estão sendo usados no projeto? Pode ser que tenha mais de uma versão do apachepoi no classpath e uma versão errada tenha sido utilizada.

Qual a versão do jasperreports que vc está usando? Parece que o jasperreports usa o apache-poi por debaixo do capô. Bem capaz que vc tenha que usar uma versão específica de acordo com a versão do jasperreports que estiver usando.

Com um gerenciador de dependência, isso seria resolvido pra vc, mas como vc está adicionando as dependencias manualmente, tem que ter cuidado com esses detalhes.

Estou usando a versão do jasper 5.1.0.

De acordo com: https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports/5.1.0, essa versão do jasperreports usa o apache-poi 3.7. Tente alterar o jar do apache-poi para essa versão para ver se funciona.

Esse projeto é legado, faz sentido o que você me disse sobre a versão.
Acabei de vê que as libs do jasper que estão no sistema são da versão 5.0.0, vou baixar essa versão do Ireporte e testar.

Lembrando que o ireport é uma coisa, e a lib jasperreports é outra coisa ok. Vc soh precisa mudar a lib do jasperreports.

Ok

Lucas, obrigado!
Fiz o que você falou e funcionou.

1 curtida