You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@poi.apache.org by XU JINGCHENG <xu...@gmail.com> on 2017/09/20 06:37:46 UTC

POI Table Remove after Creation bugs ?

Hey POI Devs



I am facing a issue when try to remove a XSSF Table after creating one.



Here is my test case with manual print out result.



    Create 3 tables on a single sheet.



     [java] Create Table Name: /xl/tables/table1.xml - Content Type:
application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml

     [java] Create Table Name: /xl/tables/table2.xml - Content Type:
application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml

     [java] Create Table Name: /xl/tables/table3.xml - Content Type:
application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml



Delete table2



    [java] Tables before deletion Name: /xl/tables/table1.xml - Content
Type: application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml

     [java] Tables before deletion Name: /xl/tables/table2.xml - Content
Type: application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml

     [java] Tables before deletion Name: /xl/tables/table3.xml - Content
Type: application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml



     [java] Tables after deletion Name: /xl/tables/table1.xml - Content
Type: application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml

     [java] Tables after deletion Name: /xl/tables/table3.xml - Content
Type: application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml



Create a new table table and it throws exception as below

org.apache.poi.openxml4j.exceptions.PartAlreadyExistsException: A part with
the name '/xl/tables/table3.xml' already exists : Packages shall not
contain equivalent part names and package implementers shall neither create
nor recognize packages with equivalent part names. [M1.12]



Looks like it tries to re-use table3.xml which is already exists.



When I look into the code, this line.

XSSFSheet line 3971

int tableNumber =
getPackagePart().getPackage().getPartsByContentType(XSSFRelation.TABLE.getContentType()).size()
+ 1;



Use the size of tables as the next index which will cause conflict if there
is a delete after creation.