Bug 62740 - XSSFTable constructor automatically assigns invalid (non-unique) column IDs
fix the logic and update the unit test to check for and catch the problem. git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1841357 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
74c07d5307
commit
891deb3967
@ -283,7 +283,7 @@ public class XSSFTable extends POIXMLDocumentPart implements Table {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// check if name is unique and calculate unique column id
|
// check if name is unique and calculate unique column id
|
||||||
long nextColumnId = 1;
|
long nextColumnId = 0;
|
||||||
for (XSSFTableColumn tableColumn : getColumns()) {
|
for (XSSFTableColumn tableColumn : getColumns()) {
|
||||||
if (columnName != null && columnName.equalsIgnoreCase(tableColumn.getName())) {
|
if (columnName != null && columnName.equalsIgnoreCase(tableColumn.getName())) {
|
||||||
throw new IllegalArgumentException("Column '" + columnName
|
throw new IllegalArgumentException("Column '" + columnName
|
||||||
@ -291,6 +291,8 @@ public class XSSFTable extends POIXMLDocumentPart implements Table {
|
|||||||
}
|
}
|
||||||
nextColumnId = Math.max(nextColumnId, tableColumn.getId());
|
nextColumnId = Math.max(nextColumnId, tableColumn.getId());
|
||||||
}
|
}
|
||||||
|
// Bug #62740, the logic was just re-using the existing max ID, not incrementing beyond it.
|
||||||
|
nextColumnId++;
|
||||||
|
|
||||||
// Add the new Column
|
// Add the new Column
|
||||||
CTTableColumn column = columns.insertNewTableColumn(columnIndex);
|
CTTableColumn column = columns.insertNewTableColumn(columnIndex);
|
||||||
|
@ -19,6 +19,7 @@ package org.apache.poi.xssf.usermodel;
|
|||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertNotEquals;
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
import static org.junit.Assert.assertNull;
|
import static org.junit.Assert.assertNull;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
@ -395,15 +396,21 @@ public final class TestXSSFTable {
|
|||||||
assertEquals(2, table.getRowCount());
|
assertEquals(2, table.getRowCount());
|
||||||
|
|
||||||
// add columns
|
// add columns
|
||||||
table.createColumn("Column B");
|
XSSFTableColumn c1 = table.getColumns().get(0);
|
||||||
table.createColumn("Column D");
|
XSSFTableColumn cB = table.createColumn("Column B");
|
||||||
table.createColumn("Column C", 2); // add between B and D
|
XSSFTableColumn cD = table.createColumn("Column D");
|
||||||
|
XSSFTableColumn cC = table.createColumn("Column C", 2); // add between B and D
|
||||||
table.updateReferences();
|
table.updateReferences();
|
||||||
table.updateHeaders();
|
table.updateHeaders();
|
||||||
|
|
||||||
assertEquals(4, table.getColumnCount());
|
assertEquals(4, table.getColumnCount());
|
||||||
assertEquals(2, table.getRowCount());
|
assertEquals(2, table.getRowCount());
|
||||||
|
|
||||||
|
// column IDs start at 1, and increase in the order columns are added (see bug #62740)
|
||||||
|
assertEquals("Column c ID", 1, c1.getId());
|
||||||
|
assertTrue("Column B ID", c1.getId() < cB.getId());
|
||||||
|
assertTrue("Column D ID", cB.getId() < cD.getId());
|
||||||
|
assertTrue("Column C ID", cD.getId() < cC.getId());
|
||||||
assertEquals("Column 1", table.getColumns().get(0).getName()); // generated name
|
assertEquals("Column 1", table.getColumns().get(0).getName()); // generated name
|
||||||
assertEquals("Column B", table.getColumns().get(1).getName());
|
assertEquals("Column B", table.getColumns().get(1).getName());
|
||||||
assertEquals("Column C", table.getColumns().get(2).getName());
|
assertEquals("Column C", table.getColumns().get(2).getName());
|
||||||
|
Loading…
Reference in New Issue
Block a user