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! -->
|
<!-- Don't forget to update status.xml too! -->
|
||||||
<release version="3.0.2-FINAL" date="2008-??-??">
|
<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">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">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>
|
<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! -->
|
<!-- Don't forget to update changes.xml too! -->
|
||||||
<changes>
|
<changes>
|
||||||
<release version="3.0.2-FINAL" date="2008-??-??">
|
<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">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">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>
|
<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;
|
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.FormulaParser;
|
||||||
import org.apache.poi.hssf.model.Sheet;
|
import org.apache.poi.hssf.model.Sheet;
|
||||||
import org.apache.poi.hssf.model.Workbook;
|
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.aggregates.FormulaRecordAggregate;
|
||||||
import org.apache.poi.hssf.record.formula.Ptg;
|
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.
|
* 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
|
* 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
|
* @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)
|
public void setCellNum(short num)
|
||||||
{
|
{
|
||||||
record.setColumn(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
|
* get the cell's number within the row
|
||||||
|
@ -22,15 +22,14 @@
|
|||||||
*/
|
*/
|
||||||
package org.apache.poi.hssf.usermodel;
|
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.Sheet;
|
||||||
import org.apache.poi.hssf.model.Workbook;
|
import org.apache.poi.hssf.model.Workbook;
|
||||||
import org.apache.poi.hssf.record.CellValueRecordInterface;
|
import org.apache.poi.hssf.record.CellValueRecordInterface;
|
||||||
import org.apache.poi.hssf.record.RowRecord;
|
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.
|
* High level representation of a row of a spreadsheet.
|
||||||
*
|
*
|
||||||
@ -157,11 +156,15 @@ public class HSSFRow
|
|||||||
* remove the HSSFCell from this row.
|
* remove the HSSFCell from this row.
|
||||||
* @param cell to remove
|
* @param cell to remove
|
||||||
*/
|
*/
|
||||||
public void removeCell(HSSFCell cell)
|
public void removeCell(HSSFCell cell) {
|
||||||
{
|
removeCell(cell, true);
|
||||||
CellValueRecordInterface cval = cell.getCellValueRecord();
|
}
|
||||||
|
private void removeCell(HSSFCell cell, boolean alsoRemoveRecords) {
|
||||||
sheet.removeValueRecord(getRowNum(), cval);
|
if(alsoRemoveRecords) {
|
||||||
|
CellValueRecordInterface cval = cell.getCellValueRecord();
|
||||||
|
sheet.removeValueRecord(getRowNum(), cval);
|
||||||
|
}
|
||||||
|
|
||||||
short column=cell.getCellNum();
|
short column=cell.getCellNum();
|
||||||
if(cell!=null && column<cells.length)
|
if(cell!=null && column<cells.length)
|
||||||
{
|
{
|
||||||
@ -233,11 +236,34 @@ public class HSSFRow
|
|||||||
protected int getOutlineLevel() {
|
protected int getOutlineLevel() {
|
||||||
return row.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.
|
* used internally to add a cell.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
private void addCell(HSSFCell cell)
|
private void addCell(HSSFCell cell)
|
||||||
{
|
{
|
||||||
short column=cell.getCellNum();
|
short column=cell.getCellNum();
|
||||||
|
@ -102,8 +102,49 @@ public class TestHSSFRow
|
|||||||
file.delete();
|
file.delete();
|
||||||
assertEquals(-1, sheet.getRow((short) 0).getLastCellNum());
|
assertEquals(-1, sheet.getRow((short) 0).getLastCellNum());
|
||||||
assertEquals(-1, sheet.getRow((short) 0).getFirstCellNum());
|
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()
|
public void testRowBounds()
|
||||||
|
Loading…
Reference in New Issue
Block a user