0

I am trying to use JXLS with my custom evaluator for Excel downloads, following this official page.

I have no clue why is it not providing me Transformer object. Trying to figure out from exceptions since a long time but unable to resolve it.

Excel:

enter image description here

Maven:

<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls</artifactId>
    <version>2.4.3</version>
</dependency>
<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls-poi</artifactId>
    <version>1.0.14</version>
</dependency>

Java:

InputStream is2 = new FileInputStream("C:/Users/User/Downloads/ExcelTest.xlsx");
OutputStream os = new FileOutputStream("C:/Users/User/Downloads/ExcelTest_Out.xlsx");

Transformer transformer = TransformerFactory.createTransformer(is2, os); // this throws error and returns null object
ExpressionEvaluator evaluator = new IMCScriptEvaluator(ctx);

transformer.getTransformationConfig().setExpressionEvaluator(evaluator);

Exception trace:

11:23:15.496 [tomcat-http--35] ERROR org.jxls.util.TransformerFactory - Method createTransformer of org.jxls.transform.poi.PoiTransformer class thrown an Exception java.lang.reflect.InvocationTargetException: null at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_144] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_144] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_144] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_144] at org.jxls.util.TransformerFactory.createTransformer(TransformerFactory.java:35) ~[jxls-2.4.3.jar:na] at com.imc.iss.web.report.impl.JXLSFiller.generateWorkbook(JXLSFiller.java:411) [core-0.0.2-SNAPSHOT.jar:0.0.2-SNAPSHOT] at . . . [core-0.0.2-SNAPSHOT.jar:0.0.2-SNAPSHOT] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_144] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_144] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_144] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_144] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) [spring-web-4.2.0.RELEASE.jar:4.2.0.RELEASE] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) [spring-web-4.2.0.RELEASE.jar:4.2.0.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:111) [spring-webmvc-4.2.0.RELEASE.jar:4.2.0.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:806) [spring-webmvc-4.2.0.RELEASE.jar:4.2.0.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:729) [spring-webmvc-4.2.0.RELEASE.jar:4.2.0.RELEASE] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) [spring-webmvc-4.2.0.RELEASE.jar:4.2.0.RELEASE] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) [spring-webmvc-4.2.0.RELEASE.jar:4.2.0.RELEASE] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) [spring-webmvc-4.2.0.RELEASE.jar:4.2.0.RELEASE] at com.imc.iss.web.config.IssDispatcherServlet.doService(IssDispatcherServlet.java:36) [core-0.0.2-SNAPSHOT.jar:0.0.2-SNAPSHOT] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) [spring-webmvc-4.2.0.RELEASE.jar:4.2.0.RELEASE] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) [spring-webmvc-4.2.0.RELEASE.jar:4.2.0.RELEASE] at javax.servlet.http.HttpServlet.service(HttpServlet.java:635) [servlet-api.jar:na] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) [spring-webmvc-4.2.0.RELEASE.jar:4.2.0.RELEASE] at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) [servlet-api.jar:na] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [catalina.jar:na] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:na] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-websocket.jar:8.5.23-dev] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:na] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:na] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85) [spring-web-4.2.0.RELEASE.jar:4.2.0.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.2.0.RELEASE.jar:4.2.0.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:na] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:na] at com.sap.ui5.resource.AppCacheBusterFilter.doFilter(AppCacheBusterFilter.java:191) [resource-1.38.4.jar:na] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:na] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:na] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:316) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:122) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:169) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:48) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java:158) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.2.0.RELEASE.jar:4.2.0.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:133) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:205) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java:158) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.2.0.RELEASE.jar:4.2.0.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:120) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:91) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:53) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.2.0.RELEASE.jar:4.2.0.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:213) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:176) [spring-security-web-4.0.2.RELEASE.jar:4.0.2.RELEASE] at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) [spring-web-4.2.0.RELEASE.jar:4.2.0.RELEASE] at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) [spring-web-4.2.0.RELEASE.jar:4.2.0.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:na] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:na] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) [catalina.jar:na] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [catalina.jar:na] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) [catalina.jar:na] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [catalina.jar:na] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) [catalina.jar:na] at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650) [catalina.jar:na] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [catalina.jar:na] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [catalina.jar:na] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) [tomcat-coyote.jar:8.5.23-dev] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-coyote.jar:8.5.23-dev] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-coyote.jar:8.5.23-dev] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) [tomcat-coyote.jar:8.5.23-dev] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-coyote.jar:8.5.23-dev] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_144] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_144] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:8.5.23-dev] at java.lang.Thread.run(Thread.java:808) [na:1.8.0_144] Caused by: java.lang.NoClassDefFoundError: org/jxls/transform/poi/PoiCellData$1 : cannot initialize class because prior initialization attempt failed at org.jxls.transform.poi.PoiCellData.readCellContents(PoiCellData.java:88) ~[jxls-poi-1.0.14.jar:na] at org.jxls.transform.poi.PoiCellData.readCell(PoiCellData.java:54) ~[jxls-poi-1.0.14.jar:na] at org.jxls.transform.poi.PoiCellData.createCellData(PoiCellData.java:47) ~[jxls-poi-1.0.14.jar:na] at org.jxls.transform.poi.PoiRowData.createRowData(PoiRowData.java:26) ~[jxls-poi-1.0.14.jar:na] at org.jxls.transform.poi.PoiSheetData.createSheetData(PoiSheetData.java:28) ~[jxls-poi-1.0.14.jar:na] at org.jxls.transform.poi.PoiTransformer.readCellData(PoiTransformer.java:117) ~[jxls-poi-1.0.14.jar:na] at org.jxls.transform.poi.PoiTransformer.createTransformer(PoiTransformer.java:71) ~[jxls-poi-1.0.14.jar:na] at org.jxls.transform.poi.PoiTransformer.createTransformer(PoiTransformer.java:66) ~[jxls-poi-1.0.14.jar:na] at org.jxls.transform.poi.PoiTransformer.createTransformer(PoiTransformer.java:58) ~[jxls-poi-1.0.14.jar:na] ... 106 common frames omitted Caused by: java.lang.NoClassDefFoundError: org/apache/poi/ss/usermodel/CellType at org.jxls.transform.poi.PoiCellData$1.(PoiCellData.java:88) ~[jxls-poi-1.0.14.jar:na] at org.jxls.transform.poi.PoiCellData.readCellContents(PoiCellData.java:88) ~[jxls-poi-1.0.14.jar:na] at org.jxls.transform.poi.PoiCellData.readCell(PoiCellData.java:54) ~[jxls-poi-1.0.14.jar:na] at org.jxls.transform.poi.PoiCellData.createCellData(PoiCellData.java:47) ~[jxls-poi-1.0.14.jar:na] at org.jxls.transform.poi.PoiRowData.createRowData(PoiRowData.java:26) ~[jxls-poi-1.0.14.jar:na] at org.jxls.transform.poi.PoiSheetData.createSheetData(PoiSheetData.java:28) ~[jxls-poi-1.0.14.jar:na] at org.jxls.transform.poi.PoiTransformer.readCellData(PoiTransformer.java:117) ~[jxls-poi-1.0.14.jar:na] at org.jxls.transform.poi.PoiTransformer.createTransformer(PoiTransformer.java:71) ~[jxls-poi-1.0.14.jar:na] at org.jxls.transform.poi.PoiTransformer.createTransformer(PoiTransformer.java:66) ~[jxls-poi-1.0.14.jar:na] at org.jxls.transform.poi.PoiTransformer.createTransformer(PoiTransformer.java:58) ~[jxls-poi-1.0.14.jar:na] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_144] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_144] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_144] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_144] at org.jxls.util.TransformerFactory.createTransformer(TransformerFactory.java:35) ~[jxls-2.4.3.jar:na] at com.imc.iss.web.report.impl.JXLSFiller.generateWorkbook(JXLSFiller.java:409) [core-0.0.2-SNAPSHOT.jar:0.0.2-SNAPSHOT] at com.imc.iss.web.report.impl.JXLSFiller.generateQuoteBasedWorkbook(JXLSFiller.java:364) [core-0.0.2-SNAPSHOT.jar:0.0.2-SNAPSHOT] at com.imc.iss.web.report.impl.JXLSFiller.access$1(JXLSFiller.java:338) [core-0.0.2-SNAPSHOT.jar:0.0.2-SNAPSHOT] at com.imc.iss.web.report.impl.JXLSFiller$1.execute(JXLSFiller.java:168) [core-0.0.2-SNAPSHOT.jar:0.0.2-SNAPSHOT] at com.imc.iss.web.report.impl.JXLSFiller$1.execute(JXLSFiller.java:1) [core-0.0.2-SNAPSHOT.jar:0.0.2-SNAPSHOT] at ... 116 common frames omitted

Pratik
  • 908
  • 2
  • 11
  • 34
  • this seems to be a dependency issue. Your code is trying to call a method that is missing. I looked at the version available, and I could only find one more recent version for jxls (2.4.4). If that does not work, you will need to do some debugging and some version digging – Whitefret May 04 '18 at 04:10
  • @Whitefret Could you please elaborate a bit for me to understand exact issue? – Pratik May 04 '18 at 04:15
  • @Whitefret Also I can't find 2.4.4 version release news on official page. – Pratik May 04 '18 at 04:19
  • https://mvnrepository.com/artifact/org.jxls/jxls/2.4.4 for the latest release – Whitefret May 04 '18 at 04:21
  • 1
    I have looked a bit into it. It seems jxls-poi uses apache poi behind it. Problem seems to come from a wrong apache-poi deps but I can't be sure. Try to import manually apache-poi to your project https://mvnrepository.com/artifact/org.apache.poi/poi, version 3.17 – Whitefret May 04 '18 at 04:29
  • @Whitefret Thanks, You were right. Multiple versions of dependencies were creating an issue, would you like to answer the question? So that I can accept it? :) – Pratik May 07 '18 at 08:03
  • 1
    you can take the credit for it, you are the one that spent time on it ;) – Whitefret May 14 '18 at 10:37

1 Answers1

0

Multiple versions of same Apache POI dependency was creating an issue.

Internally JXLS also uses Apache POI, which was also explicitly added into the dependency of the project, which had version conflict.

Hence skipping the JXLS Apache-POI and upgrading existing one with latest (As per need of JXLS dependency) made it work.

Pratik
  • 908
  • 2
  • 11
  • 34