From 1f691642c3388afdcb0203bc392d32f706f371c9 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Wed, 9 Jan 2008 14:27:51 +0000 Subject: [PATCH] Fix bug #43008, by deprecating setCellNum() on HSSFCell, and adding moveCell() to HSSFRow, which correctly updates all the references git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@610392 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/changes.xml | 1 + src/documentation/content/xdocs/status.xml | 1 + .../apache/poi/hssf/usermodel/HSSFCell.java | 40 +++++++++++++--- .../apache/poi/hssf/usermodel/HSSFRow.java | 46 +++++++++++++++---- .../poi/hssf/usermodel/TestHSSFRow.java | 45 +++++++++++++++++- 5 files changed, 114 insertions(+), 19 deletions(-) diff --git a/src/documentation/content/xdocs/changes.xml b/src/documentation/content/xdocs/changes.xml index 4548b63bc..e77b99fee 100644 --- a/src/documentation/content/xdocs/changes.xml +++ b/src/documentation/content/xdocs/changes.xml @@ -36,6 +36,7 @@ + 43008 - Add a moveCell method to HSSFRow, and deprecate setCellNum(), which didn't update things properly 43058 - Support setting row grouping on files from CR IX, which lack GutsRecords 31795 - Support cloning of sheets with certain drawing objects on them 43902 - Don't consider merged regions when auto-sizing columns diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 5a0461620..3ccb4ddd1 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -33,6 +33,7 @@ + 43008 - Add a moveCell method to HSSFRow, and deprecate setCellNum(), which didn't update things properly 43058 - Support setting row grouping on files from CR IX, which lack GutsRecords 31795 - Support cloning of sheets with certain drawing objects on them 43902 - Don't consider merged regions when auto-sizing columns diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java b/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java index 9cc455071..b3b4fc929 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java @@ -24,17 +24,33 @@ */ package org.apache.poi.hssf.usermodel; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; + import org.apache.poi.hssf.model.FormulaParser; import org.apache.poi.hssf.model.Sheet; import org.apache.poi.hssf.model.Workbook; -import org.apache.poi.hssf.record.*; +import org.apache.poi.hssf.record.BlankRecord; +import org.apache.poi.hssf.record.BoolErrRecord; +import org.apache.poi.hssf.record.CellValueRecordInterface; +import org.apache.poi.hssf.record.CommonObjectDataSubRecord; +import org.apache.poi.hssf.record.ExtendedFormatRecord; +import org.apache.poi.hssf.record.FormulaRecord; +import org.apache.poi.hssf.record.LabelSSTRecord; +import org.apache.poi.hssf.record.NoteRecord; +import org.apache.poi.hssf.record.NumberRecord; +import org.apache.poi.hssf.record.ObjRecord; +import org.apache.poi.hssf.record.Record; +import org.apache.poi.hssf.record.SubRecord; +import org.apache.poi.hssf.record.TextObjectRecord; +import org.apache.poi.hssf.record.UnicodeString; import org.apache.poi.hssf.record.aggregates.FormulaRecordAggregate; import org.apache.poi.hssf.record.formula.Ptg; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.*; - /** * High level representation of a cell in a row of a spreadsheet. * Cells can be numeric, formula-based or string-based (text). The cell type @@ -266,14 +282,24 @@ public class HSSFCell } /** - * set the cell's number within the row (0 based) + * Set the cell's number within the row (0 based). * @param num short the cell number + * @deprecated Doesn't update the row's idea of what cell this is, use {@link HSSFRow#moveCell(HSSFCell, short)} instead */ - public void setCellNum(short num) { record.setColumn(num); } + + /** + * Updates the cell record's idea of what + * column it belongs in (0 based) + * @param num the new cell number + */ + protected void updateCellNum(short num) + { + record.setColumn(num); + } /** * get the cell's number within the row diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java b/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java index 6cea11fa0..ae5727bc6 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java @@ -22,15 +22,14 @@ */ package org.apache.poi.hssf.usermodel; +import java.util.Iterator; +import java.util.NoSuchElementException; + import org.apache.poi.hssf.model.Sheet; import org.apache.poi.hssf.model.Workbook; import org.apache.poi.hssf.record.CellValueRecordInterface; import org.apache.poi.hssf.record.RowRecord; -import java.util.HashMap; -import java.util.Iterator; -import java.util.NoSuchElementException; - /** * High level representation of a row of a spreadsheet. * @@ -157,11 +156,15 @@ public class HSSFRow * remove the HSSFCell from this row. * @param cell to remove */ - public void removeCell(HSSFCell cell) - { - CellValueRecordInterface cval = cell.getCellValueRecord(); - - sheet.removeValueRecord(getRowNum(), cval); + public void removeCell(HSSFCell cell) { + removeCell(cell, true); + } + private void removeCell(HSSFCell cell, boolean alsoRemoveRecords) { + if(alsoRemoveRecords) { + CellValueRecordInterface cval = cell.getCellValueRecord(); + sheet.removeValueRecord(getRowNum(), cval); + } + short column=cell.getCellNum(); if(cell!=null && column newColumn && cells[newColumn] != null) { + throw new IllegalArgumentException("Asked to move cell to column " + newColumn + " but there's already a cell there"); + } + + // Check it's one of ours + if(! cells[cell.getCellNum()].equals(cell)) { + throw new IllegalArgumentException("Asked to move a cell, but it didn't belong to our row"); + } + + // Move the cell to the new position + // (Don't remove the records though) + removeCell(cell, false); + cell.updateCellNum(newColumn); + addCell(cell); + } /** * used internally to add a cell. */ - private void addCell(HSSFCell cell) { short column=cell.getCellNum(); diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFRow.java b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFRow.java index 92844da89..44c03cd20 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFRow.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFRow.java @@ -102,8 +102,49 @@ public class TestHSSFRow file.delete(); assertEquals(-1, sheet.getRow((short) 0).getLastCellNum()); assertEquals(-1, sheet.getRow((short) 0).getFirstCellNum()); - - + } + + public void testMoveCell() throws Exception { + HSSFWorkbook workbook = new HSSFWorkbook(); + HSSFSheet sheet = workbook.createSheet(); + HSSFRow row = sheet.createRow((short) 0); + HSSFRow rowB = sheet.createRow((short) 1); + + HSSFCell cellA2 = rowB.createCell((short)0); + assertEquals(0, rowB.getFirstCellNum()); + assertEquals(0, rowB.getFirstCellNum()); + + assertEquals(-1, row.getLastCellNum()); + assertEquals(-1, row.getFirstCellNum()); + HSSFCell cellB2 = row.createCell((short) 1); + HSSFCell cellB3 = row.createCell((short) 2); + HSSFCell cellB4 = row.createCell((short) 3); + + assertEquals(1, row.getFirstCellNum()); + assertEquals(3, row.getLastCellNum()); + + // Try to move to somewhere else that's used + try { + row.moveCell(cellB2, (short)3); + fail(); + } catch(IllegalArgumentException e) {} + + // Try to move one off a different row + try { + row.moveCell(cellA2, (short)3); + fail(); + } catch(IllegalArgumentException e) {} + + // Move somewhere spare + assertNotNull(row.getCell((short)1)); + row.moveCell(cellB2, (short)5); + assertNull(row.getCell((short)1)); + assertNotNull(row.getCell((short)5)); + + assertEquals(5, cellB2.getCellNum()); + assertEquals(2, row.getFirstCellNum()); + assertEquals(5, row.getLastCellNum()); + } public void testRowBounds()