git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1907068 13f79535-47bb-0310-9956-ffa450edef68tags/REL_5_2_4
@@ -51,7 +51,6 @@ public class SXSSFSheet implements Sheet, OoxmlSheetExtensions { | |||
protected SheetDataWriter _writer; | |||
private int _randomAccessWindowSize = SXSSFWorkbook.DEFAULT_WINDOW_SIZE; | |||
protected AutoSizeColumnTracker _autoSizeColumnTracker; | |||
private int outlineLevelRow; | |||
private int lastFlushedRowNumber = -1; | |||
private boolean allFlushed; | |||
private int leftMostColumn = SpreadsheetVersion.EXCEL2007.getLastColumnIndex(); | |||
@@ -1241,7 +1240,7 @@ public class SXSSFSheet implements Sheet, OoxmlSheetExtensions { | |||
*/ | |||
@Override | |||
public void groupColumn(int fromColumn, int toColumn) { | |||
_sh.groupColumn(fromColumn,toColumn); | |||
_sh.groupColumn(fromColumn, toColumn); | |||
} | |||
/** | |||
@@ -1294,16 +1293,14 @@ public class SXSSFSheet implements Sheet, OoxmlSheetExtensions { | |||
*/ | |||
@Override | |||
public void groupRow(int fromRow, int toRow) { | |||
int maxLevelRow = -1; | |||
for(SXSSFRow row : _rows.subMap(fromRow, toRow + 1).values()){ | |||
int level = row.getOutlineLevel() + 1; | |||
final int level = row.getOutlineLevel() + 1; | |||
row.setOutlineLevel(level); | |||
if(level > outlineLevelRow) { | |||
outlineLevelRow = level; | |||
} | |||
maxLevelRow = Math.max(maxLevelRow, level); | |||
} | |||
setWorksheetOutlineLevelRow(); | |||
setWorksheetOutlineLevelRowIfNecessary((short) Math.min(Short.MAX_VALUE, maxLevelRow)); | |||
} | |||
/** | |||
@@ -1323,19 +1320,16 @@ public class SXSSFSheet implements Sheet, OoxmlSheetExtensions { | |||
public void setRowOutlineLevel(int rownum, int level) { | |||
SXSSFRow row = _rows.get(rownum); | |||
row.setOutlineLevel(level); | |||
if(level > 0 && level > outlineLevelRow) { | |||
outlineLevelRow = level; | |||
setWorksheetOutlineLevelRow(); | |||
} | |||
setWorksheetOutlineLevelRowIfNecessary((short) Math.min(Short.MAX_VALUE, level)); | |||
} | |||
private void setWorksheetOutlineLevelRow() { | |||
private void setWorksheetOutlineLevelRowIfNecessary(final short levelRow) { | |||
CTWorksheet ct = _sh.getCTWorksheet(); | |||
CTSheetFormatPr pr = ct.isSetSheetFormatPr() ? | |||
ct.getSheetFormatPr() : | |||
ct.addNewSheetFormatPr(); | |||
if(outlineLevelRow > 0) { | |||
pr.setOutlineLevelRow((short)outlineLevelRow); | |||
if(levelRow > _sh.getSheetFormatPrOutlineLevelRow()) { | |||
pr.setOutlineLevelRow(levelRow); | |||
} | |||
} | |||
@@ -3462,11 +3462,11 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet, OoxmlSheetEx | |||
getSheetTypeSheetFormatPr().setOutlineLevelRow(maxLevelRow); | |||
} | |||
private short getSheetFormatPrOutlineLevelRow() { | |||
public short getSheetFormatPrOutlineLevelRow() { | |||
return getSheetTypeSheetFormatPr().getOutlineLevelRow(); | |||
} | |||
private short getSheetFormatPrOutlineLevelCol() { | |||
public short getSheetFormatPrOutlineLevelCol() { | |||
return getSheetTypeSheetFormatPr().getOutlineLevelCol(); | |||
} | |||
@@ -20,6 +20,7 @@ | |||
package org.apache.poi.xssf.streaming; | |||
import static org.junit.jupiter.api.Assertions.assertEquals; | |||
import static org.junit.jupiter.api.Assertions.assertNotNull; | |||
import static org.junit.jupiter.api.Assertions.assertThrows; | |||
import java.io.IOException; | |||
@@ -33,6 +34,7 @@ import org.apache.poi.xssf.usermodel.XSSFSheet; | |||
import org.apache.poi.xssf.usermodel.XSSFWorkbook; | |||
import org.junit.jupiter.api.AfterEach; | |||
import org.junit.jupiter.api.Test; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRow; | |||
public final class TestSXSSFSheet extends BaseTestXSheet { | |||
@@ -177,4 +179,67 @@ public final class TestSXSSFSheet extends BaseTestXSheet { | |||
wb.close(); | |||
} | |||
@Test | |||
void groupRow() throws IOException { | |||
try (SXSSFWorkbook workbook = new SXSSFWorkbook()) { | |||
SXSSFSheet sheet = workbook.createSheet(); | |||
// XSSF code can group rows even if there are no XSSFRows yet, SXSSFWorkbook needs the rows to exist first | |||
for (int i = 0; i < 20; i++) { | |||
sheet.createRow(i); | |||
} | |||
//one level | |||
sheet.groupRow(9, 10); | |||
try(UnsynchronizedByteArrayOutputStream bos = new UnsynchronizedByteArrayOutputStream()) { | |||
workbook.write(bos); | |||
try(XSSFWorkbook xssfWorkbook = new XSSFWorkbook(bos.toInputStream())) { | |||
XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(0); | |||
CTRow ctrow = xssfSheet.getRow(9).getCTRow(); | |||
assertNotNull(ctrow); | |||
assertEquals(10, ctrow.getR()); | |||
assertEquals(1, ctrow.getOutlineLevel()); | |||
assertEquals(1, xssfSheet.getCTWorksheet().getSheetFormatPr().getOutlineLevelRow()); | |||
} | |||
} | |||
} | |||
} | |||
@Test | |||
void groupRow2Levels() throws IOException { | |||
try (SXSSFWorkbook workbook = new SXSSFWorkbook()) { | |||
SXSSFSheet sheet = workbook.createSheet(); | |||
// XSSF code can group rows even if there are no XSSFRows yet, SXSSFWorkbook needs the rows to exist first | |||
for (int i = 0; i < 20; i++) { | |||
sheet.createRow(i); | |||
} | |||
//one level | |||
sheet.groupRow(9, 10); | |||
//two level | |||
sheet.groupRow(10, 13); | |||
try(UnsynchronizedByteArrayOutputStream bos = new UnsynchronizedByteArrayOutputStream()) { | |||
workbook.write(bos); | |||
try(XSSFWorkbook xssfWorkbook = new XSSFWorkbook(bos.toInputStream())) { | |||
XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(0); | |||
CTRow ctrow = xssfSheet.getRow(9).getCTRow(); | |||
assertNotNull(ctrow); | |||
assertEquals(10, ctrow.getR()); | |||
assertEquals(1, ctrow.getOutlineLevel()); | |||
ctrow = xssfSheet.getRow(10).getCTRow(); | |||
assertNotNull(ctrow); | |||
assertEquals(11, ctrow.getR()); | |||
assertEquals(2, ctrow.getOutlineLevel()); | |||
assertEquals(2, xssfSheet.getCTWorksheet().getSheetFormatPr().getOutlineLevelRow()); | |||
} | |||
} | |||
} | |||
} | |||
} |