Author: fanningpj
Date: Sat Jan 28 22:18:33 2023
New Revision: 1907068
URL: http://svn.apache.org/viewvc?rev=1907068&view=rev
Log:
rework SXSSF groupRow and add test
Modified:
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFSheet.java
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/TestSXSSFSheet.java
Modified:
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFSheet.java
URL:
http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFSheet.java?rev=1907068&r1=1907067&r2=1907068&view=diff
==============================================================================
---
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFSheet.java
(original)
+++
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFSheet.java
Sat Jan 28 22:18:33 2023
@@ -51,7 +51,6 @@ public class SXSSFSheet implements Sheet
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
*/
@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
*/
@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
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);
}
}
Modified:
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
URL:
http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java?rev=1907068&r1=1907067&r2=1907068&view=diff
==============================================================================
---
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
(original)
+++
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
Sat Jan 28 22:18:33 2023
@@ -3462,11 +3462,11 @@ public class XSSFSheet extends POIXMLDoc
getSheetTypeSheetFormatPr().setOutlineLevelRow(maxLevelRow);
}
- private short getSheetFormatPrOutlineLevelRow() {
+ public short getSheetFormatPrOutlineLevelRow() {
return getSheetTypeSheetFormatPr().getOutlineLevelRow();
}
- private short getSheetFormatPrOutlineLevelCol() {
+ public short getSheetFormatPrOutlineLevelCol() {
return getSheetTypeSheetFormatPr().getOutlineLevelCol();
}
Modified:
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/TestSXSSFSheet.java
URL:
http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/TestSXSSFSheet.java?rev=1907068&r1=1907067&r2=1907068&view=diff
==============================================================================
---
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/TestSXSSFSheet.java
(original)
+++
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/TestSXSSFSheet.java
Sat Jan 28 22:18:33 2023
@@ -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.XSS
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 extend
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());
+ }
+ }
+ }
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]