You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ce...@apache.org on 2013/10/20 20:04:08 UTC

svn commit: r1533932 - in /poi/trunk/src: examples/src/org/apache/poi/xssf/streaming/ examples/src/org/apache/poi/xssf/streaming/examples/ ooxml/java/org/apache/poi/xssf/streaming/ ooxml/testcases/org/apache/poi/xssf/streaming/

Author: centic
Date: Sun Oct 20 18:04:08 2013
New Revision: 1533932

URL: http://svn.apache.org/r1533932
Log:
Bug 55369: Add support for collapsing rows in SXSSF

Added:
    poi/trunk/src/examples/src/org/apache/poi/xssf/streaming/
    poi/trunk/src/examples/src/org/apache/poi/xssf/streaming/examples/
    poi/trunk/src/examples/src/org/apache/poi/xssf/streaming/examples/Outlining.java
    poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestOutlining.java
Modified:
    poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFRow.java
    poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java
    poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SheetDataWriter.java

Added: poi/trunk/src/examples/src/org/apache/poi/xssf/streaming/examples/Outlining.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/examples/src/org/apache/poi/xssf/streaming/examples/Outlining.java?rev=1533932&view=auto
==============================================================================
--- poi/trunk/src/examples/src/org/apache/poi/xssf/streaming/examples/Outlining.java (added)
+++ poi/trunk/src/examples/src/org/apache/poi/xssf/streaming/examples/Outlining.java Sun Oct 20 18:04:08 2013
@@ -0,0 +1,51 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.xssf.streaming.examples;
+
+import java.io.FileOutputStream;
+
+import org.apache.poi.xssf.streaming.SXSSFSheet;
+import org.apache.poi.xssf.streaming.SXSSFWorkbook;
+
+public class Outlining {
+
+	public static void main(String[] args) throws Exception {
+		Outlining o = new Outlining();
+		o.collapseRow();
+	}
+
+	private void collapseRow() throws Exception {
+		SXSSFWorkbook wb2 = new SXSSFWorkbook(100);
+		SXSSFSheet sheet2 = (SXSSFSheet) wb2.createSheet("new sheet");
+
+		int rowCount = 20;
+		for (int i = 0; i < rowCount; i++) {
+			sheet2.createRow(i);
+		}
+
+		sheet2.groupRow(4, 9);
+		sheet2.groupRow(11, 19);
+
+		sheet2.setRowGroupCollapsed(4, true);
+
+		FileOutputStream fileOut = new FileOutputStream("outlining_collapsed.xlsx");
+		wb2.write(fileOut);
+		fileOut.close();
+		wb2.dispose();
+	}
+}

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFRow.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFRow.java?rev=1533932&r1=1533931&r2=1533932&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFRow.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFRow.java Sun Oct 20 18:04:08 2013
@@ -40,7 +40,10 @@ public class SXSSFRow implements Row
     short _height=-1;
     boolean _zHeight = false;
     int _outlineLevel = 0;   // Outlining level of the row, when outlining is on
-
+    // use Boolean to have a tri-state for on/off/undefined 
+    Boolean _hidden;
+    Boolean _collapsed;
+	
     public SXSSFRow(SXSSFSheet sheet, int initialSize)
     {
         _sheet=sheet;
@@ -61,7 +64,22 @@ public class SXSSFRow implements Row
     void setOutlineLevel(int level){
         _outlineLevel = level;
     }
+    
+    public Boolean getHidden() {
+        return _hidden;
+    }
+
+    public void setHidden(Boolean hidden) {
+        this._hidden = hidden;
+    }
+
+    public Boolean getCollapsed() {
+        return _collapsed;
+    }
 
+    public void setCollapsed(Boolean collapsed) {
+        this._collapsed = collapsed;
+    }
 //begin of interface implementation
     public Iterator<Cell> iterator()
     {

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java?rev=1533932&r1=1533931&r2=1533932&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java Sun Oct 20 18:04:08 2013
@@ -1143,8 +1143,65 @@ public class SXSSFSheet implements Sheet
      */
     public void setRowGroupCollapsed(int row, boolean collapse)
     {
-        //_sh.setRowGroupCollapsed(row, collapse);
-        throw new RuntimeException("Not Implemented");
+        if (collapse) {
+            collapseRow(row);
+        } else {
+            //expandRow(rowIndex);
+            throw new RuntimeException("Not Implemented");
+        }
+    }
+    
+    /**
+     * @param rowIndex the zero based row index to collapse
+     */
+    private void collapseRow(int rowIndex) {
+        SXSSFRow row = (SXSSFRow) getRow(rowIndex);
+        if(row == null) {
+			throw new IllegalArgumentException("Invalid row number("+ rowIndex + "). Row does not exist.");
+		} else {
+            int startRow = findStartOfRowOutlineGroup(rowIndex);
+
+            // Hide all the columns until the end of the group
+            int lastRow = writeHidden(row, startRow, true);
+            SXSSFRow lastRowObj = (SXSSFRow) getRow(lastRow); 
+            if (lastRowObj != null) {
+                lastRowObj.setCollapsed(true);
+            } else {
+                SXSSFRow newRow = (SXSSFRow) createRow(lastRow);
+                newRow.setCollapsed(true);
+            }
+        }
+    }
+    
+    /**
+     * @param rowIndex the zero based row index to find from
+     */
+    private int findStartOfRowOutlineGroup(int rowIndex) {
+        // Find the start of the group.
+		Row row = getRow(rowIndex);
+        int level = ((SXSSFRow) row).getOutlineLevel();
+        if(level == 0) {
+        	throw new IllegalArgumentException("Outline level is zero for the row (" + rowIndex + ").");
+        }
+        int currentRow = rowIndex;
+        while (getRow(currentRow) != null) {
+            if (((SXSSFRow) getRow(currentRow)).getOutlineLevel() < level)
+                return currentRow + 1;
+            currentRow--;
+        }
+        return currentRow + 1;
+    }
+    
+    private int writeHidden(SXSSFRow xRow, int rowIndex, boolean hidden) {
+        int level = xRow.getOutlineLevel();
+        SXSSFRow currRow = (SXSSFRow) getRow(rowIndex);
+
+        while (currRow != null && currRow.getOutlineLevel() >= level) {
+            currRow.setHidden(hidden);
+            rowIndex++;
+            currRow = (SXSSFRow) getRow(rowIndex);
+        }
+        return rowIndex;
     }
 
     /**

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SheetDataWriter.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SheetDataWriter.java?rev=1533932&r1=1533931&r2=1533932&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SheetDataWriter.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/streaming/SheetDataWriter.java Sun Oct 20 18:04:08 2013
@@ -19,16 +19,19 @@
 
 package org.apache.poi.xssf.streaming;
 
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Writer;
+import java.util.Iterator;
+
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.CellStyle;
 import org.apache.poi.ss.usermodel.FormulaError;
 import org.apache.poi.ss.util.CellReference;
-import org.apache.xmlbeans.XmlCursor;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.STXstring;
-
-import javax.xml.namespace.QName;
-import java.io.*;
-import java.util.Iterator;
 
 /**
  * Initially copied from BigGridDemo "SpreadsheetWriter".
@@ -110,6 +113,7 @@ public class SheetDataWriter {
         return _numberLastFlushedRow;
     }
 
+    @Override
     protected void finalize() throws Throwable {
         _fd.delete();
     }
@@ -148,6 +152,13 @@ public class SheetDataWriter {
         if (row.getOutlineLevel() != 0) {
             _out.write(" outlineLevel=\"" + row.getOutlineLevel() + "\"");
         }
+        if(row.getHidden() != null) {
+            _out.write(" hidden=\"" + (row.getHidden() ? "1" : "0") + "\"");
+        }
+        if(row.getCollapsed() != null) {
+        	_out.write(" collapsed=\"" + (row.getCollapsed() ? "1" : "0") + "\"");
+        }
+        
         _out.write(">\n");
         this._rownum = rownum;
         _rowContainedNullCells = false;

Added: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestOutlining.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestOutlining.java?rev=1533932&view=auto
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestOutlining.java (added)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestOutlining.java Sun Oct 20 18:04:08 2013
@@ -0,0 +1,102 @@
+/*
+ *  ====================================================================
+ *    Licensed to the Apache Software Foundation (ASF) under one or more
+ *    contributor license agreements.  See the NOTICE file distributed with
+ *    this work for additional information regarding copyright ownership.
+ *    The ASF licenses this file to You under the Apache License, Version 2.0
+ *    (the "License"); you may not use this file except in compliance with
+ *    the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ * ====================================================================
+ */
+
+package org.apache.poi.xssf.streaming;
+
+import junit.framework.TestCase;
+
+public final class TestOutlining extends TestCase {
+	public void testSetRowGroupCollapsed() throws Exception {
+
+		SXSSFWorkbook wb2 = new SXSSFWorkbook(100);
+		wb2.setCompressTempFiles(true);
+		SXSSFSheet sheet2 = (SXSSFSheet) wb2.createSheet("new sheet");
+
+		int rowCount = 20;
+		for (int i = 0; i < rowCount; i++) {
+			sheet2.createRow(i);
+		}
+
+		sheet2.groupRow(4, 9);
+		sheet2.groupRow(11, 19);
+
+		sheet2.setRowGroupCollapsed(4, true);
+
+		SXSSFRow r = (SXSSFRow) sheet2.getRow(8);
+		assertTrue(r.getHidden());
+		r = (SXSSFRow) sheet2.getRow(10);
+		assertTrue(r.getCollapsed());
+		r = (SXSSFRow) sheet2.getRow(12);
+		assertNull(r.getHidden());
+		wb2.dispose();
+	}
+
+	public void testSetRowGroupCollapsedError() throws Exception {
+
+		SXSSFWorkbook wb2 = new SXSSFWorkbook(100);
+		wb2.setCompressTempFiles(true);
+		SXSSFSheet sheet2 = (SXSSFSheet) wb2.createSheet("new sheet");
+
+		int rowCount = 20;
+		for (int i = 0; i < rowCount; i++) {
+			sheet2.createRow(i);
+		}
+
+		sheet2.groupRow(4, 9);
+		sheet2.groupRow(11, 19);
+
+		try {
+			sheet2.setRowGroupCollapsed(3, true);
+			fail("Should fail with an exception");
+		} catch (IllegalArgumentException e) {
+			assertTrue(e.getMessage().contains("row (3)"));
+		}
+
+		try {
+			sheet2.setRowGroupCollapsed(10, true);
+			fail("Should fail with an exception");
+		} catch (IllegalArgumentException e) {
+			assertTrue(e.getMessage().contains("row (10)"));
+		}
+
+		try {
+			sheet2.setRowGroupCollapsed(0, true);
+			fail("Should fail with an exception");
+		} catch (IllegalArgumentException e) {
+			assertTrue(e.getMessage().contains("row (0)"));
+		}
+
+		try {
+			sheet2.setRowGroupCollapsed(20, true);
+			fail("Should fail with an exception");
+		} catch (IllegalArgumentException e) {
+			assertTrue("Had: " + e.getMessage(), 
+					e.getMessage().contains("Row does not exist"));
+		}
+
+		SXSSFRow r = (SXSSFRow) sheet2.getRow(8);
+		assertNotNull(r);
+		assertNull(r.getHidden());
+		r = (SXSSFRow) sheet2.getRow(10);
+		assertNull(r.getCollapsed());
+		r = (SXSSFRow) sheet2.getRow(12);
+		assertNull(r.getHidden());
+		wb2.dispose();
+	}
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org