--- src/java/org/apache/poi/hssf/model/InternalSheet.java (revision 1617935) +++ src/java/org/apache/poi/hssf/model/InternalSheet.java (working copy) @@ -1667,4 +1667,8 @@ temp.toArray(result); return result; } + + public int getColumnOutlineLevel(int columnIndex) { + return _columnInfos.getOutlineLevel(columnIndex); + } } --- src/java/org/apache/poi/hssf/record/aggregates/ColumnInfoRecordsAggregate.java (revision 1617935) +++ src/java/org/apache/poi/hssf/record/aggregates/ColumnInfoRecordsAggregate.java (working copy) @@ -519,5 +519,13 @@ result = Math.max(columnInfoRecord.getOutlineLevel(), result); } return result; + } + public int getOutlineLevel(int columnIndex) { + ColumnInfoRecord ci = findColumnInfo(columnIndex); + if (ci != null) { + return ci.getOutlineLevel(); + } else { + return 0; + } } } --- src/java/org/apache/poi/hssf/usermodel/HSSFRow.java (revision 1617935) +++ src/java/org/apache/poi/hssf/usermodel/HSSFRow.java (working copy) @@ -268,9 +268,8 @@ * Returns the rows outline level. Increased as you * put it into more groups (outlines), reduced as * you take it out of them. - * TODO - Should this really be public? */ - protected int getOutlineLevel() { + public int getOutlineLevel() { return row.getOutlineLevel(); } --- src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java (revision 1617935) +++ src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java (working copy) @@ -2291,6 +2291,13 @@ } return _workbook.getNameRecord(recIndex); } - - + + /** + * Returns the column outline level. Increased as you + * put it into more groups (outlines), reduced as + * you take it out of them. + */ + public int getColumnOutlineLevel(int columnIndex) { + return _sheet.getColumnOutlineLevel(columnIndex); + } } --- src/java/org/apache/poi/ss/usermodel/Row.java (revision 1617935) +++ src/java/org/apache/poi/ss/usermodel/Row.java (working copy) @@ -234,4 +234,11 @@ public static final MissingCellPolicy RETURN_BLANK_AS_NULL = new MissingCellPolicy(); /** A new, blank cell is created for missing cells. Blank cells are returned as normal */ public static final MissingCellPolicy CREATE_NULL_AS_BLANK = new MissingCellPolicy(); + + /** + * Returns the rows outline level. Increased as you + * put it into more groups (outlines), reduced as + * you take it out of them. + */ + public int getOutlineLevel(); } --- src/java/org/apache/poi/ss/usermodel/Sheet.java (revision 1617935) +++ src/java/org/apache/poi/ss/usermodel/Sheet.java (working copy) @@ -1031,5 +1031,11 @@ * columns for the Sheet, or null. */ void setRepeatingColumns(CellRangeAddress columnRangeRef); - + + /** + * Returns the column outline level. Increased as you + * put it into more groups (outlines), reduced as + * you take it out of them. + */ + int getColumnOutlineLevel(int columnIndex); } --- src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFRow.java (revision 1617935) +++ src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFRow.java (working copy) @@ -58,7 +58,7 @@ return _height!=-1; } - int getOutlineLevel(){ + public int getOutlineLevel(){ return _outlineLevel; } void setOutlineLevel(int level){ --- src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java (revision 1617935) +++ src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java (working copy) @@ -1457,4 +1457,8 @@ boolean dispose() { return _writer.dispose(); } + + public int getColumnOutlineLevel(int columnIndex) { + return _sh.getColumnOutlineLevel(columnIndex); + } } --- src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRow.java (revision 1617935) +++ src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRow.java (working copy) @@ -512,4 +512,8 @@ } setRowNum(rownum); } + + public int getOutlineLevel() { + return _row.getOutlineLevel(); + } } --- src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java (revision 1617935) +++ src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java (working copy) @@ -3686,4 +3686,12 @@ } return tables; } + + public int getColumnOutlineLevel(int columnIndex) { + CTCol col = columnHelper.getColumn(columnIndex, false); + if (col == null) { + return 0; + } + return col.getOutlineLevel(); + } } --- src/ooxml/testcases/org/apache/poi/xssf/streaming/TestOutlining.java (revision 1617935) +++ src/ooxml/testcases/org/apache/poi/xssf/streaming/TestOutlining.java (working copy) @@ -19,8 +19,16 @@ package org.apache.poi.xssf.streaming; +import java.io.IOException; + import junit.framework.TestCase; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + public final class TestOutlining extends TestCase { public void testSetRowGroupCollapsed() throws Exception { @@ -99,4 +107,58 @@ assertNull(r.getHidden()); wb2.dispose(); } + + public void testOutlineGetters() throws IOException { + HSSFWorkbook hssfWorkbook = new HSSFWorkbook(); + HSSFSheet hssfSheet = hssfWorkbook.createSheet(); + hssfSheet.createRow(0); + hssfSheet.createRow(1); + hssfSheet.createRow(2); + hssfSheet.createRow(3); + hssfSheet.createRow(4); + hssfSheet.groupRow(1, 3); + hssfSheet.groupRow(2, 3); + + assertEquals(0, hssfSheet.getRow(0).getOutlineLevel()); + assertEquals(1, hssfSheet.getRow(1).getOutlineLevel()); + assertEquals(2, hssfSheet.getRow(2).getOutlineLevel()); + assertEquals(2, hssfSheet.getRow(3).getOutlineLevel()); + assertEquals(0, hssfSheet.getRow(4).getOutlineLevel()); + hssfWorkbook.close(); + + XSSFWorkbook xssfWorkbook = new XSSFWorkbook(); + XSSFSheet xssfSheet = xssfWorkbook.createSheet(); + xssfSheet.createRow(0); + xssfSheet.createRow(1); + xssfSheet.createRow(2); + xssfSheet.createRow(3); + xssfSheet.createRow(4); + xssfSheet.groupRow(1, 3); + xssfSheet.groupRow(2, 3); + + assertEquals(0, xssfSheet.getRow(0).getOutlineLevel()); + assertEquals(1, xssfSheet.getRow(1).getOutlineLevel()); + assertEquals(2, xssfSheet.getRow(2).getOutlineLevel()); + assertEquals(2, xssfSheet.getRow(3).getOutlineLevel()); + assertEquals(0, xssfSheet.getRow(4).getOutlineLevel()); + xssfWorkbook.close(); + + SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(); + Sheet sxssfSheet = sxssfWorkbook.createSheet(); + sxssfSheet.createRow(0); + sxssfSheet.createRow(1); + sxssfSheet.createRow(2); + sxssfSheet.createRow(3); + sxssfSheet.createRow(4); + sxssfSheet.groupRow(1, 3); + sxssfSheet.groupRow(2, 3); + + assertEquals(0, sxssfSheet.getRow(0).getOutlineLevel()); + assertEquals(1, sxssfSheet.getRow(1).getOutlineLevel()); + assertEquals(2, sxssfSheet.getRow(2).getOutlineLevel()); + assertEquals(2, sxssfSheet.getRow(3).getOutlineLevel()); + assertEquals(0, sxssfSheet.getRow(4).getOutlineLevel()); + sxssfWorkbook.dispose(); + sxssfWorkbook.close(); + } }