diff --git a/src/java/org/apache/poi/hssf/record/RecordInputStream.java b/src/java/org/apache/poi/hssf/record/RecordInputStream.java
index 7bc3671fee..a17fc74080 100755
--- a/src/java/org/apache/poi/hssf/record/RecordInputStream.java
+++ b/src/java/org/apache/poi/hssf/record/RecordInputStream.java
@@ -95,7 +95,7 @@ public class RecordInputStream extends InputStream
public void nextRecord() throws RecordFormatException {
if ((currentLength != -1) && (currentLength != recordOffset)) {
- System.out.println("WARN. Unread "+remaining()+" bytes of record "+Integer.toHexString(currentSid));
+ System.out.println("WARN. Unread "+remaining()+" bytes of record 0x"+Integer.toHexString(currentSid));
}
currentSid = nextSid;
pos += LittleEndian.SHORT_SIZE;
@@ -111,7 +111,7 @@ public class RecordInputStream extends InputStream
//Read the Sid of the next record
nextSid = LittleEndian.readShort(in);
} catch (IOException ex) {
- throw new RecordFormatException("Error reading bytes");
+ throw new RecordFormatException("Error reading bytes", ex);
}
}
@@ -226,7 +226,7 @@ public class RecordInputStream extends InputStream
* length)
*/
public String readUnicodeLEString(int length) {
- if ((length < 0) || ((remaining() / 2) < length)) {
+ if ((length < 0) || (((remaining() / 2) < length) && !isContinueNext())) {
throw new IllegalArgumentException("Illegal length");
}
@@ -239,7 +239,7 @@ public class RecordInputStream extends InputStream
}
return buf.toString();
}
-
+
public String readCompressedUnicode(int length) {
if ((length < 0) || (remaining() < length)) {
throw new IllegalArgumentException("Illegal length");
@@ -258,10 +258,20 @@ public class RecordInputStream extends InputStream
return buf.toString();
}
+ /** Returns an excel style unicode string from the bytes reminaing in the record.
+ * Note: Unicode strings differ from normal strings due to the addition of
+ * formatting information.
+ *
+ * @return The unicode string representation of the remaining bytes.
+ */
public UnicodeString readUnicodeString() {
return new UnicodeString(this);
}
+ /** Returns the remaining bytes for the current record.
+ *
+ * @return The remaining bytes of the current record.
+ */
public byte[] readRemainder() {
int size = remaining();
byte[] result = new byte[size];
@@ -293,10 +303,18 @@ public class RecordInputStream extends InputStream
return out.toByteArray();
}
+ /** The remaining number of bytes in the current record.
+ *
+ * @return The number of bytes remaining in the current record
+ */
public int remaining() {
return (currentLength - recordOffset);
}
+ /** Returns true iif a Continue record is next in the excel stream
+ *
+ * @return True when a ContinueRecord is next.
+ */
public boolean isContinueNext() {
return (nextSid == ContinueRecord.sid);
}
diff --git a/src/java/org/apache/poi/hssf/record/aggregates/ValueRecordsAggregate.java b/src/java/org/apache/poi/hssf/record/aggregates/ValueRecordsAggregate.java
index 46d50ceab5..05567720cf 100644
--- a/src/java/org/apache/poi/hssf/record/aggregates/ValueRecordsAggregate.java
+++ b/src/java/org/apache/poi/hssf/record/aggregates/ValueRecordsAggregate.java
@@ -154,28 +154,14 @@ public class ValueRecordsAggregate
if (shrd.isFormulaInShared(formula)) {
shrd.convertSharedFormulaRecord(formula);
found = true;
+ break;
}
}
- if (!found)
- throw new RecordFormatException("Could not find appropriate shared formula");
-/*
-
- if ((lastSharedFormula != null) && (lastSharedFormula.isFormulaInShared(formula))) {
- //Convert this Formula Record from a shared formula to a real formula
- lastSharedFormula.convertSharedFormulaRecord(formula);
- } else {
- if (nextRecord instanceof SharedFormulaRecord) {
- //Handle the SharedFormulaRecord and move on.
- k++;
- lastSharedFormula = (SharedFormulaRecord) nextRecord;
-
- //Convert this Formula Record from a shared formula to a real formula
- lastSharedFormula.convertSharedFormulaRecord(formula);
- }
- else
- throw new RuntimeException(
- "Shared formula bit set but next record is not a Shared Formula??");
- }*/
+ if (!found) {
+ //Sometimes the shared formula flag "seems" to be errornously set,
+ //cant really do much about that.
+ //throw new RecordFormatException("Could not find appropriate shared formula");
+ }
}
lastFormulaAggregate = new FormulaRecordAggregate((FormulaRecord)rec, null);
diff --git a/src/scratchpad/testcases/org/apache/poi/hssf/record/formula/eval/GenericFormulaTestCase.java b/src/scratchpad/testcases/org/apache/poi/hssf/record/formula/eval/GenericFormulaTestCase.java
index ded15ffeba..11d947ea87 100644
--- a/src/scratchpad/testcases/org/apache/poi/hssf/record/formula/eval/GenericFormulaTestCase.java
+++ b/src/scratchpad/testcases/org/apache/poi/hssf/record/formula/eval/GenericFormulaTestCase.java
@@ -23,18 +23,10 @@ import org.apache.poi.hssf.util.CellReference;
*/
public class GenericFormulaTestCase extends TestCase {
- protected static final String FILENAME = System.getProperty("HSSF.testdata.path")+ "/FormulaEvalTestData.xls";
+ protected final String FILENAME = System.getProperty("HSSF.testdata.path")+ "/FormulaEvalTestData.xls";
+
+ protected HSSFWorkbook workbook = null;
- protected static HSSFWorkbook workbook = null;
-
- static {
- try {
- FileInputStream fin = new FileInputStream( FILENAME );
- workbook = new HSSFWorkbook( fin );
- fin.close();
- }
- catch (Exception e) {e.printStackTrace();}
- }
protected CellReference beginCell;
protected int getBeginRow() {
return beginCell.getRow();
@@ -98,11 +90,14 @@ public class GenericFormulaTestCase extends TestCase {
}
public GenericFormulaTestCase(String beginCell) {
- super("genericTest");
+ super("genericTest");
this.beginCell = new CellReference(beginCell);
}
- public void setUp() {
+ public void setUp() throws Exception {
+ FileInputStream fin = new FileInputStream( FILENAME );
+ workbook = new HSSFWorkbook( fin );
+ fin.close();
}
public void genericTest() throws Exception {