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:
parent
c023333fdb
commit
4119cfbcc4
@ -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">
|
||||
@ -446,6 +447,23 @@
|
||||
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();
|
||||
</source>
|
||||
</section>
|
||||
</section>
|
||||
</section>
|
||||
</body>
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
BIN
src/testcases/org/apache/poi/hssf/data/SimpleMultiCell.xls
Normal file
BIN
src/testcases/org/apache/poi/hssf/data/SimpleMultiCell.xls
Normal file
Binary file not shown.
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user