mirror of
https://github.com/apache/poi.git
synced 2026-02-27 20:40:08 +08:00
rework SXSSF groupRow and add test
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1907068 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
cde87ab3c6
commit
4944aa4c2e
@ -51,7 +51,6 @@ public class SXSSFSheet implements Sheet, OoxmlSheetExtensions {
|
||||
protected SheetDataWriter _writer;
|
||||
private int _randomAccessWindowSize = SXSSFWorkbook.DEFAULT_WINDOW_SIZE;
|
||||
protected AutoSizeColumnTracker _autoSizeColumnTracker;
|
||||
private int outlineLevelRow;
|
||||
private int lastFlushedRowNumber = -1;
|
||||
private boolean allFlushed;
|
||||
private int leftMostColumn = SpreadsheetVersion.EXCEL2007.getLastColumnIndex();
|
||||
@ -1241,7 +1240,7 @@ public class SXSSFSheet implements Sheet, OoxmlSheetExtensions {
|
||||
*/
|
||||
@Override
|
||||
public void groupColumn(int fromColumn, int toColumn) {
|
||||
_sh.groupColumn(fromColumn,toColumn);
|
||||
_sh.groupColumn(fromColumn, toColumn);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1294,16 +1293,14 @@ public class SXSSFSheet implements Sheet, OoxmlSheetExtensions {
|
||||
*/
|
||||
@Override
|
||||
public void groupRow(int fromRow, int toRow) {
|
||||
int maxLevelRow = -1;
|
||||
for(SXSSFRow row : _rows.subMap(fromRow, toRow + 1).values()){
|
||||
int level = row.getOutlineLevel() + 1;
|
||||
final int level = row.getOutlineLevel() + 1;
|
||||
row.setOutlineLevel(level);
|
||||
|
||||
if(level > outlineLevelRow) {
|
||||
outlineLevelRow = level;
|
||||
}
|
||||
maxLevelRow = Math.max(maxLevelRow, level);
|
||||
}
|
||||
|
||||
setWorksheetOutlineLevelRow();
|
||||
setWorksheetOutlineLevelRowIfNecessary((short) Math.min(Short.MAX_VALUE, maxLevelRow));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1323,19 +1320,16 @@ public class SXSSFSheet implements Sheet, OoxmlSheetExtensions {
|
||||
public void setRowOutlineLevel(int rownum, int level) {
|
||||
SXSSFRow row = _rows.get(rownum);
|
||||
row.setOutlineLevel(level);
|
||||
if(level > 0 && level > outlineLevelRow) {
|
||||
outlineLevelRow = level;
|
||||
setWorksheetOutlineLevelRow();
|
||||
}
|
||||
setWorksheetOutlineLevelRowIfNecessary((short) Math.min(Short.MAX_VALUE, level));
|
||||
}
|
||||
|
||||
private void setWorksheetOutlineLevelRow() {
|
||||
private void setWorksheetOutlineLevelRowIfNecessary(final short levelRow) {
|
||||
CTWorksheet ct = _sh.getCTWorksheet();
|
||||
CTSheetFormatPr pr = ct.isSetSheetFormatPr() ?
|
||||
ct.getSheetFormatPr() :
|
||||
ct.addNewSheetFormatPr();
|
||||
if(outlineLevelRow > 0) {
|
||||
pr.setOutlineLevelRow((short)outlineLevelRow);
|
||||
if(levelRow > _sh.getSheetFormatPrOutlineLevelRow()) {
|
||||
pr.setOutlineLevelRow(levelRow);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -3462,11 +3462,11 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet, OoxmlSheetEx
|
||||
getSheetTypeSheetFormatPr().setOutlineLevelRow(maxLevelRow);
|
||||
}
|
||||
|
||||
private short getSheetFormatPrOutlineLevelRow() {
|
||||
public short getSheetFormatPrOutlineLevelRow() {
|
||||
return getSheetTypeSheetFormatPr().getOutlineLevelRow();
|
||||
}
|
||||
|
||||
private short getSheetFormatPrOutlineLevelCol() {
|
||||
public short getSheetFormatPrOutlineLevelCol() {
|
||||
return getSheetTypeSheetFormatPr().getOutlineLevelCol();
|
||||
}
|
||||
|
||||
|
||||
@ -20,6 +20,7 @@
|
||||
package org.apache.poi.xssf.streaming;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||
|
||||
import java.io.IOException;
|
||||
@ -33,6 +34,7 @@ import org.apache.poi.xssf.usermodel.XSSFSheet;
|
||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRow;
|
||||
|
||||
|
||||
public final class TestSXSSFSheet extends BaseTestXSheet {
|
||||
@ -177,4 +179,67 @@ public final class TestSXSSFSheet extends BaseTestXSheet {
|
||||
|
||||
wb.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
void groupRow() throws IOException {
|
||||
try (SXSSFWorkbook workbook = new SXSSFWorkbook()) {
|
||||
SXSSFSheet sheet = workbook.createSheet();
|
||||
|
||||
// XSSF code can group rows even if there are no XSSFRows yet, SXSSFWorkbook needs the rows to exist first
|
||||
for (int i = 0; i < 20; i++) {
|
||||
sheet.createRow(i);
|
||||
}
|
||||
|
||||
//one level
|
||||
sheet.groupRow(9, 10);
|
||||
|
||||
try(UnsynchronizedByteArrayOutputStream bos = new UnsynchronizedByteArrayOutputStream()) {
|
||||
workbook.write(bos);
|
||||
try(XSSFWorkbook xssfWorkbook = new XSSFWorkbook(bos.toInputStream())) {
|
||||
XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(0);
|
||||
CTRow ctrow = xssfSheet.getRow(9).getCTRow();
|
||||
|
||||
assertNotNull(ctrow);
|
||||
assertEquals(10, ctrow.getR());
|
||||
assertEquals(1, ctrow.getOutlineLevel());
|
||||
assertEquals(1, xssfSheet.getCTWorksheet().getSheetFormatPr().getOutlineLevelRow());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void groupRow2Levels() throws IOException {
|
||||
try (SXSSFWorkbook workbook = new SXSSFWorkbook()) {
|
||||
SXSSFSheet sheet = workbook.createSheet();
|
||||
|
||||
// XSSF code can group rows even if there are no XSSFRows yet, SXSSFWorkbook needs the rows to exist first
|
||||
for (int i = 0; i < 20; i++) {
|
||||
sheet.createRow(i);
|
||||
}
|
||||
|
||||
//one level
|
||||
sheet.groupRow(9, 10);
|
||||
//two level
|
||||
sheet.groupRow(10, 13);
|
||||
|
||||
try(UnsynchronizedByteArrayOutputStream bos = new UnsynchronizedByteArrayOutputStream()) {
|
||||
workbook.write(bos);
|
||||
try(XSSFWorkbook xssfWorkbook = new XSSFWorkbook(bos.toInputStream())) {
|
||||
XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(0);
|
||||
CTRow ctrow = xssfSheet.getRow(9).getCTRow();
|
||||
|
||||
assertNotNull(ctrow);
|
||||
assertEquals(10, ctrow.getR());
|
||||
assertEquals(1, ctrow.getOutlineLevel());
|
||||
|
||||
ctrow = xssfSheet.getRow(10).getCTRow();
|
||||
assertNotNull(ctrow);
|
||||
assertEquals(11, ctrow.getR());
|
||||
assertEquals(2, ctrow.getOutlineLevel());
|
||||
assertEquals(2, xssfSheet.getCTWorksheet().getSheetFormatPr().getOutlineLevelRow());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user