Browse Source

rework SXSSF groupRow and add test

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1907068 13f79535-47bb-0310-9956-ffa450edef68
tags/REL_5_2_4
PJ Fanning 1 year ago
parent
commit
4944aa4c2e

+ 9
- 15
poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFSheet.java View File

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);
} }
} }



+ 2
- 2
poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java View File

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();
} }



+ 65
- 0
poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/TestSXSSFSheet.java View File

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());
}
}
}
}
} }

Loading…
Cancel
Save