Bug 55369: Add support for collapsing rows in SXSSF

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1533932 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Dominik Stadler 2013-10-20 18:04:08 +00:00
parent 689f027749
commit 1bf79ee0cf
5 changed files with 248 additions and 9 deletions

View File

@ -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();
}
}

View File

@ -40,6 +40,9 @@ 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)
{
@ -62,6 +65,21 @@ public class SXSSFRow implements Row
_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()
{

View File

@ -1143,9 +1143,66 @@ public class SXSSFSheet implements Sheet, Cloneable
*/
public void setRowGroupCollapsed(int row, boolean collapse)
{
//_sh.setRowGroupCollapsed(row, collapse);
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;
}
/**
* Sets the default column style for a given column. POI will only apply this style to new cells added to the sheet.

View File

@ -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;

View File

@ -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();
}
}