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
This commit is contained in:
parent
0f4d8d90ed
commit
1f691642c3
@ -36,6 +36,7 @@
|
||||
|
||||
<!-- Don't forget to update status.xml too! -->
|
||||
<release version="3.0.2-FINAL" date="2008-??-??">
|
||||
<action dev="POI-DEVELOPERS" type="add">43008 - Add a moveCell method to HSSFRow, and deprecate setCellNum(), which didn't update things properly</action>
|
||||
<action dev="POI-DEVELOPERS" type="fix">43058 - Support setting row grouping on files from CR IX, which lack GutsRecords</action>
|
||||
<action dev="POI-DEVELOPERS" type="fix">31795 - Support cloning of sheets with certain drawing objects on them</action>
|
||||
<action dev="POI-DEVELOPERS" type="fix">43902 - Don't consider merged regions when auto-sizing columns</action>
|
||||
|
@ -33,6 +33,7 @@
|
||||
<!-- Don't forget to update changes.xml too! -->
|
||||
<changes>
|
||||
<release version="3.0.2-FINAL" date="2008-??-??">
|
||||
<action dev="POI-DEVELOPERS" type="add">43008 - Add a moveCell method to HSSFRow, and deprecate setCellNum(), which didn't update things properly</action>
|
||||
<action dev="POI-DEVELOPERS" type="fix">43058 - Support setting row grouping on files from CR IX, which lack GutsRecords</action>
|
||||
<action dev="POI-DEVELOPERS" type="fix">31795 - Support cloning of sheets with certain drawing objects on them</action>
|
||||
<action dev="POI-DEVELOPERS" type="fix">43902 - Don't consider merged regions when auto-sizing columns</action>
|
||||
|
@ -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
|
||||
|
@ -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<cells.length)
|
||||
{
|
||||
@ -233,11 +236,34 @@ public class HSSFRow
|
||||
protected int getOutlineLevel() {
|
||||
return row.getOutlineLevel();
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves the supplied cell to a new column, which
|
||||
* must not already have a cell there!
|
||||
* @param cell The cell to move
|
||||
* @param newColumn The new column number (0 based)
|
||||
*/
|
||||
public void moveCell(HSSFCell cell, short newColumn) {
|
||||
// Ensure the destination is free
|
||||
if(cells.length > 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();
|
||||
|
@ -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()
|
||||
|
Loading…
Reference in New Issue
Block a user