|
|
@@ -109,8 +109,10 @@ public class Sheet implements Model |
|
|
|
protected FooterRecord footer = null; |
|
|
|
protected PrintGridlinesRecord printGridlines = null; |
|
|
|
protected MergeCellsRecord merged = null; |
|
|
|
protected ArrayList mergedRecords = new ArrayList(); |
|
|
|
protected ArrayList mergedLocs = new ArrayList(); |
|
|
|
protected int numMergedRegions = 0; |
|
|
|
protected SelectionRecord selection = null; |
|
|
|
protected int mergedloc = 0; |
|
|
|
private static POILogger log = POILogFactory.getLogger(Sheet.class); |
|
|
|
private ArrayList columnSizes = null; // holds column info |
|
|
|
protected ValueRecordsAggregate cells = null; |
|
|
@@ -191,8 +193,10 @@ public class Sheet implements Model |
|
|
|
} |
|
|
|
else if (rec.getSid() == MergeCellsRecord.sid) |
|
|
|
{ |
|
|
|
retval.merged = ( MergeCellsRecord ) rec; |
|
|
|
retval.mergedloc = k - offset; |
|
|
|
retval.mergedRecords.add(rec); |
|
|
|
retval.merged = ( MergeCellsRecord ) rec; |
|
|
|
retval.mergedLocs.add(new Integer(k - offset)); |
|
|
|
retval.numMergedRegions += retval.merged.getNumAreas(); |
|
|
|
} |
|
|
|
else if (rec.getSid() == ColumnInfoRecord.sid) |
|
|
|
{ |
|
|
@@ -421,36 +425,95 @@ public class Sheet implements Model |
|
|
|
public int addMergedRegion(int rowFrom, short colFrom, int rowTo, |
|
|
|
short colTo) |
|
|
|
{ |
|
|
|
if (merged == null) |
|
|
|
if (merged == null || merged.getNumAreas() == 1027) |
|
|
|
{ |
|
|
|
merged = ( MergeCellsRecord ) createMergedCells(); |
|
|
|
mergedloc = records.size() - 1; |
|
|
|
merged = ( MergeCellsRecord ) createMergedCells(); |
|
|
|
mergedRecords.add(merged); |
|
|
|
mergedLocs.add(new Integer(records.size() - 1)); |
|
|
|
records.add(records.size() - 1, merged); |
|
|
|
} |
|
|
|
return merged.addArea(rowFrom, colFrom, rowTo, colTo); |
|
|
|
merged.addArea(rowFrom, colFrom, rowTo, colTo); |
|
|
|
return numMergedRegions++; |
|
|
|
} |
|
|
|
|
|
|
|
public void removeMergedRegion(int index) |
|
|
|
{ |
|
|
|
merged.removeAreaAt(index); |
|
|
|
if (merged.getNumAreas() == 0) |
|
|
|
//safety checks |
|
|
|
if (index >= numMergedRegions || mergedRecords.size() == 0) |
|
|
|
return; |
|
|
|
|
|
|
|
int pos = 0; |
|
|
|
int startNumRegions = 0; |
|
|
|
|
|
|
|
//optimisation for current record |
|
|
|
if (numMergedRegions - index < merged.getNumAreas()) |
|
|
|
{ |
|
|
|
merged = null; |
|
|
|
records.remove(mergedloc); |
|
|
|
mergedloc = 0; |
|
|
|
pos = mergedRecords.size() - 1; |
|
|
|
startNumRegions = numMergedRegions - merged.getNumAreas(); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
for (int n = 0; n < mergedRecords.size(); n++) |
|
|
|
{ |
|
|
|
MergeCellsRecord record = (MergeCellsRecord) mergedRecords.get(n); |
|
|
|
if (startNumRegions + record.getNumAreas() > index) |
|
|
|
{ |
|
|
|
pos = n; |
|
|
|
break; |
|
|
|
} |
|
|
|
startNumRegions += record.getNumAreas(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
MergeCellsRecord rec = (MergeCellsRecord) mergedRecords.get(pos); |
|
|
|
rec.removeAreaAt(index - startNumRegions); |
|
|
|
numMergedRegions--; |
|
|
|
if (rec.getNumAreas() == 0) |
|
|
|
{ |
|
|
|
mergedRecords.remove(pos); |
|
|
|
if (merged == rec) |
|
|
|
merged = (MergeCellsRecord) mergedRecords.get(mergedRecords.size() - 1); |
|
|
|
int removePos = ((Integer) mergedLocs.get(pos)).intValue(); |
|
|
|
records.remove(removePos); |
|
|
|
mergedLocs.remove(pos); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public MergeCellsRecord.MergedRegion getMergedRegionAt(int index) |
|
|
|
{ |
|
|
|
return merged.getAreaAt(index); |
|
|
|
//safety checks |
|
|
|
if (index < numMergedRegions || mergedRecords.size() == 0) |
|
|
|
return null; |
|
|
|
|
|
|
|
int pos = 0; |
|
|
|
int startNumRegions = 0; |
|
|
|
|
|
|
|
//optimisation for current record |
|
|
|
if (numMergedRegions - index < merged.getNumAreas()) |
|
|
|
{ |
|
|
|
pos = mergedRecords.size() - 1; |
|
|
|
startNumRegions = numMergedRegions - merged.getNumAreas(); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
for (int n = 0; n < mergedRecords.size(); n++) |
|
|
|
{ |
|
|
|
MergeCellsRecord record = (MergeCellsRecord) mergedRecords.get(n); |
|
|
|
if (startNumRegions + record.getNumAreas() > index) |
|
|
|
{ |
|
|
|
pos = n; |
|
|
|
break; |
|
|
|
} |
|
|
|
startNumRegions += record.getNumAreas(); |
|
|
|
} |
|
|
|
} |
|
|
|
return ((MergeCellsRecord) mergedRecords.get(pos)).getAreaAt(index - startNumRegions); |
|
|
|
} |
|
|
|
|
|
|
|
public int getNumMergedRegions() |
|
|
|
{ |
|
|
|
return merged!=null ? merged.getNumAreas() : 0; |
|
|
|
} |
|
|
|
|
|
|
|
{ |
|
|
|
return numMergedRegions; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* This is basically a kludge to deal with the now obsolete Label records. If |