]> source.dussan.org Git - poi.git/commitdiff
Bug 61543: do not fail with "part already exists" when tables are created/removed
authorDominik Stadler <centic@apache.org>
Mon, 1 Jan 2018 14:39:33 +0000 (14:39 +0000)
committerDominik Stadler <centic@apache.org>
Mon, 1 Jan 2018 14:39:33 +0000 (14:39 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1819773 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java

index 75eb69b76f35f153840b69134651aabf85fd925f..259c31445edd51c1e3cd23db407474b587be8ad9 100644 (file)
@@ -3957,24 +3957,40 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet  {
      * Creates a new Table, and associates it with this Sheet
      */
     public XSSFTable createTable() {
-       if(! worksheet.isSetTableParts()) {
-          worksheet.addNewTableParts();
-       }
+        if(! worksheet.isSetTableParts()) {
+            worksheet.addNewTableParts();
+        }
+
+        CTTableParts tblParts = worksheet.getTableParts();
+        CTTablePart tbl = tblParts.addNewTablePart();
+
+        // Table numbers need to be unique in the file, not just
+        //  unique within the sheet. Find the next one
+        int tableNumber = getPackagePart().getPackage().getPartsByContentType(XSSFRelation.TABLE.getContentType()).size() + 1;
+
+        // the id could already be taken after insertion/deletion of different tables
+        outerloop:
+        while(true) {
+            for (PackagePart packagePart : getPackagePart().getPackage().getPartsByContentType(XSSFRelation.TABLE.getContentType())) {
+                String fileName = XSSFRelation.TABLE.getFileName(tableNumber);
+                if(fileName.equals(packagePart.getPartName().getName())) {
+                    // duplicate found, increase the number and start iterating again
+                    tableNumber++;
+                    continue outerloop;
+                }
+            }
 
-       CTTableParts tblParts = worksheet.getTableParts();
-       CTTablePart tbl = tblParts.addNewTablePart();
+            break;
+        }
 
-       // Table numbers need to be unique in the file, not just
-       //  unique within the sheet. Find the next one
-       int tableNumber = getPackagePart().getPackage().getPartsByContentType(XSSFRelation.TABLE.getContentType()).size() + 1;
-       RelationPart rp = createRelationship(XSSFRelation.TABLE, XSSFFactory.getInstance(), tableNumber, false);
-       XSSFTable table = rp.getDocumentPart();
-       tbl.setId(rp.getRelationship().getId());
-       table.getCTTable().setId(tableNumber);
+        RelationPart rp = createRelationship(XSSFRelation.TABLE, XSSFFactory.getInstance(), tableNumber, false);
+        XSSFTable table = rp.getDocumentPart();
+        tbl.setId(rp.getRelationship().getId());
+        table.getCTTable().setId(tableNumber);
 
-       tables.put(tbl.getId(), table);
+        tables.put(tbl.getId(), table);
 
-       return table;
+        return table;
     }
 
     /**
index f5a51c100be1029ef82211b894d9e0cc6e1efa44..131b441d64a298ab84e2082b5c6a9cf30e313a48 100644 (file)
@@ -3231,4 +3231,25 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
             assertEquals("AND($A1>=EDATE($D$6,3),$B1>0)", rules.get(0).getFormula1());
         }
     }
+
+    @Test
+    public void test61543() throws IOException {
+        XSSFWorkbook wb = new XSSFWorkbook();
+
+        XSSFSheet sheet = wb.createSheet();
+        XSSFTable table1 = sheet.createTable();
+        XSSFTable table2 = sheet.createTable();
+        XSSFTable table3 = sheet.createTable();
+
+        sheet.removeTable(table1);
+
+        sheet.createTable();
+
+        sheet.removeTable(table2);
+        sheet.removeTable(table3);
+
+        sheet.createTable();
+
+        wb.close();
+    }
 }