Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 787F9200D6F for ; Mon, 1 Jan 2018 15:39:35 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id 76E0E160C25; Mon, 1 Jan 2018 14:39:35 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id BCA9B160C05 for ; Mon, 1 Jan 2018 15:39:34 +0100 (CET) Received: (qmail 9654 invoked by uid 500); 1 Jan 2018 14:39:34 -0000 Mailing-List: contact commits-help@poi.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@poi.apache.org Delivered-To: mailing list commits@poi.apache.org Received: (qmail 9645 invoked by uid 99); 1 Jan 2018 14:39:33 -0000 Received: from Unknown (HELO svn01-us-west.apache.org) (209.188.14.144) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 01 Jan 2018 14:39:33 +0000 Received: from svn01-us-west.apache.org (localhost [127.0.0.1]) by svn01-us-west.apache.org (ASF Mail Server at svn01-us-west.apache.org) with ESMTP id 5117D3A0256 for ; Mon, 1 Jan 2018 14:39:33 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1819773 - in /poi/trunk/src/ooxml: java/org/apache/poi/xssf/usermodel/XSSFSheet.java testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java Date: Mon, 01 Jan 2018 14:39:33 -0000 To: commits@poi.apache.org From: centic@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20180101143933.5117D3A0256@svn01-us-west.apache.org> archived-at: Mon, 01 Jan 2018 14:39:35 -0000 Author: centic Date: Mon Jan 1 14:39:33 2018 New Revision: 1819773 URL: http://svn.apache.org/viewvc?rev=1819773&view=rev Log: Bug 61543: do not fail with "part already exists" when tables are created/removed Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java?rev=1819773&r1=1819772&r2=1819773&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java Mon Jan 1 14:39:33 2018 @@ -3957,24 +3957,40 @@ public class XSSFSheet extends POIXMLDoc * Creates a new Table, and associates it with this Sheet */ public XSSFTable createTable() { - 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; - RelationPart rp = createRelationship(XSSFRelation.TABLE, XSSFFactory.getInstance(), tableNumber, false); - XSSFTable table = rp.getDocumentPart(); - tbl.setId(rp.getRelationship().getId()); - table.getCTTable().setId(tableNumber); + if(! worksheet.isSetTableParts()) { + worksheet.addNewTableParts(); + } - tables.put(tbl.getId(), table); + CTTableParts tblParts = worksheet.getTableParts(); + CTTablePart tbl = tblParts.addNewTablePart(); - return table; + // 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; + } + } + + break; + } + + 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); + + return table; } /** Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java?rev=1819773&r1=1819772&r2=1819773&view=diff ============================================================================== --- poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java (original) +++ poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java Mon Jan 1 14:39:33 2018 @@ -3231,4 +3231,25 @@ public final class TestXSSFBugs extends 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(); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org For additional commands, e-mail: commits-help@poi.apache.org