git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1907068 13f79535-47bb-0310-9956-ffa450edef68tags/REL_5_2_4
protected SheetDataWriter _writer; | protected SheetDataWriter _writer; | ||||
private int _randomAccessWindowSize = SXSSFWorkbook.DEFAULT_WINDOW_SIZE; | private int _randomAccessWindowSize = SXSSFWorkbook.DEFAULT_WINDOW_SIZE; | ||||
protected AutoSizeColumnTracker _autoSizeColumnTracker; | protected AutoSizeColumnTracker _autoSizeColumnTracker; | ||||
private int outlineLevelRow; | |||||
private int lastFlushedRowNumber = -1; | private int lastFlushedRowNumber = -1; | ||||
private boolean allFlushed; | private boolean allFlushed; | ||||
private int leftMostColumn = SpreadsheetVersion.EXCEL2007.getLastColumnIndex(); | private int leftMostColumn = SpreadsheetVersion.EXCEL2007.getLastColumnIndex(); | ||||
*/ | */ | ||||
@Override | @Override | ||||
public void groupColumn(int fromColumn, int toColumn) { | public void groupColumn(int fromColumn, int toColumn) { | ||||
_sh.groupColumn(fromColumn,toColumn); | |||||
_sh.groupColumn(fromColumn, toColumn); | |||||
} | } | ||||
/** | /** | ||||
*/ | */ | ||||
@Override | @Override | ||||
public void groupRow(int fromRow, int toRow) { | public void groupRow(int fromRow, int toRow) { | ||||
int maxLevelRow = -1; | |||||
for(SXSSFRow row : _rows.subMap(fromRow, toRow + 1).values()){ | for(SXSSFRow row : _rows.subMap(fromRow, toRow + 1).values()){ | ||||
int level = row.getOutlineLevel() + 1; | |||||
final int level = row.getOutlineLevel() + 1; | |||||
row.setOutlineLevel(level); | row.setOutlineLevel(level); | ||||
if(level > outlineLevelRow) { | |||||
outlineLevelRow = level; | |||||
} | |||||
maxLevelRow = Math.max(maxLevelRow, level); | |||||
} | } | ||||
setWorksheetOutlineLevelRow(); | |||||
setWorksheetOutlineLevelRowIfNecessary((short) Math.min(Short.MAX_VALUE, maxLevelRow)); | |||||
} | } | ||||
/** | /** | ||||
public void setRowOutlineLevel(int rownum, int level) { | public void setRowOutlineLevel(int rownum, int level) { | ||||
SXSSFRow row = _rows.get(rownum); | SXSSFRow row = _rows.get(rownum); | ||||
row.setOutlineLevel(level); | 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(); | CTWorksheet ct = _sh.getCTWorksheet(); | ||||
CTSheetFormatPr pr = ct.isSetSheetFormatPr() ? | CTSheetFormatPr pr = ct.isSetSheetFormatPr() ? | ||||
ct.getSheetFormatPr() : | ct.getSheetFormatPr() : | ||||
ct.addNewSheetFormatPr(); | ct.addNewSheetFormatPr(); | ||||
if(outlineLevelRow > 0) { | |||||
pr.setOutlineLevelRow((short)outlineLevelRow); | |||||
if(levelRow > _sh.getSheetFormatPrOutlineLevelRow()) { | |||||
pr.setOutlineLevelRow(levelRow); | |||||
} | } | ||||
} | } | ||||
getSheetTypeSheetFormatPr().setOutlineLevelRow(maxLevelRow); | getSheetTypeSheetFormatPr().setOutlineLevelRow(maxLevelRow); | ||||
} | } | ||||
private short getSheetFormatPrOutlineLevelRow() { | |||||
public short getSheetFormatPrOutlineLevelRow() { | |||||
return getSheetTypeSheetFormatPr().getOutlineLevelRow(); | return getSheetTypeSheetFormatPr().getOutlineLevelRow(); | ||||
} | } | ||||
private short getSheetFormatPrOutlineLevelCol() { | |||||
public short getSheetFormatPrOutlineLevelCol() { | |||||
return getSheetTypeSheetFormatPr().getOutlineLevelCol(); | return getSheetTypeSheetFormatPr().getOutlineLevelCol(); | ||||
} | } | ||||
package org.apache.poi.xssf.streaming; | package org.apache.poi.xssf.streaming; | ||||
import static org.junit.jupiter.api.Assertions.assertEquals; | 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 static org.junit.jupiter.api.Assertions.assertThrows; | ||||
import java.io.IOException; | import java.io.IOException; | ||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook; | import org.apache.poi.xssf.usermodel.XSSFWorkbook; | ||||
import org.junit.jupiter.api.AfterEach; | import org.junit.jupiter.api.AfterEach; | ||||
import org.junit.jupiter.api.Test; | import org.junit.jupiter.api.Test; | ||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRow; | |||||
public final class TestSXSSFSheet extends BaseTestXSheet { | public final class TestSXSSFSheet extends BaseTestXSheet { | ||||
wb.close(); | 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()); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | } |