<!-- Don't forget to update status.xml too! -->
<release version="3.5-beta5" date="2008-??-??">
+ <action dev="POI-DEVELOPERS" type="fix">44914 - Fixed warning message "WARN. Unread n bytes of record 0xNN"</action>
<action dev="POI-DEVELOPERS" type="add">46156 - Improved number to text conversion to be closer to that of Excel</action>
<action dev="POI-DEVELOPERS" type="fix">46312 - Fixed ValueRecordsAggregate to handle removal of new empty row</action>
<action dev="POI-DEVELOPERS" type="add">46269 - Improved error message when attempting to read BIFF2 file</action>
<!-- Don't forget to update changes.xml too! -->
<changes>
<release version="3.5-beta5" date="2008-??-??">
+ <action dev="POI-DEVELOPERS" type="fix">44914 - Fixed warning message "WARN. Unread n bytes of record 0xNN"</action>
<action dev="POI-DEVELOPERS" type="add">46156 - Improved number to text conversion to be closer to that of Excel</action>
<action dev="POI-DEVELOPERS" type="fix">46312 - Fixed ValueRecordsAggregate to handle removal of new empty row</action>
<action dev="POI-DEVELOPERS" type="add">46269 - Improved error message when attempting to read BIFF2 file</action>
import java.util.List;
import org.apache.poi.hssf.record.*;
+import org.apache.poi.hssf.record.RecordInputStream.LeftoverDataException;
import org.apache.poi.hssf.record.chart.*;
import org.apache.poi.hssf.record.pivottable.*;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
List<Record> temp = new ArrayList<Record>();
RecordInputStream recStream = new RecordInputStream(is);
- while (recStream.hasNextRecord()) {
+ while (true) {
+ boolean hasNext;
+ try {
+ hasNext = recStream.hasNextRecord();
+ } catch (LeftoverDataException e) {
+ e.printStackTrace();
+ System.err.println("Discarding " + recStream.remaining() + " bytes and continuing");
+ recStream.readRemainder();
+ hasNext = recStream.hasNextRecord();
+ }
+ if (!hasNext) {
+ break;
+ }
recStream.nextRecord();
if (recStream.getSid() == 0) {
continue;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
+import org.apache.poi.hssf.dev.BiffViewer;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.LittleEndianInput;
import org.apache.poi.util.LittleEndianInputStream;
*/
private static final int DATA_LEN_NEEDS_TO_BE_READ = -1;
private static final byte[] EMPTY_BYTE_ARRAY = { };
+
+ /**
+ * For use in {@link BiffViewer} which may construct {@link Record}s that don't completely
+ * read all available data. This exception should never be thrown otherwise.
+ */
+ public static final class LeftoverDataException extends RuntimeException {
+ public LeftoverDataException(int sid, int remainingByteCount) {
+ super("Initialisation of record 0x" + Integer.toHexString(sid).toUpperCase()
+ + " left " + remainingByteCount + " bytes remaining still to be read.");
+ }
+ }
/** {@link LittleEndianInput} facet of the wrapped {@link InputStream} */
private final LittleEndianInput _le;
}
/**
- * Note - this method is expected to be called only when completed reading the current BIFF record.
- * Calling this before reaching the end of the current record will cause all remaining data to be
- * discarded
+ * Note - this method is expected to be called only when completed reading the current BIFF
+ * record.
+ * @throws LeftoverDataException if this method is called before reaching the end of the
+ * current record.
*/
- public boolean hasNextRecord() {
+ public boolean hasNextRecord() throws LeftoverDataException {
if (_currentDataLength != -1 && _currentDataLength != _currentDataOffset) {
- System.out.println("WARN. Unread "+remaining()+" bytes of record 0x"+Integer.toHexString(_currentSid));
- // discard unread data
- while (_currentDataOffset < _currentDataLength) {
- readByte();
- }
+ throw new LeftoverDataException(_currentSid, remaining());
}
if (_currentDataLength != DATA_LEN_NEEDS_TO_BE_READ) {
_nextSid = readNextSid();