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="#DataFormats">Create user defined data formats.</link></li>
|
||||||
<li><link href="#PrintArea">Set print area for a sheet.</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="#FooterPageNumbers">Set page numbers on the footer of a sheet.</link></li>
|
||||||
|
<li><link href="#ShiftRows">Shift rows.</link></li>
|
||||||
</ul>
|
</ul>
|
||||||
</section>
|
</section>
|
||||||
<section title="Features">
|
<section title="Features">
|
||||||
@ -443,6 +444,23 @@
|
|||||||
// Write out the workbook
|
// Write out the workbook
|
||||||
FileOutputStream fileOut = new FileOutputStream( "workbook.xls" );
|
FileOutputStream fileOut = new FileOutputStream( "workbook.xls" );
|
||||||
wb.write( fileOut );
|
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();
|
fileOut.close();
|
||||||
</source>
|
</source>
|
||||||
</section>
|
</section>
|
||||||
|
@ -829,4 +829,51 @@ public class HSSFSheet
|
|||||||
public void setMargin(short margin, double size) {
|
public void setMargin(short margin, double size) {
|
||||||
getSheet().setMargin(margin, 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");
|
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",
|
File file = File.createTempFile("testWriteDataFormat",
|
||||||
".xls");
|
".xls");
|
||||||
System.err.println(file);
|
|
||||||
FileOutputStream out = new FileOutputStream(file);
|
FileOutputStream out = new FileOutputStream(file);
|
||||||
HSSFWorkbook wb = new HSSFWorkbook();
|
HSSFWorkbook wb = new HSSFWorkbook();
|
||||||
HSSFSheet s = wb.createSheet();
|
HSSFSheet s = wb.createSheet();
|
||||||
|
Loading…
Reference in New Issue
Block a user