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:
parent
34e230f63e
commit
bf326c25a0
@ -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 );
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
304
src/java/org/apache/poi/hssf/record/PageBreakRecord.java
Normal file
304
src/java/org/apache/poi/hssf/record/PageBreakRecord.java
Normal 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
107
src/java/org/apache/poi/hssf/record/VerticalPageBreakRecord.java
Normal file
107
src/java/org/apache/poi/hssf/record/VerticalPageBreakRecord.java
Normal 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
BIN
src/testcases/org/apache/poi/hssf/data/SimpleWithPageBreaks.xls
Normal file
BIN
src/testcases/org/apache/poi/hssf/data/SimpleWithPageBreaks.xls
Normal file
Binary file not shown.
@ -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());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
@ -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));
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user