diff options
author | Daniel Rentz [dr] <daniel.rentz@oracle.com> | 2010-12-16 19:00:18 +0100 |
---|---|---|
committer | Daniel Rentz [dr] <daniel.rentz@oracle.com> | 2010-12-16 19:00:18 +0100 |
commit | 2b7da24f60f3cf7feafa17562c47760b8f1f44d0 (patch) | |
tree | db4233d7448a2a4635285b38a16d1fe8fdbf2d86 /oox/source/xls/workbookfragment.cxx | |
parent | b60db466ef41f4414ef80563dc3b97428336acf5 (diff) |
dr78: #i109800# SHEET record may not point to BOF but to any record in the sheet substream
Diffstat (limited to 'oox/source/xls/workbookfragment.cxx')
-rw-r--r-- | oox/source/xls/workbookfragment.cxx | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/oox/source/xls/workbookfragment.cxx b/oox/source/xls/workbookfragment.cxx index 6e43a32495be..fcc9f4972b7d 100644 --- a/oox/source/xls/workbookfragment.cxx +++ b/oox/source/xls/workbookfragment.cxx @@ -379,10 +379,25 @@ bool BiffWorkbookFragment::importFragment() bool bNextSheet = bRet; for( sal_Int32 nWorksheet = 0, nWorksheetCount = rWorksheets.getWorksheetCount(); bNextSheet && (nWorksheet < nWorksheetCount); ++nWorksheet ) { - // try to start a new sheet fragment + // calculate progress size for the sheet double fSegmentLength = getProgressBar().getFreeLength() / (nWorksheetCount - nWorksheet); ISegmentProgressBarRef xSheetProgress = getProgressBar().createSegment( fSegmentLength ); - BiffFragmentType eSheetFragment = startFragment( getBiff(), rWorksheets.getBiffRecordHandle( nWorksheet ) ); + /* Try to start a new sheet fragment. The SHEET records point to the + first record of the sheet fragment which is usually a BOF record. */ + BiffFragmentType eSheetFragment = BIFF_FRAGMENT_UNKNOWN; + sal_Int64 nRecHandle = rWorksheets.getBiffRecordHandle( nWorksheet ); + if( mrStrm.startRecordByHandle( nRecHandle ) ) + { + /* #i109800# Stream may point to any record of the sheet fragment. + Check the record identifier before calling startFragment(). */ + bool bIsBofRec = isBofRecord(); + /* Rewind the record. If it is the BOF record, it will be read in + startFragment(). In every case, stream will point before the + first available non-BOF record. */ + mrStrm.rewindRecord(); + // if the BOF record is missing, a regular worksheet will be assumed + eSheetFragment = bIsBofRec ? startFragment( getBiff() ) : BIFF_FRAGMENT_WORKSHEET; + } sal_Int16 nCalcSheet = rWorksheets.getCalcSheetIndex( nWorksheet ); bNextSheet = importSheetFragment( *xSheetProgress, eSheetFragment, nCalcSheet ); } |