Search code examples
docx4j

Docx4j 6.1.2 - Convert Flat Open XML to Xlsx


I can create a Flat OPC XML File from an Xlsx using following code:

SpreadsheetMLPackage spreadsheetMLPackage = SpreadsheetMLPackage.load(new File("test.xlsx"));
FlatOpcXmlCreator flatOpcXmlCreator = new FlatOpcXmlCreator(spreadsheetMLPackage);
String flatOpcXml = org.docx4j.XmlUtils.marshaltoString(flatOpcXmlCreator.get(), false, true, org.docx4j.jaxb.Context.jcXmlPackage);
Files.write(Path.of("testFlatOpc.xml"), flatOpcXml.getBytes(), StandardOpenOption.CREATE, StandardOpenOption.WRITE);

but if I now try to read the generated Flat OPC XML in order to convert it back to an Xlsx using following code

FlatOpcXmlImporter flatOpcXmlImporter = new FlatOpcXmlImporter(new FileInputStream("testFlatOpc.xml"));
OpcPackage opcPackage = flatOpcXmlImporter.get();

the flatOpcXmlImporter.get() call throws following Exception:

org.docx4j.openpackaging.exceptions.Docx4JException: Failed to add parts from relationships
    at org.docx4j.convert.in.FlatOpcXmlImporter.addPartsFromRelationships(FlatOpcXmlImporter.java:297)
    at org.docx4j.convert.in.FlatOpcXmlImporter.get(FlatOpcXmlImporter.java:221)
    at at.apa.psp.TestExcel.main(TestExcel.java:38)
Caused by: org.docx4j.openpackaging.exceptions.Docx4JException: Failed to getPart
    at org.docx4j.convert.in.FlatOpcXmlImporter.getRawPart(FlatOpcXmlImporter.java:659)
    at org.docx4j.convert.in.FlatOpcXmlImporter.getRawPart(FlatOpcXmlImporter.java:426)
    at org.docx4j.convert.in.FlatOpcXmlImporter.getPart(FlatOpcXmlImporter.java:365)
    at org.docx4j.convert.in.FlatOpcXmlImporter.addPartsFromRelationships(FlatOpcXmlImporter.java:295)
    ... 2 more
Caused by: javax.xml.bind.JAXBException: Preprocessing exception
 - with linked exception:
[javax.xml.bind.UnmarshalException: unerwartetes Element (URI:"http://schemas.openxmlformats.org/spreadsheetml/2006/main", lokal:"workbook"). Erwartete Elemente sind <{http://schemas.openxmlformats.org/markup-compatibility/2006}AlternateContent>, ...
at org.docx4j.openpackaging.parts.JaxbXmlPartXPathAware.unmarshal(JaxbXmlPartXPathAware.java:707)
at org.docx4j.convert.in.FlatOpcXmlImporter.getRawPart(FlatOpcXmlImporter.java:515)
... 5 more
Caused by: javax.xml.bind.UnmarshalException: unerwartetes Element (URI:"http://schemas.openxmlformats.org/spreadsheetml/2006/main", lokal:"workbook"). Erwartete Elemente sind ...
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:662)
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:258)
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:253)
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:120)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1063)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:498)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:480)
    at com.sun.xml.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(InterningXmlVisitor.java:75)
    at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:150)

Should it be possibly to convert Flat OPC XML to an Excel using Docx4j 6.1.2?

Why does the FlatOpcXmlCreator write Namespaces the FlatOpcXmlImporter cannot read?

If it is not possible with docx4j, would there be any alternatives to create an Excel from a Flat OPC XML?


Solution

  • This is now fixed by https://github.com/plutext/docx4j/commit/f5f8b2c9caa9a3d8d339b74e7e878d19c56ad526

    This will be in the next 8.1.x release, or you could patch 6.1.2 with that fix yourself.