Added ability to shift rows in a sheet.

PR:
Obtained from:
Submitted by:
Reviewed by:


git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@352881 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Shawn Laubach 2002-10-07 16:26:24 +00:00
parent c023333fdb
commit 4119cfbcc4
5 changed files with 146 additions and 1 deletions

View File

@ -32,6 +32,7 @@
<li><link href="#DataFormats">Create user defined data formats.</link></li>
<li><link href="#PrintArea">Set print area for a sheet.</link></li>
<li><link href="#FooterPageNumbers">Set page numbers on the footer of a sheet.</link></li>
<li><link href="#ShiftRows">Shift rows.</link></li>
</ul>
</section>
<section title="Features">
@ -441,6 +442,23 @@
HSSFCellUtil.setAlignment(cell2, wb, HSSFCellStyle.ALIGN_CENTER);
// Write out the workbook
FileOutputStream fileOut = new FileOutputStream( "workbook.xls" );
wb.write( fileOut );
fileOut.close();
</source>
</section>
<anchor id="ShiftRows"/>
<section title="Shift rows up or down on a sheet">
<source>
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("row sheet");
// Create various cells and rows for spreadsheet.
// Shift rows 6 - 11 on the spreadsheet to the top (rows 0 - 5)
sheet.shiftRows(5, 10, -5);
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

View File

@ -829,4 +829,51 @@ public class HSSFSheet
public void setMargin(short margin, double size) {
getSheet().setMargin(margin, size);
}
/**
* Shifts rows between startRow and endRow n number of rows.
* If you use a negative number, it will shift rows up.
* Code ensures that rows don't wrap around
*
* @param startRow the row to start shifting
* @param endRow the row to end shifting
* @param n the number of rows to shift
*/
public void shiftRows(int startRow, int endRow, int n) {
int s, e, inc;
if (n < 0) {
s = startRow;
e = endRow;
inc = 1;
} else {
s = endRow;
e = startRow;
inc = -1;
}
for (int rowNum = s; rowNum >= startRow && rowNum <= endRow && rowNum >= 0 && rowNum < 65536; rowNum+=inc) {
HSSFRow row = getRow(rowNum);
HSSFRow row2Replace = getRow(rowNum + n);
if (row2Replace == null)
row2Replace = createRow(rowNum + n);
HSSFCell cell;
for (short col = row2Replace.getFirstCellNum(); col <= row2Replace.getLastCellNum(); col++) {
cell = row2Replace.getCell(col);
if (cell != null)
row2Replace.removeCell(cell);
}
for (short col = row.getFirstCellNum(); col <= row.getLastCellNum(); col++) {
cell = row.getCell(col);
if (cell != null) {
row.removeCell(cell);
CellValueRecordInterface cellRecord = cell.getCellValueRecord();
cellRecord.setRow(rowNum + n);
row2Replace.createCellFromRecord(cellRecord);
sheet.addValueRecord(rowNum + n, cellRecord);
}
}
}
if (endRow == lastrow || endRow + n > lastrow) lastrow = Math.min(endRow + n, 65535);
if (startRow == firstrow || startRow + n < firstrow) firstrow = Math.max(startRow + n, 0);
}
}

View File

@ -215,4 +215,85 @@ public class TestHSSFSheet
assertEquals(cloned.getRow((short)0).getCell((short)0).getStringCellValue(), "clone_test");
}
/**
* Tests the shiftRows function. Does three different shifts.
* After each shift, writes the workbook to file and reads back to
* check. This ensures that if some changes code that breaks
* writing or what not, they realize it.
*
* Shawn Laubach (slaubach at apache dot org)
*/
public void testShiftRows() throws Exception {
// Read initial file in
String filename = System.getProperty("HSSF.testdata.path");
filename = filename + "/SimpleMultiCell.xls";
FileInputStream fin = new FileInputStream(filename);
HSSFWorkbook wb = new HSSFWorkbook(fin);
fin.close();
HSSFSheet s = wb.getSheetAt(0);
// Shift the second row down 1 and write to temp file
s.shiftRows(1, 1, 1);
File tempFile = File.createTempFile("shift", "test.xls");
FileOutputStream fout = new FileOutputStream(tempFile);
wb.write(fout);
fout.close();
// Read from temp file and check the number of cells in each
// row (in original file each row was unique)
fin = new FileInputStream(tempFile);
wb = new HSSFWorkbook(fin);
fin.close();
s = wb.getSheetAt(0);
assertEquals(s.getRow(0).getPhysicalNumberOfCells(), 1);
assertTrue(s.getRow(1) == null || s.getRow(1).getPhysicalNumberOfCells() == 0);
assertEquals(s.getRow(2).getPhysicalNumberOfCells(), 2);
assertEquals(s.getRow(3).getPhysicalNumberOfCells(), 4);
assertEquals(s.getRow(4).getPhysicalNumberOfCells(), 5);
// Shift rows 1-3 down 3 in the current one. This tests when
// 1 row is blank. Write to a another temp file
s.shiftRows(0, 2, 3);
tempFile = File.createTempFile("shift", "test.xls");
fout = new FileOutputStream(tempFile);
wb.write(fout);
fout.close();
// Read and ensure things are where they should be
fin = new FileInputStream(tempFile);
wb = new HSSFWorkbook(fin);
fin.close();
s = wb.getSheetAt(0);
assertTrue(s.getRow(0) == null || s.getRow(0).getPhysicalNumberOfCells() == 0);
assertTrue(s.getRow(1) == null || s.getRow(1).getPhysicalNumberOfCells() == 0);
assertTrue(s.getRow(2) == null || s.getRow(2).getPhysicalNumberOfCells() == 0);
assertEquals(s.getRow(3).getPhysicalNumberOfCells(), 1);
assertTrue(s.getRow(4) == null || s.getRow(4).getPhysicalNumberOfCells() == 0);
assertEquals(s.getRow(5).getPhysicalNumberOfCells(), 2);
// Read the first file again
fin = new FileInputStream(filename);
wb = new HSSFWorkbook(fin);
fin.close();
s = wb.getSheetAt(0);
// Shift rows 3 and 4 up and write to temp file
s.shiftRows(2, 3, -2);
tempFile = File.createTempFile("shift", "test.xls");
fout = new FileOutputStream(tempFile);
wb.write(fout);
fout.close();
// Read file and test
fin = new FileInputStream(tempFile);
wb = new HSSFWorkbook(fin);
fin.close();
s = wb.getSheetAt(0);
assertEquals(s.getRow(0).getPhysicalNumberOfCells(), 3);
assertEquals(s.getRow(1).getPhysicalNumberOfCells(), 4);
assertTrue(s.getRow(2) == null || s.getRow(2).getPhysicalNumberOfCells() == 0);
assertTrue(s.getRow(3) == null || s.getRow(3).getPhysicalNumberOfCells() == 0);
assertEquals(s.getRow(4).getPhysicalNumberOfCells(), 5);
}
}

View File

@ -272,7 +272,6 @@ public class TestWorkbook
{
File file = File.createTempFile("testWriteDataFormat",
".xls");
System.err.println(file);
FileOutputStream out = new FileOutputStream(file);
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet s = wb.createSheet();