Bug 64473

Summary: OPCPackage.open(fileName, PackageAccess.READ) does not open valid xlsx file
Product: POI Reporter: Eugene <berek>
Component: OPCAssignee: POI Developers List <dev>
Status: NEW ---    
Severity: blocker    
Priority: P2    
Version: 4.1.2-FINAL   
Target Milestone: ---   
Hardware: PC   
OS: All   
Attachments: corrupted file

Description Eugene 2020-05-27 09:55:39 UTC
Created attachment 37268 [details]
corrupted file

Contents of the unpacked xlsx file and apache poi

The initial problem is the inability to open the xlsx file through poi (OPCPackage.open(fileName, PackageAccess.READ)), while in Excel it opens.

A detailed study of the poi showed that the problem lies in the contents of the xlsx file.
If you unzip xslx file, then in the xl folder, in addition to all other files there will be two due to which there is a problem


when using poi method OPCPackage.open(fileName, PackageAccess.READ) this leads to an error:

org.apache.poi.openxml4j.exceptions.InvalidFormatException: You can't add a part with a part name derived from another part ! [M1.11]

which occurs due to the same file names in PackagePartCollection.put method.

If I just copy the contents of the entire xlsx file to a new created xlsx file and save it, then the xl/metadata file will not be there and it will open through poi well.
But I don’t have the task of just fixing the file, I need to figure out why this problem could arise.

it looks like a slightly incorrect xlsx, but I can still open it through exel, is there any way to open it through poi?
Is there any idea about the occurrence of xl/metadata in the contents of the xlsx?
Comment 1 Eugene 2020-05-27 12:43:13 UTC
Also pay attention to the documentation. I found only the draft version, but I think that the difference there is not big.


item Part Naming 

A package implementer shall neither create nor recognize a part with apart name derived from another part name by appending segments to it. [M1.11][Example:If a package contains a part named“/segment1/segment2/.../segmentn”, then other parts in that packageshall not have names such as: “/segment1”, “segment1/segment2”, or “/segment1/segment2/.../segmentn-1”. endexample]

But also look at the item:

9.1.1 Part Names
Each part has a name. Part namesrefer to parts within a package. [Example:The part name “/hello/world/doc.xml” contains three segments: “hello”, “world”, and “doc.xml”.The first two segments in the sample represent levelsin the logical hierarchy and serve to organize the parts of the package, whereas the 
ECMA-376 Part214third contains actual content.Note that segments are not explicitly representedas foldersin the package model, and no directory of folders exists in the package model.end example]

In this example, “doc.xml” the name of this file is considered along with the extension, whereas in the POI in the class PackagePartCollection in method PackagePart put (final PackagePartName partName, final PackagePart part)

Comparison is made only by file names, not considering their extension, which is possibly a mistake.
Comment 2 PJ Fanning 2020-05-27 13:04:04 UTC
It's possible we'll change POI code but the next release could be weeks away.

It's worth investigating where your xlsx file came from to find out why its contents are not standard.