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

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


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

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


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

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

Loading…
Cancel
Save