mirror of https://github.com/apache/poi.git
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:
parent
e5387b1e72
commit
c35b61e1fc
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -40,7 +40,10 @@ public class SXSSFRow implements Row
|
||||||
short _height=-1;
|
short _height=-1;
|
||||||
boolean _zHeight = false;
|
boolean _zHeight = false;
|
||||||
int _outlineLevel = 0; // Outlining level of the row, when outlining is on
|
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)
|
public SXSSFRow(SXSSFSheet sheet, int initialSize)
|
||||||
{
|
{
|
||||||
_sheet=sheet;
|
_sheet=sheet;
|
||||||
|
@ -61,7 +64,22 @@ public class SXSSFRow implements Row
|
||||||
void setOutlineLevel(int level){
|
void setOutlineLevel(int level){
|
||||||
_outlineLevel = 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
|
//begin of interface implementation
|
||||||
public Iterator<Cell> iterator()
|
public Iterator<Cell> iterator()
|
||||||
{
|
{
|
||||||
|
|
|
@ -1143,8 +1143,65 @@ public class SXSSFSheet implements Sheet, Cloneable
|
||||||
*/
|
*/
|
||||||
public void setRowGroupCollapsed(int row, boolean collapse)
|
public void setRowGroupCollapsed(int row, boolean collapse)
|
||||||
{
|
{
|
||||||
//_sh.setRowGroupCollapsed(row, collapse);
|
if (collapse) {
|
||||||
throw new RuntimeException("Not Implemented");
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -19,16 +19,19 @@
|
||||||
|
|
||||||
package org.apache.poi.xssf.streaming;
|
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.Cell;
|
||||||
import org.apache.poi.ss.usermodel.CellStyle;
|
import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
import org.apache.poi.ss.usermodel.FormulaError;
|
import org.apache.poi.ss.usermodel.FormulaError;
|
||||||
import org.apache.poi.ss.util.CellReference;
|
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".
|
* Initially copied from BigGridDemo "SpreadsheetWriter".
|
||||||
|
@ -110,6 +113,7 @@ public class SheetDataWriter {
|
||||||
return _numberLastFlushedRow;
|
return _numberLastFlushedRow;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
protected void finalize() throws Throwable {
|
protected void finalize() throws Throwable {
|
||||||
_fd.delete();
|
_fd.delete();
|
||||||
}
|
}
|
||||||
|
@ -148,6 +152,13 @@ public class SheetDataWriter {
|
||||||
if (row.getOutlineLevel() != 0) {
|
if (row.getOutlineLevel() != 0) {
|
||||||
_out.write(" outlineLevel=\"" + row.getOutlineLevel() + "\"");
|
_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");
|
_out.write(">\n");
|
||||||
this._rownum = rownum;
|
this._rownum = rownum;
|
||||||
_rowContainedNullCells = false;
|
_rowContainedNullCells = false;
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue