diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 538273a20..e374a544d 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 51673 - support grouping rows in SXSSF 51780 - support replacement of content types in OPC packages 52784 - replace ISO control characters with question marks in SXSSF to be consistent with XSSF 52057 - updated formula test framework to be aware of recently added Functions diff --git a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFRow.java b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFRow.java index 341f56b83..1bd53bc8b 100644 --- a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFRow.java +++ b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFRow.java @@ -25,7 +25,6 @@ import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.xssf.usermodel.XSSFCellStyle; /** * Streaming version of XSSFRow implementing the "BigGridDemo" strategy. @@ -40,6 +39,7 @@ public class SXSSFRow implements Row short _style=-1; short _height=-1; boolean _zHeight = false; + int _outlineLevel = 0; // Outlining level of the row, when outlining is on public SXSSFRow(SXSSFSheet sheet, int initialSize) { @@ -54,6 +54,14 @@ public class SXSSFRow implements Row { return _height!=-1; } + + int getOutlineLevel(){ + return _outlineLevel; + } + void setOutlineLevel(int level){ + _outlineLevel = level; + } + //begin of interface implementation public Iterator iterator() { diff --git a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java index 5e2aba7b0..0311ec55f 100644 --- a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java +++ b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java @@ -26,11 +26,12 @@ import org.apache.poi.ss.SpreadsheetVersion; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.SheetUtil; -import org.apache.poi.util.Internal; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.hssf.util.PaneInformation; import org.apache.poi.ss.util.CellRangeAddress; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetFormatPr; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet; /** * Streaming version of XSSFSheet implementing the "BigGridDemo" strategy. @@ -44,6 +45,7 @@ public class SXSSFSheet implements Sheet, Cloneable TreeMap _rows=new TreeMap(); SheetDataWriter _writer; int _randomAccessWindowSize = SXSSFWorkbook.DEFAULT_WINDOW_SIZE; + int outlineLevelRow = 0; public SXSSFSheet(SXSSFWorkbook workbook, XSSFSheet xSheet) throws IOException { @@ -1036,7 +1038,18 @@ public class SXSSFSheet implements Sheet, Cloneable */ public void groupRow(int fromRow, int toRow) { - _sh.groupRow(fromRow, toRow); + for(SXSSFRow row : _rows.subMap(fromRow, toRow + 1).values()){ + int level = row.getOutlineLevel() + 1; + row.setOutlineLevel(level); + + if(level > outlineLevelRow) outlineLevelRow = level; + } + + CTWorksheet ct = _sh.getCTWorksheet(); + CTSheetFormatPr pr = ct.isSetSheetFormatPr() ? + ct.getSheetFormatPr() : + ct.addNewSheetFormatPr(); + pr.setOutlineLevelRow((short)outlineLevelRow); } /** @@ -1058,7 +1071,8 @@ public class SXSSFSheet implements Sheet, Cloneable */ public void setRowGroupCollapsed(int row, boolean collapse) { - _sh.setRowGroupCollapsed(row, collapse); + //_sh.setRowGroupCollapsed(row, collapse); + throw new RuntimeException("Not Implemented"); } /** diff --git a/src/ooxml/java/org/apache/poi/xssf/streaming/SheetDataWriter.java b/src/ooxml/java/org/apache/poi/xssf/streaming/SheetDataWriter.java index c9a34a463..1823fec79 100644 --- a/src/ooxml/java/org/apache/poi/xssf/streaming/SheetDataWriter.java +++ b/src/ooxml/java/org/apache/poi/xssf/streaming/SheetDataWriter.java @@ -137,6 +137,9 @@ public class SheetDataWriter { _out.write(" s=\"" + row._style + "\""); _out.write(" customFormat=\"1\""); } + if (row.getOutlineLevel() != 0) { + _out.write(" outlineLevel=\"" + row.getOutlineLevel() + "\""); + } _out.write(">\n"); this._rownum = rownum; _rowContainedNullCells = false;