Tuesday, April 24, 2018

Apache POI 3.17 with Groovy/Grapes kept reporting javax.xml.stream.FactoryConfigurationError: Provider com.bea.xml.stream.EventFactory not found

Like this:
Caught: javax.xml.stream.FactoryConfigurationError: Provider com.bea.xml.stream.EventFactory not found
javax.xml.stream.FactoryConfigurationError: Provider com.bea.xml.stream.EventFactory not found
 at org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesMarshaller.(PackagePropertiesMarshaller.java:41)
 at org.apache.poi.openxml4j.opc.OPCPackage.init(OPCPackage.java:161)
 at org.apache.poi.openxml4j.opc.OPCPackage.(OPCPackage.java:141)
 at org.apache.poi.openxml4j.opc.ZipPackage.(ZipPackage.java:97)
 at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:324)
 at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:184)
 at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:149)
 at org.apache.poi.ss.usermodel.WorkbookFactory$create.call(Unknown Source)
 at poitest.run(poitest.groovy:14)
 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Solution here. This works:
@GrabConfig(systemClassLoader=true)
@Grapes([
   @Grab(group='org.apache.poi', module='poi', version='3.17'),
   @Grab(group='org.apache.poi', module='poi-ooxml', version='3.17'),
   @Grab(group='org.apache.poi', module='ooxml-schemas', version='1.3'),
   @Grab(group='com.fasterxml', module='aalto-xml', version='1.1.0') 
])

import org.apache.poi.ss.usermodel.*
import org.apache.poi.ss.usermodel.WorkbookFactory

System.setProperty("javax.xml.stream.XMLInputFactory", "com.fasterxml.aalto.stax.InputFactoryImpl")
System.setProperty("javax.xml.stream.XMLOutputFactory", "com.fasterxml.aalto.stax.OutputFactoryImpl")
System.setProperty("javax.xml.stream.XMLEventFactory", "com.fasterxml.aalto.stax.EventFactoryImpl")

Workbook wb = WorkbookFactory.create(new FileInputStream("./blah.xlsx"))
println wb.dump()