summaryrefslogtreecommitdiff
path: root/oox/source/xls/workbookfragment.cxx
diff options
context:
space:
mode:
authorDaniel Rentz [dr] <daniel.rentz@oracle.com>2010-12-16 19:00:18 +0100
committerDaniel Rentz [dr] <daniel.rentz@oracle.com>2010-12-16 19:00:18 +0100
commit2b7da24f60f3cf7feafa17562c47760b8f1f44d0 (patch)
treedb4233d7448a2a4635285b38a16d1fe8fdbf2d86 /oox/source/xls/workbookfragment.cxx
parentb60db466ef41f4414ef80563dc3b97428336acf5 (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.cxx19
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 );
}