You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ni...@apache.org on 2009/11/03 23:45:56 UTC
svn commit: r832584 - in /poi/trunk: src/documentation/content/xdocs/
src/java/org/apache/poi/hssf/eventusermodel/
src/java/org/apache/poi/hssf/record/
src/testcases/org/apache/poi/hssf/eventusermodel/ test-data/spreadsheet/
Author: nick
Date: Tue Nov 3 22:45:39 2009
New Revision: 832584
URL: http://svn.apache.org/viewvc?rev=832584&view=rev
Log:
Hopefully fix #45672 properly - improve handling by MissingRecordAwareHSSFListener of records that cover multiple cells (MulBlankRecord and MulRKRecord)
Added:
poi/trunk/test-data/spreadsheet/45672.xls (with props)
Modified:
poi/trunk/src/documentation/content/xdocs/status.xml
poi/trunk/src/java/org/apache/poi/hssf/eventusermodel/MissingRecordAwareHSSFListener.java
poi/trunk/src/java/org/apache/poi/hssf/record/MulBlankRecord.java
poi/trunk/src/java/org/apache/poi/hssf/record/RecordFactory.java
poi/trunk/src/testcases/org/apache/poi/hssf/eventusermodel/TestMissingRecordAwareHSSFListener.java
Modified: poi/trunk/src/documentation/content/xdocs/status.xml
URL: http://svn.apache.org/viewvc/poi/trunk/src/documentation/content/xdocs/status.xml?rev=832584&r1=832583&r2=832584&view=diff
==============================================================================
--- poi/trunk/src/documentation/content/xdocs/status.xml (original)
+++ poi/trunk/src/documentation/content/xdocs/status.xml Tue Nov 3 22:45:39 2009
@@ -34,6 +34,7 @@
<changes>
<release version="3.6-beta1" date="2009-??-??">
+ <action dev="POI-DEVELOPERS" type="fix">45672 - improve handling by MissingRecordAwareHSSFListener of records that cover multiple cells (MulBlankRecord and MulRKRecord)</action>
<action dev="POI-DEVELOPERS" type="fix">48096 - relaxed validation check in RecalcIdRecord</action>
<action dev="POI-DEVELOPERS" type="fix">48085 - improved error checking in BlockAllocationTableReader to trap unreasonable field values</action>
<action dev="POI-DEVELOPERS" type="fix">47924 - fixed logic for matching cells and comments in HSSFCell.getCellComment()</action>
Modified: poi/trunk/src/java/org/apache/poi/hssf/eventusermodel/MissingRecordAwareHSSFListener.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/eventusermodel/MissingRecordAwareHSSFListener.java?rev=832584&r1=832583&r2=832584&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/eventusermodel/MissingRecordAwareHSSFListener.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/eventusermodel/MissingRecordAwareHSSFListener.java Tue Nov 3 22:45:39 2009
@@ -21,9 +21,14 @@
import org.apache.poi.hssf.eventusermodel.dummyrecord.MissingCellDummyRecord;
import org.apache.poi.hssf.eventusermodel.dummyrecord.MissingRowDummyRecord;
import org.apache.poi.hssf.record.BOFRecord;
+import org.apache.poi.hssf.record.BlankRecord;
import org.apache.poi.hssf.record.CellValueRecordInterface;
+import org.apache.poi.hssf.record.MulBlankRecord;
+import org.apache.poi.hssf.record.MulRKRecord;
import org.apache.poi.hssf.record.NoteRecord;
+import org.apache.poi.hssf.record.NumberRecord;
import org.apache.poi.hssf.record.Record;
+import org.apache.poi.hssf.record.RecordFactory;
import org.apache.poi.hssf.record.RowRecord;
import org.apache.poi.hssf.record.SharedFormulaRecord;
@@ -62,7 +67,7 @@
public void processRecord(Record record) {
int thisRow;
int thisColumn;
-
+ CellValueRecordInterface[] expandedRecords = null;
if (record instanceof CellValueRecordInterface) {
CellValueRecordInterface valueRec = (CellValueRecordInterface) record;
@@ -105,6 +110,19 @@
// - so don't fire off the LastCellOfRowDummyRecord yet
childListener.processRecord(record);
return;
+ case MulBlankRecord.sid:
+ // These appear in the middle of the cell records, to
+ // specify that the next bunch are empty but styled
+ // Expand this out into multiple blank cells
+ MulBlankRecord mbr = (MulBlankRecord)record;
+ expandedRecords = RecordFactory.convertBlankRecords(mbr);
+ break;
+ case MulRKRecord.sid:
+ // This is multiple consecutive number cells in one record
+ // Exand this out into multiple regular number cells
+ MulRKRecord mrk = (MulRKRecord)record;
+ expandedRecords = RecordFactory.convertRKRecords(mrk);
+ break;
case NoteRecord.sid:
NoteRecord nrec = (NoteRecord) record;
thisRow = nrec.getRow();
@@ -112,6 +130,13 @@
break;
}
}
+
+ // First part of expanded record handling
+ if(expandedRecords != null && expandedRecords.length > 0) {
+ thisRow = expandedRecords[0].getRow();
+ thisColumn = expandedRecords[0].getColumn();
+ }
+
// If we're on cells, and this cell isn't in the same
// row as the last one, then fire the
// dummy end-of-row records
@@ -148,13 +173,26 @@
}
}
+ // Next part of expanded record handling
+ if(expandedRecords != null && expandedRecords.length > 0) {
+ thisColumn = expandedRecords[expandedRecords.length-1].getColumn();
+ }
+
+
// Update cell and row counts as needed
if(thisColumn != -1) {
lastCellColumn = thisColumn;
lastCellRow = thisRow;
}
- childListener.processRecord(record);
+ // Pass along the record(s)
+ if(expandedRecords != null && expandedRecords.length > 0) {
+ for(CellValueRecordInterface r : expandedRecords) {
+ childListener.processRecord((Record)r);
+ }
+ } else {
+ childListener.processRecord(record);
+ }
}
private void resetCounts() {
Modified: poi/trunk/src/java/org/apache/poi/hssf/record/MulBlankRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/MulBlankRecord.java?rev=832584&r1=832583&r2=832584&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/MulBlankRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/MulBlankRecord.java Tue Nov 3 22:45:39 2009
@@ -56,6 +56,13 @@
public int getFirstColumn() {
return _firstCol;
}
+
+ /**
+ * @return ending column (last cell this holds in the row). Zero based
+ */
+ public int getLastColumn() {
+ return _lastCol;
+ }
/**
* get the number of columns this contains (last-first +1)
Modified: poi/trunk/src/java/org/apache/poi/hssf/record/RecordFactory.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/RecordFactory.java?rev=832584&r1=832583&r2=832584&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/RecordFactory.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/RecordFactory.java Tue Nov 3 22:45:39 2009
@@ -281,7 +281,6 @@
* Converts a {@link MulRKRecord} into an equivalent array of {@link NumberRecord}s
*/
public static NumberRecord[] convertRKRecords(MulRKRecord mrk) {
-
NumberRecord[] mulRecs = new NumberRecord[mrk.getNumColumns()];
for (int k = 0; k < mrk.getNumColumns(); k++) {
NumberRecord nr = new NumberRecord();
@@ -296,6 +295,22 @@
}
/**
+ * Converts a {@link MulBlankRecord} into an equivalent array of {@link BlankRecord}s
+ */
+ public static BlankRecord[] convertBlankRecords(MulBlankRecord mbk) {
+ BlankRecord[] mulRecs = new BlankRecord[mbk.getNumColumns()];
+ for (int k = 0; k < mbk.getNumColumns(); k++) {
+ BlankRecord br = new BlankRecord();
+
+ br.setColumn((short) (k + mbk.getFirstColumn()));
+ br.setRow(mbk.getRow());
+ br.setXFIndex(mbk.getXFAt(k));
+ mulRecs[k] = br;
+ }
+ return mulRecs;
+ }
+
+ /**
* @return an array of all the SIDS for all known records
*/
public static short[] getAllKnownRecordSIDs() {
Modified: poi/trunk/src/testcases/org/apache/poi/hssf/eventusermodel/TestMissingRecordAwareHSSFListener.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/eventusermodel/TestMissingRecordAwareHSSFListener.java?rev=832584&r1=832583&r2=832584&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/eventusermodel/TestMissingRecordAwareHSSFListener.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/eventusermodel/TestMissingRecordAwareHSSFListener.java Tue Nov 3 22:45:39 2009
@@ -29,7 +29,9 @@
import org.apache.poi.hssf.eventusermodel.dummyrecord.MissingCellDummyRecord;
import org.apache.poi.hssf.eventusermodel.dummyrecord.MissingRowDummyRecord;
import org.apache.poi.hssf.record.BOFRecord;
+import org.apache.poi.hssf.record.BlankRecord;
import org.apache.poi.hssf.record.LabelSSTRecord;
+import org.apache.poi.hssf.record.MulBlankRecord;
import org.apache.poi.hssf.record.Record;
import org.apache.poi.hssf.record.RowRecord;
import org.apache.poi.hssf.record.SharedFormulaRecord;
@@ -422,4 +424,41 @@
assertEquals(1, eorCount);
assertEquals(1, sfrCount);
}
+
+ /**
+ * MulBlank records hold multiple blank cells. Check we
+ * can handle them correctly.
+ */
+ public void testMulBlankHandling() {
+ readRecords("45672.xls");
+
+ // Check that we don't have any MulBlankRecords, but do
+ // have lots of BlankRecords
+ Record[] rr = r;
+ int eorCount=0;
+ int mbrCount=0;
+ int brCount=0;
+ for (int i = 0; i < rr.length; i++) {
+ Record record = rr[i];
+ if (record instanceof MulBlankRecord) {
+ mbrCount++;
+ }
+ if (record instanceof BlankRecord) {
+ brCount++;
+ }
+ if (record instanceof LastCellOfRowDummyRecord) {
+ eorCount++;
+ }
+ }
+ if (mbrCount > 0) {
+ throw new AssertionFailedError("Identified bug 45672");
+ }
+ if (brCount < 20) {
+ throw new AssertionFailedError("Identified bug 45672");
+ }
+ if (eorCount != 2) {
+ throw new AssertionFailedError("Identified bug 45672");
+ }
+ assertEquals(2, eorCount);
+ }
}
Added: poi/trunk/test-data/spreadsheet/45672.xls
URL: http://svn.apache.org/viewvc/poi/trunk/test-data/spreadsheet/45672.xls?rev=832584&view=auto
==============================================================================
Binary file - no diff available.
Propchange: poi/trunk/test-data/spreadsheet/45672.xls
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org