Patch to support Horizontal and Vertical Page breaks, included testcases

and files.
PR:
Obtained from:
Submitted by:	
Reviewed by:	
CVS: ----------------------------------------------------------------------
CVS: PR:
CVS:   If this change addresses a PR in the problem report tracking
CVS:   database, then enter the PR number(s) here.
CVS: Obtained from:
CVS:   If this change has been taken from another system, such as NCSA,
CVS:   then name the system in this line, otherwise delete it.
CVS: Submitted by:
CVS:   If this code has been contributed to Apache by someone else; i.e.,
CVS:   they sent us a patch or a new module, then include their name/email
CVS:   address here. If this is your work then delete this line.
CVS: Reviewed by:
CVS:   If we are doing pre-commit code reviews and someone else has
CVS:   reviewed your changes, include their name(s) here.
CVS:   If you have not had it reviewed then delete this line.


git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/branches/REL_2_BRANCH@353493 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Danny Muid 2004-02-09 22:41:27 +00:00
parent 34e230f63e
commit bf326c25a0
12 changed files with 1076 additions and 85 deletions

View File

@ -2,7 +2,7 @@
* ==================================================================== * ====================================================================
* The Apache Software License, Version 1.1 * The Apache Software License, Version 1.1
* *
* Copyright (c) 2003 The Apache Software Foundation. All rights * Copyright (c) 2004 The Apache Software Foundation. All rights
* reserved. * reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -633,6 +633,14 @@ public class BiffViewer {
case SharedFormulaRecord.sid: case SharedFormulaRecord.sid:
retval = new SharedFormulaRecord( rectype, size, data); retval = new SharedFormulaRecord( rectype, size, data);
break; break;
case HorizontalPageBreakRecord.sid:
retval = new HorizontalPageBreakRecord( rectype, size, data);
break;
case VerticalPageBreakRecord.sid:
retval = new VerticalPageBreakRecord( rectype, size, data);
break;
default: default:
retval = new UnknownRecord( rectype, size, data ); retval = new UnknownRecord( rectype, size, data );
} }

View File

@ -2,7 +2,7 @@
/* ==================================================================== /* ====================================================================
* The Apache Software License, Version 1.1 * The Apache Software License, Version 1.1
* *
* Copyright (c) 2003 The Apache Software Foundation. All rights * Copyright (c) 2004 The Apache Software Foundation. All rights
* reserved. * reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -122,6 +122,9 @@ public class Sheet implements Model
private Iterator rowRecIterator = null; private Iterator rowRecIterator = null;
protected int eofLoc = 0; protected int eofLoc = 0;
protected ProtectRecord protect = null; protected ProtectRecord protect = null;
protected PageBreakRecord rowBreaks = null;
protected PageBreakRecord colBreaks = null;
public static final byte PANE_LOWER_RIGHT = (byte)0; public static final byte PANE_LOWER_RIGHT = (byte)0;
public static final byte PANE_UPPER_RIGHT = (byte)1; public static final byte PANE_UPPER_RIGHT = (byte)1;
@ -155,7 +158,7 @@ public class Sheet implements Model
*/ */
public static Sheet createSheet(List recs, int sheetnum, int offset) public static Sheet createSheet(List recs, int sheetnum, int offset)
{ {
log.logFormatted(log.DEBUG, log.logFormatted(POILogger.DEBUG,
"Sheet createSheet (existing file) with %", "Sheet createSheet (existing file) with %",
new Integer(recs.size())); new Integer(recs.size()));
Sheet retval = new Sheet(); Sheet retval = new Sheet();
@ -170,18 +173,18 @@ public class Sheet implements Model
if (rec.getSid() == LabelRecord.sid) if (rec.getSid() == LabelRecord.sid)
{ {
log.log(log.DEBUG, "Hit label record."); log.log(POILogger.DEBUG, "Hit label record.");
retval.containsLabels = true; retval.containsLabels = true;
} }
else if (rec.getSid() == BOFRecord.sid) else if (rec.getSid() == BOFRecord.sid)
{ {
bofEofNestingLevel++; bofEofNestingLevel++;
log.log(log.DEBUG, "Hit BOF record. Nesting increased to " + bofEofNestingLevel); log.log(POILogger.DEBUG, "Hit BOF record. Nesting increased to " + bofEofNestingLevel);
} }
else if (rec.getSid() == EOFRecord.sid) else if (rec.getSid() == EOFRecord.sid)
{ {
--bofEofNestingLevel; --bofEofNestingLevel;
log.log(log.DEBUG, "Hit EOF record. Nesting decreased to " + bofEofNestingLevel); log.log(POILogger.DEBUG, "Hit EOF record. Nesting decreased to " + bofEofNestingLevel);
if (bofEofNestingLevel == 0) { if (bofEofNestingLevel == 0) {
records.add(rec); records.add(rec);
retval.eofLoc = k; retval.eofLoc = k;
@ -290,6 +293,14 @@ public class Sheet implements Model
{ {
retval.protect = (ProtectRecord) rec; retval.protect = (ProtectRecord) rec;
} }
else if (rec.getSid() == PageBreakRecord.HORIZONTAL_SID)
{
retval.rowBreaks = (PageBreakRecord)rec;
}
else if (rec.getSid() == PageBreakRecord.VERTICAL_SID)
{
retval.colBreaks = (PageBreakRecord)rec;
}
if (rec != null) if (rec != null)
{ {
@ -307,7 +318,7 @@ public class Sheet implements Model
// { // {
// retval.cells = new ValueRecordsAggregate(); // retval.cells = new ValueRecordsAggregate();
// } // }
log.log(log.DEBUG, "sheet createSheet (existing file) exited"); log.log(POILogger.DEBUG, "sheet createSheet (existing file) exited");
return retval; return retval;
} }
@ -366,7 +377,7 @@ public class Sheet implements Model
public static Sheet createSheet(List records, int sheetnum) public static Sheet createSheet(List records, int sheetnum)
{ {
log.log(log.DEBUG, log.log(POILogger.DEBUG,
"Sheet createSheet (exisiting file) assumed offset 0"); "Sheet createSheet (exisiting file) assumed offset 0");
return createSheet(records, sheetnum, 0); return createSheet(records, sheetnum, 0);
} }
@ -381,7 +392,7 @@ public class Sheet implements Model
public static Sheet createSheet() public static Sheet createSheet()
{ {
log.log(log.DEBUG, "Sheet createsheet from scratch called"); log.log(POILogger.DEBUG, "Sheet createsheet from scratch called");
Sheet retval = new Sheet(); Sheet retval = new Sheet();
ArrayList records = new ArrayList(30); ArrayList records = new ArrayList(30);
@ -404,6 +415,12 @@ public class Sheet implements Model
(DefaultRowHeightRecord) retval.createDefaultRowHeight(); (DefaultRowHeightRecord) retval.createDefaultRowHeight();
records.add( retval.defaultrowheight ); records.add( retval.defaultrowheight );
records.add( retval.createWSBool() ); records.add( retval.createWSBool() );
retval.rowBreaks = new PageBreakRecord(PageBreakRecord.HORIZONTAL_SID);
records.add(retval.rowBreaks);
retval.colBreaks = new PageBreakRecord(PageBreakRecord.VERTICAL_SID);
records.add(retval.colBreaks);
retval.header = (HeaderRecord) retval.createHeader(); retval.header = (HeaderRecord) retval.createHeader();
records.add( retval.header ); records.add( retval.header );
retval.footer = (FooterRecord) retval.createFooter(); retval.footer = (FooterRecord) retval.createFooter();
@ -416,8 +433,8 @@ public class Sheet implements Model
(DefaultColWidthRecord) retval.createDefaultColWidth(); (DefaultColWidthRecord) retval.createDefaultColWidth();
records.add( retval.defaultcolwidth); records.add( retval.defaultcolwidth);
retval.dims = ( DimensionsRecord ) retval.createDimensions(); retval.dims = ( DimensionsRecord ) retval.createDimensions();
retval.dimsloc = 19;
records.add(retval.dims); records.add(retval.dims);
retval.dimsloc = records.size()-1;
records.add(retval.windowTwo = retval.createWindowTwo()); records.add(retval.windowTwo = retval.createWindowTwo());
retval.setLoc(records.size() - 1); retval.setLoc(records.size() - 1);
retval.selection = retval.selection =
@ -426,8 +443,9 @@ public class Sheet implements Model
retval.protect = (ProtectRecord) retval.createProtect(); retval.protect = (ProtectRecord) retval.createProtect();
records.add(retval.protect); records.add(retval.protect);
records.add(retval.createEOF()); records.add(retval.createEOF());
retval.records = records; retval.records = records;
log.log(log.DEBUG, "Sheet createsheet from scratch exit"); log.log(POILogger.DEBUG, "Sheet createsheet from scratch exit");
return retval; return retval;
} }
@ -566,7 +584,7 @@ public class Sheet implements Model
public void convertLabelRecords(Workbook wb) public void convertLabelRecords(Workbook wb)
{ {
log.log(log.DEBUG, "convertLabelRecords called"); log.log(POILogger.DEBUG, "convertLabelRecords called");
if (containsLabels) if (containsLabels)
{ {
for (int k = 0; k < records.size(); k++) for (int k = 0; k < records.size(); k++)
@ -590,7 +608,7 @@ public class Sheet implements Model
} }
} }
} }
log.log(log.DEBUG, "convertLabelRecords exit"); log.log(POILogger.DEBUG, "convertLabelRecords exit");
} }
/** /**
@ -604,8 +622,8 @@ public class Sheet implements Model
{ {
checkCells(); checkCells();
checkRows(); checkRows();
log.log(log.DEBUG, "Sheet.getNumRecords"); log.log(POILogger.DEBUG, "Sheet.getNumRecords");
log.logFormatted(log.DEBUG, "returning % + % + % - 2 = %", new int[] log.logFormatted(POILogger.DEBUG, "returning % + % + % - 2 = %", new int[]
{ {
records.size(), cells.getPhysicalNumberOfCells(), records.size(), cells.getPhysicalNumberOfCells(),
rows.getPhysicalNumberOfRows(), rows.getPhysicalNumberOfRows(),
@ -628,8 +646,8 @@ public class Sheet implements Model
public void setDimensions(int firstrow, short firstcol, int lastrow, public void setDimensions(int firstrow, short firstcol, int lastrow,
short lastcol) short lastcol)
{ {
log.log(log.DEBUG, "Sheet.setDimensions"); log.log(POILogger.DEBUG, "Sheet.setDimensions");
log.log(log.DEBUG, log.log(POILogger.DEBUG,
(new StringBuffer("firstrow")).append(firstrow) (new StringBuffer("firstrow")).append(firstrow)
.append("firstcol").append(firstcol).append("lastrow") .append("firstcol").append(firstcol).append("lastrow")
.append(lastrow).append("lastcol").append(lastcol) .append(lastrow).append("lastcol").append(lastcol)
@ -638,7 +656,7 @@ public class Sheet implements Model
dims.setFirstRow(firstrow); dims.setFirstRow(firstrow);
dims.setLastCol(lastcol); dims.setLastCol(lastcol);
dims.setLastRow(lastrow); dims.setLastRow(lastrow);
log.log(log.DEBUG, "Sheet.setDimensions exiting"); log.log(POILogger.DEBUG, "Sheet.setDimensions exiting");
} }
/** /**
@ -660,7 +678,7 @@ public class Sheet implements Model
public void setLoc(int loc) public void setLoc(int loc)
{ {
valueRecIterator = null; valueRecIterator = null;
log.log(log.DEBUG, "sheet.setLoc(): " + loc); log.log(POILogger.DEBUG, "sheet.setLoc(): " + loc);
this.loc = loc; this.loc = loc;
} }
@ -671,7 +689,7 @@ public class Sheet implements Model
public int getLoc() public int getLoc()
{ {
log.log(log.DEBUG, "sheet.getLoc():" + loc); log.log(POILogger.DEBUG, "sheet.getLoc():" + loc);
return loc; return loc;
} }
@ -709,7 +727,7 @@ public class Sheet implements Model
public byte [] serialize() public byte [] serialize()
{ {
log.log(log.DEBUG, "Sheet.serialize"); log.log(POILogger.DEBUG, "Sheet.serialize");
// addDBCellRecords(); // addDBCellRecords();
byte[] retval = null; byte[] retval = null;
@ -726,7 +744,7 @@ public class Sheet implements Model
// for (int k = 0; k < bytes.size(); k++) // for (int k = 0; k < bytes.size(); k++)
// { // {
// arraysize += (( byte [] ) bytes.get(k)).length; // arraysize += (( byte [] ) bytes.get(k)).length;
// log.debug((new StringBuffer("arraysize=")).append(arraysize) // POILogger.DEBUG((new StringBuffer("arraysize=")).append(arraysize)
// .toString()); // .toString());
// } // }
retval = new byte[ arraysize ]; retval = new byte[ arraysize ];
@ -738,7 +756,7 @@ public class Sheet implements Model
pos += (( Record ) records.get(k)).serialize(pos, pos += (( Record ) records.get(k)).serialize(pos,
retval); // rec.length; retval); // rec.length;
} }
log.log(log.DEBUG, "Sheet.serialize returning " + retval); log.log(POILogger.DEBUG, "Sheet.serialize returning " + retval);
return retval; return retval;
} }
@ -753,7 +771,7 @@ public class Sheet implements Model
public int serialize(int offset, byte [] data) public int serialize(int offset, byte [] data)
{ {
log.log(log.DEBUG, "Sheet.serialize using offsets"); log.log(POILogger.DEBUG, "Sheet.serialize using offsets");
// addDBCellRecords(); // addDBCellRecords();
// ArrayList bytes = new ArrayList(4096); // ArrayList bytes = new ArrayList(4096);
@ -768,7 +786,7 @@ public class Sheet implements Model
// for (int k = 0; k < bytes.size(); k++) // for (int k = 0; k < bytes.size(); k++)
// { // {
// arraysize += (( byte [] ) bytes.get(k)).length; // arraysize += (( byte [] ) bytes.get(k)).length;
// log.debug((new StringBuffer("arraysize=")).append(arraysize) // POILogger.DEBUG((new StringBuffer("arraysize=")).append(arraysize)
// .toString()); // .toString());
// } // }
for (int k = 0; k < records.size(); k++) for (int k = 0; k < records.size(); k++)
@ -787,7 +805,7 @@ public class Sheet implements Model
pos += record.serialize(pos + offset, data ); // rec.length; pos += record.serialize(pos + offset, data ); // rec.length;
} }
log.log(log.DEBUG, "Sheet.serialize returning "); log.log(POILogger.DEBUG, "Sheet.serialize returning ");
return pos; return pos;
} }
@ -801,7 +819,7 @@ public class Sheet implements Model
public RowRecord createRow(int row) public RowRecord createRow(int row)
{ {
log.log(log.DEBUG, "create row number " + row); log.log(POILogger.DEBUG, "create row number " + row);
RowRecord rowrec = new RowRecord(); RowRecord rowrec = new RowRecord();
//rowrec.setRowNumber(( short ) row); //rowrec.setRowNumber(( short ) row);
@ -826,7 +844,7 @@ public class Sheet implements Model
//public LabelSSTRecord createLabelSST(short row, short col, int index) //public LabelSSTRecord createLabelSST(short row, short col, int index)
public LabelSSTRecord createLabelSST(int row, short col, int index) public LabelSSTRecord createLabelSST(int row, short col, int index)
{ {
log.logFormatted(log.DEBUG, "create labelsst row,col,index %,%,%", log.logFormatted(POILogger.DEBUG, "create labelsst row,col,index %,%,%",
new int[] new int[]
{ {
row, col, index row, col, index
@ -853,7 +871,7 @@ public class Sheet implements Model
//public NumberRecord createNumber(short row, short col, double value) //public NumberRecord createNumber(short row, short col, double value)
public NumberRecord createNumber(int row, short col, double value) public NumberRecord createNumber(int row, short col, double value)
{ {
log.logFormatted(log.DEBUG, "create number row,col,value %,%,%", log.logFormatted(POILogger.DEBUG, "create number row,col,value %,%,%",
new double[] new double[]
{ {
row, col, value row, col, value
@ -878,8 +896,8 @@ public class Sheet implements Model
//public BlankRecord createBlank(short row, short col) //public BlankRecord createBlank(short row, short col)
public BlankRecord createBlank(int row, short col) public BlankRecord createBlank(int row, short col)
{ {
//log.logFormatted(log.DEBUG, "create blank row,col %,%", new short[] //log.logFormatted(POILogger.DEBUG, "create blank row,col %,%", new short[]
log.logFormatted(log.DEBUG, "create blank row,col %,%", new int[] log.logFormatted(POILogger.DEBUG, "create blank row,col %,%", new int[]
{ {
row, col row, col
}); });
@ -905,7 +923,7 @@ public class Sheet implements Model
//public FormulaRecord createFormula(short row, short col, String formula) //public FormulaRecord createFormula(short row, short col, String formula)
public FormulaRecord createFormula(int row, short col, String formula) public FormulaRecord createFormula(int row, short col, String formula)
{ {
log.logFormatted(log.DEBUG, "create formula row,col,formula %,%,%", log.logFormatted(POILogger.DEBUG, "create formula row,col,formula %,%,%",
//new short[] //new short[]
new int[] new int[]
{ {
@ -949,7 +967,7 @@ public class Sheet implements Model
public void addValueRecord(int row, CellValueRecordInterface col) public void addValueRecord(int row, CellValueRecordInterface col)
{ {
checkCells(); checkCells();
log.logFormatted(log.DEBUG, "add value record row,loc %,%", new int[] log.logFormatted(POILogger.DEBUG, "add value record row,loc %,%", new int[]
{ {
row, loc row, loc
}); });
@ -1003,7 +1021,7 @@ public class Sheet implements Model
public void removeValueRecord(int row, CellValueRecordInterface col) public void removeValueRecord(int row, CellValueRecordInterface col)
{ {
checkCells(); checkCells();
log.logFormatted(log.DEBUG, "remove value record row,dimsloc %,%", log.logFormatted(POILogger.DEBUG, "remove value record row,dimsloc %,%",
new int[]{row, dimsloc} ); new int[]{row, dimsloc} );
loc = dimsloc; loc = dimsloc;
cells.removeCell(col); cells.removeCell(col);
@ -1044,7 +1062,7 @@ public class Sheet implements Model
{ {
checkCells(); checkCells();
setLoc(dimsloc); setLoc(dimsloc);
log.log(log.DEBUG, "replaceValueRecord "); log.log(POILogger.DEBUG, "replaceValueRecord ");
cells.insertCell(newval); cells.insertCell(newval);
/* /*
@ -1080,7 +1098,7 @@ public class Sheet implements Model
public void addRow(RowRecord row) public void addRow(RowRecord row)
{ {
checkRows(); checkRows();
log.log(log.DEBUG, "addRow "); log.log(POILogger.DEBUG, "addRow ");
DimensionsRecord d = ( DimensionsRecord ) records.get(getDimsLoc()); DimensionsRecord d = ( DimensionsRecord ) records.get(getDimsLoc());
if (row.getRowNumber() > d.getLastRow()) if (row.getRowNumber() > d.getLastRow())
@ -1134,7 +1152,7 @@ public class Sheet implements Model
* } * }
* } * }
*/ */
log.log(log.DEBUG, "exit addRow"); log.log(POILogger.DEBUG, "exit addRow");
} }
/** /**
@ -1194,7 +1212,7 @@ public class Sheet implements Model
public CellValueRecordInterface getNextValueRecord() public CellValueRecordInterface getNextValueRecord()
{ {
log.log(log.DEBUG, "getNextValue loc= " + loc); log.log(POILogger.DEBUG, "getNextValue loc= " + loc);
if (valueRecIterator == null) if (valueRecIterator == null)
{ {
valueRecIterator = cells.getIterator(); valueRecIterator = cells.getIterator();
@ -1241,7 +1259,7 @@ public class Sheet implements Model
/* public Record getNextRowOrValue() /* public Record getNextRowOrValue()
{ {
log.debug((new StringBuffer("getNextRow loc= ")).append(loc) POILogger.DEBUG((new StringBuffer("getNextRow loc= ")).append(loc)
.toString()); .toString());
if (this.getLoc() < records.size()) if (this.getLoc() < records.size())
{ {
@ -1281,7 +1299,7 @@ public class Sheet implements Model
public RowRecord getNextRow() public RowRecord getNextRow()
{ {
log.log(log.DEBUG, "getNextRow loc= " + loc); log.log(POILogger.DEBUG, "getNextRow loc= " + loc);
if (rowRecIterator == null) if (rowRecIterator == null)
{ {
rowRecIterator = rows.getIterator(); rowRecIterator = rows.getIterator();
@ -1327,7 +1345,7 @@ public class Sheet implements Model
//public RowRecord getRow(short rownum) //public RowRecord getRow(short rownum)
public RowRecord getRow(int rownum) public RowRecord getRow(int rownum)
{ {
log.log(log.DEBUG, "getNextRow loc= " + loc); log.log(POILogger.DEBUG, "getNextRow loc= " + loc);
return rows.getRow(rownum); return rows.getRow(rownum);
/* /*
@ -1543,7 +1561,7 @@ public class Sheet implements Model
{ {
RefModeRecord retval = new RefModeRecord(); RefModeRecord retval = new RefModeRecord();
retval.setMode(retval.USE_A1_MODE); retval.setMode(RefModeRecord.USE_A1_MODE);
return retval; return retval;
} }
@ -2161,7 +2179,7 @@ public class Sheet implements Model
public int getDimsLoc() public int getDimsLoc()
{ {
log.log(log.DEBUG, "getDimsLoc dimsloc= " + dimsloc); log.log(POILogger.DEBUG, "getDimsLoc dimsloc= " + dimsloc);
return dimsloc; return dimsloc;
} }
@ -2533,7 +2551,7 @@ public class Sheet implements Model
protected Record createProtect() protected Record createProtect()
{ {
log.log(log.DEBUG, "create protect record with protection disabled"); log.log(POILogger.DEBUG, "create protect record with protection disabled");
ProtectRecord retval = new ProtectRecord(); ProtectRecord retval = new ProtectRecord();
retval.setProtect(false); retval.setProtect(false);
@ -2604,4 +2622,137 @@ public class Sheet implements Model
margins = new Margin[4]; margins = new Margin[4];
return margins; return margins;
} }
/**
* Shifts all the page breaks in the range "count" number of rows/columns
* @param breaks The page record to be shifted
* @param start Starting "main" value to shift breaks
* @param stop Ending "main" value to shift breaks
* @param count number of units (rows/columns) to shift by
*/
public void shiftBreaks(PageBreakRecord breaks, short start, short stop, int count) {
if(rowBreaks == null)
return;
Iterator iterator = breaks.getBreaksIterator();
List shiftedBreak = new ArrayList();
while(iterator.hasNext())
{
PageBreakRecord.Break breakItem = (PageBreakRecord.Break)iterator.next();
short breakLocation = breakItem.main;
boolean inStart = (breakLocation >= start);
boolean inEnd = (breakLocation <= stop);
if(inStart && inEnd)
shiftedBreak.add(breakItem);
}
iterator = shiftedBreak.iterator();
while (iterator.hasNext()) {
PageBreakRecord.Break breakItem = (PageBreakRecord.Break)iterator.next();
breaks.removeBreak(breakItem.main);
breaks.addBreak((short)(breakItem.main+count), breakItem.subFrom, breakItem.subTo);
}
}
/**
* Sets a page break at the indicated row
* @param row
*/
public void setRowBreak(int row, short fromCol, short toCol) {
rowBreaks.addBreak((short)row, fromCol, toCol);
}
/**
* Removes a page break at the indicated row
* @param row
*/
public void removeRowBreak(int row) {
rowBreaks.removeBreak((short)row);
}
/**
* Queries if the specified row has a page break
* @param row
* @return true if the specified row has a page break
*/
public boolean isRowBroken(int row) {
return rowBreaks.getBreak((short)row) != null;
}
/**
* Sets a page break at the indicated column
* @param row
*/
public void setColumnBreak(short column, short fromRow, short toRow) {
colBreaks.addBreak(column, fromRow, toRow);
}
/**
* Removes a page break at the indicated column
* @param row
*/
public void removeColumnBreak(short column) {
colBreaks.removeBreak(column);
}
/**
* Queries if the specified column has a page break
* @param row
* @return true if the specified column has a page break
*/
public boolean isColumnBroken(short column) {
return colBreaks.getBreak(column) != null;
}
/**
* Shifts the horizontal page breaks for the indicated count
* @param startingRow
* @param endingRow
* @param count
*/
public void shiftRowBreaks(int startingRow, int endingRow, int count) {
shiftBreaks(rowBreaks, (short)startingRow, (short)endingRow, (short)count);
}
/**
* Shifts the vertical page breaks for the indicated count
* @param startingCol
* @param endingCol
* @param count
*/
public void shiftColumnBreaks(short startingCol, short endingCol, short count) {
shiftBreaks(colBreaks, startingCol, endingCol, count);
}
/**
* Returns all the row page breaks
* @return
*/
public Iterator getRowBreaks() {
return rowBreaks.getBreaksIterator();
}
/**
* Returns the number of row page breaks
* @return
*/
public int getNumRowBreaks(){
return (int)rowBreaks.getNumBreaks();
}
/**
* Returns all the column page breaks
* @return
*/
public Iterator getColumnBreaks(){
return colBreaks.getBreaksIterator();
}
/**
* Returns the number of column page breaks
* @return
*/
public int getNumColumnBreaks(){
return (int)colBreaks.getNumBreaks();
}
} }

View File

@ -0,0 +1,107 @@
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2004 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache POI" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache POI", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.poi.hssf.record;
/**
* HorizontalPageBreak record that stores page breaks at rows
* <p>
* This class is just used so that SID compares work properly in the RecordFactory
* @see PageBreakRecord
* @author Danny Mui (dmui at apache dot org)
*/
public class HorizontalPageBreakRecord extends PageBreakRecord {
public static final short sid = PageBreakRecord.HORIZONTAL_SID;
/**
*
*/
public HorizontalPageBreakRecord() {
super();
}
/**
* @param sid
*/
public HorizontalPageBreakRecord(short sid) {
super(sid);
}
/**
* @param id
* @param size
* @param data
*/
public HorizontalPageBreakRecord(short id, short size, byte[] data) {
super(id, size, data);
}
/**
* @param id
* @param size
* @param data
* @param offset
*/
public HorizontalPageBreakRecord(short id, short size, byte[] data, int offset) {
super(id, size, data, offset);
}
/* (non-Javadoc)
* @see org.apache.poi.hssf.record.Record#getSid()
*/
public short getSid() {
return sid;
}
}

View File

@ -0,0 +1,304 @@
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2004 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache POI" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache POI", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.poi.hssf.record;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.poi.util.LittleEndian;
/**
* Record that contains the functionality page breaks (horizontal and vertical)
* <p>
* The other two classes just specifically set the SIDS for record creation
* @see HorizontalPageBreakRecord
* @see VerticalPageBreakREcord
*
* REFERENCE: Microsoft Excel SDK page 322 and 420
* @author Danny Mui (dmui at apache dot org)
*/
public class PageBreakRecord extends Record {
public static final short HORIZONTAL_SID = (short)0x1B;
public static final short VERTICAL_SID = (short)0x1A;
public short sid;
private short numBreaks;
private List breaks;
private Map BreakMap;
/**
* Since both records store 2byte integers (short), no point in
* differentiating it in the records.
* <p>
* The subs (rows or columns, don't seem to be able to set but excel sets
* them automatically)
*/
public class Break
{
public short main;
public short subFrom;
public short subTo;
public Break(short main, short subFrom, short subTo)
{
this.main = main;
this.subFrom = subFrom;
this.subTo = subTo;
}
}
public PageBreakRecord()
{
}
/**
*
* @param sid
*/
public PageBreakRecord(short sid) {
super();
this.sid = sid;
}
public PageBreakRecord(short id, short size, byte data[])
{
super(id, size, data);
this.sid = id;
}
public PageBreakRecord(short id, short size, byte data[], int offset)
{
super(id, size, data, offset);
this.sid = id;
}
protected void fillFields(byte data[], short size, int offset)
{
short loadedBreaks = LittleEndian.getShort(data, 0 + offset);
setNumBreaks(loadedBreaks);
int pos = 2;
for(int k = 0; k < loadedBreaks; k++)
{
addBreak((short)(LittleEndian.getShort(data, pos + offset) - 1), LittleEndian.getShort(data, pos + 2 + offset), LittleEndian.getShort(data, pos + 4 + offset));
pos += 6;
}
}
public short getSid()
{
return sid;
}
public int serialize(int offset, byte data[])
{
int recordsize = getRecordSize();
int pos = 6;
LittleEndian.putShort(data, offset + 0, getSid());
LittleEndian.putShort(data, offset + 2, (short)(recordsize - 4));
LittleEndian.putShort(data, offset + 4, getNumBreaks());
for(Iterator iterator = getBreaksIterator(); iterator.hasNext();)
{
Break Break = (Break)iterator.next();
LittleEndian.putShort(data, offset + pos, (short)(Break.main + 1));
pos += 2;
LittleEndian.putShort(data, offset + pos, Break.subFrom);
pos += 2;
LittleEndian.putShort(data, offset + pos, Break.subTo);
pos += 2;
}
return recordsize;
}
protected void validateSid(short id)
{
if(id != HORIZONTAL_SID && id != VERTICAL_SID)
throw new RecordFormatException("NOT A HorizontalPageBreak or VerticalPageBreak RECORD!! " + id);
else
return;
}
public short getNumBreaks()
{
return breaks != null ? (short)breaks.size() : numBreaks;
}
public void setNumBreaks(short numBreaks)
{
this.numBreaks = numBreaks;
}
public Iterator getBreaksIterator()
{
if(breaks == null)
return Collections.EMPTY_LIST.iterator();
else
return breaks.iterator();
}
public String toString()
{
StringBuffer retval = new StringBuffer();
if (getSid() != HORIZONTAL_SID && getSid()!= VERTICAL_SID)
return "[INVALIDPAGEBREAK]\n .sid ="+getSid()+"[INVALIDPAGEBREAK]";
String label;
String mainLabel;
String subLabel;
if (getSid() == HORIZONTAL_SID) {
label = "HORIZONTALPAGEBREAK";
mainLabel = "row";
subLabel = "col";
} else {
label = "VERTICALPAGEBREAK";
mainLabel = "column";
subLabel = "row";
}
retval.append("["+label+"]").append("\n");
retval.append(" .sid =").append(getSid()).append("\n");
retval.append(" .numbreaks =").append(getNumBreaks()).append("\n");
Iterator iterator = getBreaksIterator();
for(int k = 0; k < getNumBreaks(); k++)
{
Break region = (Break)iterator.next();
retval.append(" .").append(mainLabel).append(" (zero-based) =").append(region.main).append("\n");
retval.append(" .").append(subLabel).append("From =").append(region.subFrom).append("\n");
retval.append(" .").append(subLabel).append("To =").append(region.subTo).append("\n");
}
retval.append("["+label+"]").append("\n");
return retval.toString();
}
/**
* Adds the page break at the specified parameters
* @param main Depending on sid, will determine row or column to put page break (zero-based)
* @param subFrom No user-interface to set (defaults to minumum, 0)
* @param subTo No user-interface to set
*/
public void addBreak(short main, short subFrom, short subTo)
{
if(breaks == null)
{
breaks = new ArrayList(getNumBreaks() + 10);
BreakMap = new HashMap();
}
Integer key = new Integer(main);
Break region = (Break)BreakMap.get(key);
if(region != null)
{
region.main = main;
region.subFrom = subFrom;
region.subTo = subTo;
} else
{
region = new Break(main, subFrom, subTo);
breaks.add(region);
}
BreakMap.put(key, region);
}
/**
* Removes the break indicated by the parameter
* @param main (zero-based)
*/
public void removeBreak(short main)
{
Integer rowKey = new Integer(main);
Break region = (Break)BreakMap.get(rowKey);
breaks.remove(region);
BreakMap.remove(rowKey);
}
public int getRecordSize()
{
return 6 + getNumBreaks() * 6;
}
/**
* Retrieves the region at the row/column indicated
* @param main
* @return
*/
public Break getBreak(short main)
{
Integer rowKey = new Integer(main);
return (Break)BreakMap.get(rowKey);
}
/* Clones the page break record
* @see java.lang.Object#clone()
*/
public Object clone() {
PageBreakRecord record = new PageBreakRecord(getSid());
Iterator iterator = getBreaksIterator();
while (iterator.hasNext()) {
Break original = (Break)iterator.next();
record.addBreak(original.main, original.subFrom, original.subTo);
}
return record;
}
}

View File

@ -2,7 +2,7 @@
/* ==================================================================== /* ====================================================================
* The Apache Software License, Version 1.1 * The Apache Software License, Version 1.1
* *
* Copyright (c) 2003 The Apache Software Foundation. All rights * Copyright (c) 2004 The Apache Software Foundation. All rights
* reserved. * reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -112,7 +112,8 @@ public class RecordFactory
FormulaRecord.class, BoolErrRecord.class, ExternSheetRecord.class, FormulaRecord.class, BoolErrRecord.class, ExternSheetRecord.class,
NameRecord.class, LeftMarginRecord.class, RightMarginRecord.class, NameRecord.class, LeftMarginRecord.class, RightMarginRecord.class,
TopMarginRecord.class, BottomMarginRecord.class, TopMarginRecord.class, BottomMarginRecord.class,
PaletteRecord.class, StringRecord.class, RecalcIdRecord.class, SharedFormulaRecord.class PaletteRecord.class, StringRecord.class, RecalcIdRecord.class, SharedFormulaRecord.class,
HorizontalPageBreakRecord.class, VerticalPageBreakRecord.class
}; };
} else { } else {
records = new Class[] records = new Class[]
@ -143,7 +144,8 @@ public class RecordFactory
BoolErrRecord.class, ExternSheetRecord.class, NameRecord.class, BoolErrRecord.class, ExternSheetRecord.class, NameRecord.class,
LeftMarginRecord.class, RightMarginRecord.class, LeftMarginRecord.class, RightMarginRecord.class,
TopMarginRecord.class, BottomMarginRecord.class, TopMarginRecord.class, BottomMarginRecord.class,
PaletteRecord.class, StringRecord.class, RecalcIdRecord.class, SharedFormulaRecord.class PaletteRecord.class, StringRecord.class, RecalcIdRecord.class, SharedFormulaRecord.class,
HorizontalPageBreakRecord.class, VerticalPageBreakRecord.class
}; };
} }

View File

@ -0,0 +1,107 @@
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2004 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache POI" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache POI", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.poi.hssf.record;
/**
* VerticalPageBreak record that stores page breaks at columns
* <p>
* This class is just used so that SID compares work properly in the RecordFactory
* @see PageBreakRecord
* @author Danny Mui (dmui at apache dot org)
*/
public class VerticalPageBreakRecord extends PageBreakRecord {
public static final short sid = PageBreakRecord.VERTICAL_SID;
/**
*
*/
public VerticalPageBreakRecord() {
super();
}
/**
* @param sid
*/
public VerticalPageBreakRecord(short sid) {
super(sid);
}
/**
* @param id
* @param size
* @param data
*/
public VerticalPageBreakRecord(short id, short size, byte[] data) {
super(id, size, data);
}
/**
* @param id
* @param size
* @param data
* @param offset
*/
public VerticalPageBreakRecord(short id, short size, byte[] data, int offset) {
super(id, size, data, offset);
}
/* (non-Javadoc)
* @see org.apache.poi.hssf.record.Record#getSid()
*/
public short getSid() {
return PageBreakRecord.VERTICAL_SID;
}
}

View File

@ -1,7 +1,7 @@
/* ==================================================================== /* ====================================================================
* The Apache Software License, Version 1.1 * The Apache Software License, Version 1.1
* *
* Copyright (c) 2003 The Apache Software Foundation. All rights * Copyright (c) 2004 The Apache Software Foundation. All rights
* reserved. * reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -68,6 +68,7 @@ import org.apache.poi.hssf.model.Sheet;
import org.apache.poi.hssf.model.Workbook; import org.apache.poi.hssf.model.Workbook;
import org.apache.poi.hssf.record.CellValueRecordInterface; import org.apache.poi.hssf.record.CellValueRecordInterface;
import org.apache.poi.hssf.record.HCenterRecord; import org.apache.poi.hssf.record.HCenterRecord;
import org.apache.poi.hssf.record.PageBreakRecord;
import org.apache.poi.hssf.record.Record; import org.apache.poi.hssf.record.Record;
import org.apache.poi.hssf.record.RowRecord; import org.apache.poi.hssf.record.RowRecord;
import org.apache.poi.hssf.record.SCLRecord; import org.apache.poi.hssf.record.SCLRecord;
@ -981,6 +982,8 @@ public class HSSFSheet
* <p> * <p>
* Additionally shifts merged regions that are completely defined in these * Additionally shifts merged regions that are completely defined in these
* rows (ie. merged 2 cells on a row to be shifted). * rows (ie. merged 2 cells on a row to be shifted).
* <p>
* TODO Might want to add bounds checking here
* @param startRow the row to start shifting * @param startRow the row to start shifting
* @param endRow the row to end shifting * @param endRow the row to end shifting
* @param n the number of rows to shift * @param n the number of rows to shift
@ -1004,6 +1007,7 @@ public class HSSFSheet
} }
shiftMerged(startRow, endRow, n, true); shiftMerged(startRow, endRow, n, true);
sheet.shiftRowBreaks(startRow, endRow, n);
for ( int rowNum = s; rowNum >= startRow && rowNum <= endRow && rowNum >= 0 && rowNum < 65536; rowNum += inc ) for ( int rowNum = s; rowNum >= startRow && rowNum <= endRow && rowNum >= 0 && rowNum < 65536; rowNum += inc )
{ {
@ -1148,4 +1152,107 @@ public class HSSFSheet
public boolean isDisplayRowColHeadings() { public boolean isDisplayRowColHeadings() {
return sheet.isDisplayRowColHeadings(); return sheet.isDisplayRowColHeadings();
} }
/**
* Sets a page break at the indicated row
* @param row
*/
public void setRowBreak(int row) {
validateRow(row);
sheet.setRowBreak(row, (short)0, (short)255);
}
/**
* Determines if there is a page break at the indicated row
* @param row
* @return
*/
public boolean isRowBroken(int row) {
return sheet.isRowBroken(row);
}
/**
* Removes the page break at the indicated row
* @param row
*/
public void removeRowBreak(int row) {
sheet.removeRowBreak(row);
}
/**
* Retrieves all the horizontal page breaks
* @return
*/
public int[] getRowBreaks(){
//we can probably cache this information, but this should be a sparsely used function
int[] returnValue = new int[sheet.getNumRowBreaks()];
Iterator iterator = sheet.getRowBreaks();
int i = 0;
while (iterator.hasNext()) {
PageBreakRecord.Break breakItem = (PageBreakRecord.Break)iterator.next();
returnValue[i++] = (int)breakItem.main;
}
return returnValue;
}
/**
* Retrieves all the vertical page breaks
* @return
*/
public short[] getColumnBreaks(){
//we can probably cache this information, but this should be a sparsely used function
short[] returnValue = new short[sheet.getNumColumnBreaks()];
Iterator iterator = sheet.getColumnBreaks();
int i = 0;
while (iterator.hasNext()) {
PageBreakRecord.Break breakItem = (PageBreakRecord.Break)iterator.next();
returnValue[i++] = breakItem.main;
}
return returnValue;
}
/**
* Sets a page break at the indicated column
* @param column
*/
public void setColumnBreak(short column) {
validateColumn(column);
sheet.setColumnBreak(column, (short)0, (short)65535);
}
/**
* Determines if there is a page break at the indicated column
* @param column
* @return
*/
public boolean isColumnBroken(short column) {
return sheet.isColumnBroken(column);
}
/**
* Removes a page break at the indicated column
* @param column
*/
public void removeColumnBreak(short column) {
sheet.removeColumnBreak(column);
}
/**
* Runs a bounds check for row numbers
* @param row
*/
protected void validateRow(int row) {
if (row > 65535) throw new IllegalArgumentException("Maximum row number is 65535");
if (row < 0) throw new IllegalArgumentException("Minumum row number is 0");
}
/**
* Runs a bounds check for column numbers
* @param column
*/
protected void validateColumn(short column) {
if (column > 255) throw new IllegalArgumentException("Maximum column number is 255");
if (column < 0) throw new IllegalArgumentException("Minimum column number is 0");
}
} }

View File

@ -2,12 +2,14 @@ package org.apache.poi.hssf.model;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import java.util.List;
import junit.framework.TestCase; import junit.framework.TestCase;
import org.apache.poi.hssf.record.ColumnInfoRecord; import org.apache.poi.hssf.record.ColumnInfoRecord;
import org.apache.poi.hssf.record.MergeCellsRecord; import org.apache.poi.hssf.record.MergeCellsRecord;
import org.apache.poi.hssf.record.PageBreakRecord;
import org.apache.poi.hssf.record.RowRecord; import org.apache.poi.hssf.record.RowRecord;
import org.apache.poi.hssf.record.StringRecord; import org.apache.poi.hssf.record.StringRecord;
@ -173,6 +175,125 @@ public class SheetTest extends TestCase
} }
/**
* Make sure page break functionality works (in memory)
*
*/
public void testRowPageBreaks(){
short colFrom = 0;
short colTo = 255;
Sheet sheet = Sheet.createSheet();
sheet.setRowBreak(0, colFrom, colTo);
assertTrue("no row break at 0", sheet.isRowBroken(0));
assertEquals("1 row break available", 1, sheet.getNumRowBreaks());
sheet.setRowBreak(0, colFrom, colTo);
sheet.setRowBreak(0, colFrom, colTo);
assertTrue("no row break at 0", sheet.isRowBroken(0));
assertEquals("1 row break available", 1, sheet.getNumRowBreaks());
sheet.setRowBreak(10, colFrom, colTo);
sheet.setRowBreak(11, colFrom, colTo);
assertTrue("no row break at 10", sheet.isRowBroken(10));
assertTrue("no row break at 11", sheet.isRowBroken(11));
assertEquals("3 row break available", 3, sheet.getNumRowBreaks());
boolean is10 = false;
boolean is0 = false;
boolean is11 = false;
Iterator iterator = sheet.getRowBreaks();
while (iterator.hasNext()) {
PageBreakRecord.Break breakItem = (PageBreakRecord.Break)iterator.next();
int main = (int)breakItem.main;
if (main != 0 && main != 10 && main != 11) fail("Invalid page break");
if (main == 0) is0 = true;
if (main == 10) is10= true;
if (main == 11) is11 = true;
}
assertTrue("one of the breaks didnt make it", is0 && is10 && is11);
sheet.removeRowBreak(11);
assertFalse("row should be removed", sheet.isRowBroken(11));
sheet.removeRowBreak(0);
assertFalse("row should be removed", sheet.isRowBroken(0));
sheet.removeRowBreak(10);
assertFalse("row should be removed", sheet.isRowBroken(10));
assertEquals("no more breaks", 0, sheet.getNumRowBreaks());
}
/**
* Make sure column pag breaks works properly (in-memory)
*
*/
public void testColPageBreaks(){
short rowFrom = 0;
short rowTo = (short)65535;
Sheet sheet = Sheet.createSheet();
sheet.setColumnBreak((short)0, rowFrom, rowTo);
assertTrue("no col break at 0", sheet.isColumnBroken((short)0));
assertEquals("1 col break available", 1, sheet.getNumColumnBreaks());
sheet.setColumnBreak((short)0, rowFrom, rowTo);
assertTrue("no col break at 0", sheet.isColumnBroken((short)0));
assertEquals("1 col break available", 1, sheet.getNumColumnBreaks());
sheet.setColumnBreak((short)1, rowFrom, rowTo);
sheet.setColumnBreak((short)10, rowFrom, rowTo);
sheet.setColumnBreak((short)15, rowFrom, rowTo);
assertTrue("no col break at 1", sheet.isColumnBroken((short)1));
assertTrue("no col break at 10", sheet.isColumnBroken((short)10));
assertTrue("no col break at 15", sheet.isColumnBroken((short)15));
assertEquals("4 col break available", 4, sheet.getNumColumnBreaks());
boolean is10 = false;
boolean is0 = false;
boolean is1 = false;
boolean is15 = false;
Iterator iterator = sheet.getColumnBreaks();
while (iterator.hasNext()) {
PageBreakRecord.Break breakItem = (PageBreakRecord.Break)iterator.next();
int main = (int)breakItem.main;
if (main != 0 && main != 1 && main != 10 && main != 15) fail("Invalid page break");
if (main == 0) is0 = true;
if (main == 1) is1 = true;
if (main == 10) is10= true;
if (main == 15) is15 = true;
}
assertTrue("one of the breaks didnt make it", is0 && is1 && is10 && is15);
sheet.removeColumnBreak((short)15);
assertFalse("column break should not be there", sheet.isColumnBroken((short)15));
sheet.removeColumnBreak((short)0);
assertFalse("column break should not be there", sheet.isColumnBroken((short)0));
sheet.removeColumnBreak((short)1);
assertFalse("column break should not be there", sheet.isColumnBroken((short)1));
sheet.removeColumnBreak((short)10);
assertFalse("column break should not be there", sheet.isColumnBroken((short)10));
assertEquals("no more breaks", 0, sheet.getNumColumnBreaks());
}
} }

View File

@ -82,4 +82,23 @@ public class TestCloneSheet extends TestCase {
catch(Exception e){e.printStackTrace();fail(e.getMessage());} catch(Exception e){e.printStackTrace();fail(e.getMessage());}
} }
/**
* Ensures that pagebreak cloning works properly
*
*/
public void testPageBreakClones() {
HSSFWorkbook b = new HSSFWorkbook();
HSSFSheet s = b.createSheet("Test");
s.setRowBreak(3);
s.setColumnBreak((short)6);
HSSFSheet clone = b.cloneSheet(0);
assertTrue("Row 3 not broken", clone.isRowBroken(3));
assertTrue("Column 6 not broken", clone.isColumnBroken((short)6));
s.removeRowBreak(3);
assertTrue("Row 3 still should be broken", clone.isRowBroken(3));
}
} }

View File

@ -1,7 +1,7 @@
/* ==================================================================== /* ====================================================================
* The Apache Software License, Version 1.1 * The Apache Software License, Version 1.1
* *
* Copyright (c) 2003 The Apache Software Foundation. All rights * Copyright (c) 2004 The Apache Software Foundation. All rights
* reserved. * reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -380,6 +380,55 @@ public class TestHSSFSheet
assertEquals(sheet.isDisplayGridlines(), false); assertEquals(sheet.isDisplayGridlines(), false);
assertEquals(sheet.isDisplayRowColHeadings(), false); assertEquals(sheet.isDisplayRowColHeadings(), false);
assertEquals(sheet.isDisplayFormulas(), true); assertEquals(sheet.isDisplayFormulas(), true);
}
/**
* Make sure the excel file loads work
*
*/
public void testPageBreakFiles() throws Exception{
FileInputStream fis = null;
HSSFWorkbook wb = null;
String filename = System.getProperty("HSSF.testdata.path");
filename = filename + "/SimpleWithPageBreaks.xls";
fis = new FileInputStream(filename);
wb = new HSSFWorkbook(fis);
fis.close();
HSSFSheet sheet = wb.getSheetAt(0);
assertNotNull(sheet);
assertEquals("1 row page break", 1, sheet.getRowBreaks().length);
assertEquals("1 column page break", 1, sheet.getColumnBreaks().length);
assertTrue("No row page break", sheet.isRowBroken(22));
assertTrue("No column page break", sheet.isColumnBroken((short)4));
sheet.setRowBreak(10);
sheet.setColumnBreak((short)13);
assertEquals("row breaks number", 2, sheet.getRowBreaks().length);
assertEquals("column breaks number", 2, sheet.getColumnBreaks().length);
File tempFile = File.createTempFile("display", "testPagebreaks.xls");
FileOutputStream stream = new FileOutputStream(tempFile);
wb.write(stream);
stream.close();
wb = new HSSFWorkbook(new FileInputStream(tempFile));
sheet = wb.getSheetAt(0);
assertTrue("No row page break", sheet.isRowBroken(22));
assertTrue("No column page break", sheet.isColumnBroken((short)4));
assertEquals("row breaks number", 2, sheet.getRowBreaks().length);
assertEquals("column breaks number", 2, sheet.getColumnBreaks().length);
} }
public static void main(java.lang.String[] args) { public static void main(java.lang.String[] args) {

View File

@ -188,5 +188,21 @@ public class TestSheetShiftRows extends TestCase {
s.createRow(3).createCell((short)0).setCellValue("TEST2"); s.createRow(3).createCell((short)0).setCellValue("TEST2");
s.shiftRows(0,4,1); s.shiftRows(0,4,1);
} }
/**
* When shifting rows, the page breaks should go with it
*
*/
public void testShiftRowBreaks(){
HSSFWorkbook b = new HSSFWorkbook();
HSSFSheet s = b.createSheet();
HSSFRow row = s.createRow(4);
row.createCell((short)0).setCellValue("test");
s.setRowBreak(4);
s.shiftRows(4, 4, 2);
assertTrue("Row number 6 should have a pagebreak", s.isRowBroken(6));
}
} }