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]

Reply via email to