| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_sc.hxx" |
| |
| //------------------------------------------------------------------------ |
| |
| #include <stdlib.h> |
| #include <stdio.h> |
| |
| #include "document.hxx" |
| #include "scerrors.hxx" |
| #include "fprogressbar.hxx" |
| #include "xltracer.hxx" |
| #include "xltable.hxx" |
| #include "xihelper.hxx" |
| #include "xipage.hxx" |
| #include "xiview.hxx" |
| #include "xilink.hxx" |
| #include "xiname.hxx" |
| #include "xicontent.hxx" |
| #include "xiescher.hxx" |
| #include "xipivot.hxx" |
| #include "XclImpChangeTrack.hxx" |
| |
| #include "root.hxx" |
| #include "imp_op.hxx" |
| #include "excimp8.hxx" |
| |
| FltError ImportExcel::Read( void ) |
| { |
| XclImpPageSettings& rPageSett = GetPageSettings(); |
| XclImpTabViewSettings& rTabViewSett = GetTabViewSettings(); |
| XclImpPalette& rPal = GetPalette(); |
| XclImpFontBuffer& rFontBfr = GetFontBuffer(); |
| XclImpNumFmtBuffer& rNumFmtBfr = GetNumFmtBuffer(); |
| XclImpXFBuffer& rXFBfr = GetXFBuffer(); |
| XclImpNameManager& rNameMgr = GetNameManager(); |
| XclImpObjectManager& rObjMgr = GetObjectManager(); |
| (void)rObjMgr; |
| // call to GetCurrSheetDrawing() cannot be cached (changes in new sheets) |
| |
| enum Zustand { |
| Z_BiffNull, // Nicht in gueltigem Biff-Format |
| Z_Biff2, // Biff2: nur eine Tabelle |
| |
| Z_Biff3, // Biff3: nur eine Tabelle |
| |
| Z_Biff4, // Biff4: nur eine Tabelle |
| Z_Biff4W, // Biff4 Workbook: Globals |
| Z_Biff4T, // Biff4 Workbook: eine Tabelle selbst |
| Z_Biff4E, // Biff4 Workbook: zwischen den Tabellen |
| |
| Z_Biff5WPre,// Biff5: Prefetch Workbook |
| Z_Biff5W, // Biff5: Globals |
| Z_Biff5TPre,// Biff5: Prefetch fuer Shrfmla/Array Formula |
| Z_Biff5T, // Biff5: eine Tabelle selbst |
| Z_Biff5E, // Biff5: zwischen den Tabellen |
| Z_Biffn0, // Alle Biffs: Tabelle bis naechstesss EOF ueberlesen |
| Z_Ende }; |
| |
| Zustand eAkt = Z_BiffNull, ePrev = Z_BiffNull; |
| |
| FltError eLastErr = eERR_OK; |
| sal_uInt16 nOpcode; |
| sal_uInt16 nBofLevel = 0; |
| |
| DBG_ASSERT( &aIn != NULL, "-ImportExcel::Read(): Kein Stream - wie dass?!" ); |
| |
| ::std::auto_ptr< ScfSimpleProgressBar > pProgress( new ScfSimpleProgressBar( |
| aIn.GetSvStreamSize(), GetDocShell(), STR_LOAD_DOC ) ); |
| |
| /* #i104057# Need to track a base position for progress bar calculation, |
| because sheet substreams may not be in order of sheets. */ |
| sal_Size nProgressBasePos = 0; |
| sal_Size nProgressBaseSize = 0; |
| |
| while( eAkt != Z_Ende ) |
| { |
| if( eAkt == Z_Biff5E ) |
| { |
| sal_uInt16 nScTab = GetCurrScTab(); |
| if( nScTab < maSheetOffsets.size() ) |
| { |
| nProgressBaseSize += (aIn.GetSvStreamPos() - nProgressBasePos); |
| nProgressBasePos = maSheetOffsets[ nScTab ]; |
| aIn.StartNextRecord( nProgressBasePos ); |
| } |
| else |
| eAkt = Z_Ende; |
| } |
| else |
| aIn.StartNextRecord(); |
| |
| nOpcode = aIn.GetRecId(); |
| |
| if( !aIn.IsValid() ) |
| { |
| // #124240# finalize table if EOF is missing |
| switch( eAkt ) |
| { |
| case Z_Biff2: |
| case Z_Biff3: |
| case Z_Biff4: |
| case Z_Biff4T: |
| case Z_Biff5TPre: |
| case Z_Biff5T: |
| rNumFmtBfr.CreateScFormats(); |
| Eof(); |
| break; |
| default:; |
| }; |
| eAkt = Z_Ende; |
| break; |
| } |
| |
| if( eAkt == Z_Ende ) |
| break; |
| |
| if( eAkt != Z_Biff5TPre && eAkt != Z_Biff5WPre ) |
| pProgress->ProgressAbs( nProgressBaseSize + aIn.GetSvStreamPos() - nProgressBasePos ); |
| |
| switch( eAkt ) |
| { |
| // ---------------------------------------------------------------- |
| case Z_BiffNull: // ------------------------------- Z_BiffNull - |
| { |
| switch( nOpcode ) |
| { |
| case EXC_ID2_BOF: |
| case EXC_ID3_BOF: |
| case EXC_ID4_BOF: |
| case EXC_ID5_BOF: |
| { |
| // #i23425# don't rely on the record ID, but on the detected BIFF version |
| switch( GetBiff() ) |
| { |
| case EXC_BIFF2: |
| Bof2(); |
| if( pExcRoot->eDateiTyp == Biff2 ) |
| { |
| eAkt = Z_Biff2; |
| NeueTabelle(); |
| } |
| break; |
| case EXC_BIFF3: |
| Bof3(); |
| if( pExcRoot->eDateiTyp == Biff3 ) |
| { |
| eAkt = Z_Biff3; |
| NeueTabelle(); |
| } |
| break; |
| case EXC_BIFF4: |
| Bof4(); |
| if( pExcRoot->eDateiTyp == Biff4 ) |
| { |
| eAkt = Z_Biff4; |
| NeueTabelle(); |
| } |
| else if( pExcRoot->eDateiTyp == Biff4W ) |
| { |
| eAkt = Z_Biff4W; |
| } |
| break; |
| case EXC_BIFF5: |
| Bof5(); |
| if( pExcRoot->eDateiTyp == Biff5W ) |
| { |
| eAkt = Z_Biff5WPre; |
| |
| nBdshtTab = 0; |
| |
| aIn.StoreGlobalPosition(); // und Position merken |
| } |
| else if( pExcRoot->eDateiTyp == Biff5 ) |
| { |
| // #i62752# possible to have BIFF5 sheet without globals |
| NeueTabelle(); |
| eAkt = Z_Biff5TPre; // Shrfmla Prefetch, Row-Prefetch |
| nBofLevel = 0; |
| aIn.StoreGlobalPosition(); // und Position merken |
| } |
| break; |
| default: |
| DBG_ERROR_BIFF(); |
| } |
| } |
| break; |
| } |
| } |
| break; |
| // ---------------------------------------------------------------- |
| case Z_Biff2: // ---------------------------------- Z_Biff2 - |
| { |
| switch( nOpcode ) |
| { |
| case EXC_ID2_DIMENSIONS: |
| case EXC_ID3_DIMENSIONS: ReadDimensions(); break; |
| case EXC_ID2_BLANK: |
| case EXC_ID3_BLANK: ReadBlank(); break; |
| case EXC_ID2_INTEGER: ReadInteger(); break; |
| case EXC_ID2_NUMBER: |
| case EXC_ID3_NUMBER: ReadNumber(); break; |
| case EXC_ID2_LABEL: |
| case EXC_ID3_LABEL: ReadLabel(); break; |
| case EXC_ID2_BOOLERR: |
| case EXC_ID3_BOOLERR: ReadBoolErr(); break; |
| case EXC_ID_RK: ReadRk(); break; |
| |
| case 0x06: Formula25(); break; // FORMULA [ 2 5] |
| case 0x08: Row25(); break; // ROW [ 2 5] |
| case 0x0A: // EOF [ 2345] |
| rNumFmtBfr.CreateScFormats(); |
| Eof(); |
| eAkt = Z_Ende; |
| break; |
| case 0x14: |
| case 0x15: rPageSett.ReadHeaderFooter( maStrm ); break; |
| case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345] |
| case 0x18: rNameMgr.ReadName( maStrm ); break; |
| case 0x1C: GetCurrSheetDrawing().ReadNote( maStrm );break; |
| case 0x1D: rTabViewSett.ReadSelection( maStrm ); break; |
| case 0x1E: rNumFmtBfr.ReadFormat( maStrm ); break; |
| case 0x20: Columndefault(); break; // COLUMNDEFAULT[ 2 ] |
| case 0x21: Array25(); break; // ARRAY [ 2 5] |
| case 0x23: Externname25(); break; // EXTERNNAME [ 2 5] |
| case 0x24: Colwidth(); break; // COLWIDTH [ 2 ] |
| case 0x25: Defrowheight2(); break; // DEFAULTROWHEI[ 2 ] |
| case 0x26: |
| case 0x27: |
| case 0x28: |
| case 0x29: rPageSett.ReadMargin( maStrm ); break; |
| case 0x2A: rPageSett.ReadPrintHeaders( maStrm ); break; |
| case 0x2B: rPageSett.ReadPrintGridLines( maStrm ); break; |
| case 0x2F: // FILEPASS [ 2345] |
| eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm ); |
| if( eLastErr != ERRCODE_NONE ) |
| eAkt = Z_Ende; |
| break; |
| case EXC_ID2_FONT: rFontBfr.ReadFont( maStrm ); break; |
| case EXC_ID_EFONT: rFontBfr.ReadEfont( maStrm ); break; |
| case 0x3E: rTabViewSett.ReadWindow2( maStrm, false );break; |
| case 0x41: rTabViewSett.ReadPane( maStrm ); break; |
| case 0x42: Codepage(); break; // CODEPAGE [ 2345] |
| case 0x43: rXFBfr.ReadXF( maStrm ); break; |
| case 0x44: Ixfe(); break; // IXFE [ 2 ] |
| } |
| } |
| break; |
| // ---------------------------------------------------------------- |
| case Z_Biff3: // ---------------------------------- Z_Biff3 - |
| { |
| switch( nOpcode ) |
| { |
| // skip chart substream |
| case EXC_ID2_BOF: |
| case EXC_ID3_BOF: |
| case EXC_ID4_BOF: |
| case EXC_ID5_BOF: XclTools::SkipSubStream( maStrm ); break; |
| |
| case EXC_ID2_DIMENSIONS: |
| case EXC_ID3_DIMENSIONS: ReadDimensions(); break; |
| case EXC_ID2_BLANK: |
| case EXC_ID3_BLANK: ReadBlank(); break; |
| case EXC_ID2_INTEGER: ReadInteger(); break; |
| case EXC_ID2_NUMBER: |
| case EXC_ID3_NUMBER: ReadNumber(); break; |
| case EXC_ID2_LABEL: |
| case EXC_ID3_LABEL: ReadLabel(); break; |
| case EXC_ID2_BOOLERR: |
| case EXC_ID3_BOOLERR: ReadBoolErr(); break; |
| case EXC_ID_RK: ReadRk(); break; |
| |
| case 0x0A: // EOF [ 2345] |
| rNumFmtBfr.CreateScFormats(); |
| Eof(); |
| eAkt = Z_Ende; |
| break; |
| case 0x14: |
| case 0x15: rPageSett.ReadHeaderFooter( maStrm ); break; |
| case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345] |
| case 0x1A: |
| case 0x1B: rPageSett.ReadPageBreaks( maStrm ); break; |
| case 0x1C: GetCurrSheetDrawing().ReadNote( maStrm );break; |
| case 0x1D: rTabViewSett.ReadSelection( maStrm ); break; |
| case 0x1E: rNumFmtBfr.ReadFormat( maStrm ); break; |
| case 0x22: Rec1904(); break; // 1904 [ 2345] |
| case 0x26: |
| case 0x27: |
| case 0x28: |
| case 0x29: rPageSett.ReadMargin( maStrm ); break; |
| case 0x2A: rPageSett.ReadPrintHeaders( maStrm ); break; |
| case 0x2B: rPageSett.ReadPrintGridLines( maStrm ); break; |
| case 0x2F: // FILEPASS [ 2345] |
| eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm ); |
| if( eLastErr != ERRCODE_NONE ) |
| eAkt = Z_Ende; |
| break; |
| case EXC_ID_FILESHARING: ReadFileSharing(); break; |
| case 0x41: rTabViewSett.ReadPane( maStrm ); break; |
| case 0x42: Codepage(); break; // CODEPAGE [ 2345] |
| case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ] |
| case 0x5D: GetCurrSheetDrawing().ReadObj( maStrm );break; |
| case 0x7D: Colinfo(); break; // COLINFO [ 345] |
| case 0x8C: Country(); break; // COUNTRY [ 345] |
| case 0x92: rPal.ReadPalette( maStrm ); break; |
| case 0x0206: Formula3(); break; // FORMULA [ 3 ] |
| case 0x0208: Row34(); break; // ROW [ 34 ] |
| case 0x0218: rNameMgr.ReadName( maStrm ); break; |
| case 0x0221: Array34(); break; // ARRAY [ 34 ] |
| case 0x0223: Externname34(); break; // EXTERNNAME [ 34 ] |
| case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345] |
| case 0x0231: rFontBfr.ReadFont( maStrm ); break; |
| case 0x023E: rTabViewSett.ReadWindow2( maStrm, false );break; |
| case 0x0243: rXFBfr.ReadXF( maStrm ); break; |
| case 0x0293: rXFBfr.ReadStyle( maStrm ); break; |
| } |
| } |
| break; |
| // ---------------------------------------------------------------- |
| case Z_Biff4: // ---------------------------------- Z_Biff4 - |
| { |
| switch( nOpcode ) |
| { |
| // skip chart substream |
| case EXC_ID2_BOF: |
| case EXC_ID3_BOF: |
| case EXC_ID4_BOF: |
| case EXC_ID5_BOF: XclTools::SkipSubStream( maStrm ); break; |
| |
| case EXC_ID2_DIMENSIONS: |
| case EXC_ID3_DIMENSIONS: ReadDimensions(); break; |
| case EXC_ID2_BLANK: |
| case EXC_ID3_BLANK: ReadBlank(); break; |
| case EXC_ID2_INTEGER: ReadInteger(); break; |
| case EXC_ID2_NUMBER: |
| case EXC_ID3_NUMBER: ReadNumber(); break; |
| case EXC_ID2_LABEL: |
| case EXC_ID3_LABEL: ReadLabel(); break; |
| case EXC_ID2_BOOLERR: |
| case EXC_ID3_BOOLERR: ReadBoolErr(); break; |
| case EXC_ID_RK: ReadRk(); break; |
| |
| case 0x0A: // EOF [ 2345] |
| rNumFmtBfr.CreateScFormats(); |
| Eof(); |
| eAkt = Z_Ende; |
| break; |
| case 0x12: SheetProtect(); break; // SHEET PROTECTION |
| case 0x14: |
| case 0x15: rPageSett.ReadHeaderFooter( maStrm ); break; |
| case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345] |
| case 0x1A: |
| case 0x1B: rPageSett.ReadPageBreaks( maStrm ); break; |
| case 0x1C: GetCurrSheetDrawing().ReadNote( maStrm );break; |
| case 0x1D: rTabViewSett.ReadSelection( maStrm ); break; |
| case 0x22: Rec1904(); break; // 1904 [ 2345] |
| case 0x26: |
| case 0x27: |
| case 0x28: |
| case 0x29: rPageSett.ReadMargin( maStrm ); break; |
| case 0x2A: rPageSett.ReadPrintHeaders( maStrm ); break; |
| case 0x2B: rPageSett.ReadPrintGridLines( maStrm ); break; |
| case 0x2F: // FILEPASS [ 2345] |
| eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm ); |
| if( eLastErr != ERRCODE_NONE ) |
| eAkt = Z_Ende; |
| break; |
| case EXC_ID_FILESHARING: ReadFileSharing(); break; |
| case 0x41: rTabViewSett.ReadPane( maStrm ); break; |
| case 0x42: Codepage(); break; // CODEPAGE [ 2345] |
| case 0x55: DefColWidth(); break; |
| case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ] |
| case 0x5D: GetCurrSheetDrawing().ReadObj( maStrm );break; |
| case 0x7D: Colinfo(); break; // COLINFO [ 345] |
| case 0x8C: Country(); break; // COUNTRY [ 345] |
| case 0x92: rPal.ReadPalette( maStrm ); break; |
| case 0x99: Standardwidth(); break; // STANDARDWIDTH[ 45] |
| case 0xA1: rPageSett.ReadSetup( maStrm ); break; |
| case 0x0208: Row34(); break; // ROW [ 34 ] |
| case 0x0218: rNameMgr.ReadName( maStrm ); break; |
| case 0x0221: Array34(); break; // ARRAY [ 34 ] |
| case 0x0223: Externname34(); break; // EXTERNNAME [ 34 ] |
| case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345] |
| case 0x0231: rFontBfr.ReadFont( maStrm ); break; |
| case 0x023E: rTabViewSett.ReadWindow2( maStrm, false );break; |
| case 0x0406: Formula4(); break; // FORMULA [ 4 ] |
| case 0x041E: rNumFmtBfr.ReadFormat( maStrm ); break; |
| case 0x0443: rXFBfr.ReadXF( maStrm ); break; |
| case 0x0293: rXFBfr.ReadStyle( maStrm ); break; |
| } |
| } |
| break; |
| // ---------------------------------------------------------------- |
| case Z_Biff4W: // --------------------------------- Z_Biff4W - |
| { |
| switch( nOpcode ) |
| { |
| case 0x0A: // EOF [ 2345] |
| eAkt = Z_Ende; |
| break; |
| case 0x12: DocProtect(); break; // PROTECT [ 5] |
| case 0x2F: // FILEPASS [ 2345] |
| eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm ); |
| if( eLastErr != ERRCODE_NONE ) |
| eAkt = Z_Ende; |
| break; |
| case EXC_ID_FILESHARING: ReadFileSharing(); break; |
| case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345] |
| case 0x42: Codepage(); break; // CODEPAGE [ 2345] |
| case 0x55: DefColWidth(); break; |
| case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ] |
| case 0x8C: Country(); break; // COUNTRY [ 345] |
| case 0x8F: Bundleheader(); break; // BUNDLEHEADER [ 4 ] |
| case 0x92: rPal.ReadPalette( maStrm ); break; |
| case 0x99: Standardwidth(); break; // STANDARDWIDTH[ 45] |
| case 0x0218: rNameMgr.ReadName( maStrm ); break; |
| case 0x0223: Externname34(); break; // EXTERNNAME [ 34 ] |
| case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345] |
| case 0x0231: rFontBfr.ReadFont( maStrm ); break; |
| case 0x0409: // BOF [ 4 ] |
| Bof4(); |
| if( pExcRoot->eDateiTyp == Biff4 ) |
| { |
| eAkt = Z_Biff4T; |
| NeueTabelle(); |
| } |
| else |
| eAkt = Z_Ende; |
| break; |
| case 0x041E: rNumFmtBfr.ReadFormat( maStrm ); break; |
| case 0x0443: rXFBfr.ReadXF( maStrm ); break; |
| case 0x0293: rXFBfr.ReadStyle( maStrm ); break; |
| } |
| |
| } |
| break; |
| // ---------------------------------------------------------------- |
| case Z_Biff4T: // --------------------------------- Z_Biff4T - |
| { |
| switch( nOpcode ) |
| { |
| // skip chart substream |
| case EXC_ID2_BOF: |
| case EXC_ID3_BOF: |
| case EXC_ID4_BOF: |
| case EXC_ID5_BOF: XclTools::SkipSubStream( maStrm ); break; |
| |
| case EXC_ID2_DIMENSIONS: |
| case EXC_ID3_DIMENSIONS: ReadDimensions(); break; |
| case EXC_ID2_BLANK: |
| case EXC_ID3_BLANK: ReadBlank(); break; |
| case EXC_ID2_INTEGER: ReadInteger(); break; |
| case EXC_ID2_NUMBER: |
| case EXC_ID3_NUMBER: ReadNumber(); break; |
| case EXC_ID2_LABEL: |
| case EXC_ID3_LABEL: ReadLabel(); break; |
| case EXC_ID2_BOOLERR: |
| case EXC_ID3_BOOLERR: ReadBoolErr(); break; |
| case EXC_ID_RK: ReadRk(); break; |
| |
| case 0x0A: // EOF [ 2345] |
| Eof(); |
| eAkt = Z_Biff4E; |
| break; |
| case 0x12: SheetProtect(); break; // SHEET PROTECTION |
| case 0x14: |
| case 0x15: rPageSett.ReadHeaderFooter( maStrm ); break; |
| case 0x1A: |
| case 0x1B: rPageSett.ReadPageBreaks( maStrm ); break; |
| case 0x1C: GetCurrSheetDrawing().ReadNote( maStrm );break; |
| case 0x1D: rTabViewSett.ReadSelection( maStrm ); break; |
| case 0x2F: // FILEPASS [ 2345] |
| eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm ); |
| if( eLastErr != ERRCODE_NONE ) |
| eAkt = Z_Ende; |
| break; |
| case 0x41: rTabViewSett.ReadPane( maStrm ); break; |
| case 0x42: Codepage(); break; // CODEPAGE [ 2345] |
| case 0x55: DefColWidth(); break; |
| case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ] |
| case 0x5D: GetCurrSheetDrawing().ReadObj( maStrm );break; |
| case 0x7D: Colinfo(); break; // COLINFO [ 345] |
| case 0x8C: Country(); break; // COUNTRY [ 345] |
| case 0x8F: Bundleheader(); break; // BUNDLEHEADER [ 4 ] |
| case 0x92: rPal.ReadPalette( maStrm ); break; |
| case 0x99: Standardwidth(); break; // STANDARDWIDTH[ 45] |
| case 0xA1: rPageSett.ReadSetup( maStrm ); break; |
| case 0x0208: Row34(); break; // ROW [ 34 ] |
| case 0x0218: rNameMgr.ReadName( maStrm ); break; |
| case 0x0221: Array34(); break; |
| case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345] |
| case 0x0231: rFontBfr.ReadFont( maStrm ); break; |
| case 0x023E: rTabViewSett.ReadWindow2( maStrm, false );break; |
| case 0x0406: Formula4(); break; |
| case 0x041E: rNumFmtBfr.ReadFormat( maStrm ); break; |
| case 0x0443: rXFBfr.ReadXF( maStrm ); break; |
| case 0x0293: rXFBfr.ReadStyle( maStrm ); break; |
| } |
| |
| } |
| break; |
| // ---------------------------------------------------------------- |
| case Z_Biff4E: // --------------------------------- Z_Biff4E - |
| { |
| switch( nOpcode ) |
| { |
| case 0x0A: // EOF [ 2345] |
| eAkt = Z_Ende; |
| break; |
| case 0x8F: break; // BUNDLEHEADER [ 4 ] |
| case 0x0409: // BOF [ 4 ] |
| Bof4(); |
| NeueTabelle(); |
| if( pExcRoot->eDateiTyp == Biff4 ) |
| { |
| eAkt = Z_Biff4T; |
| } |
| else |
| { |
| ePrev = eAkt; |
| eAkt = Z_Biffn0; |
| } |
| break; |
| } |
| |
| } |
| break; |
| case Z_Biff5WPre: // ------------------------------ Z_Biff5WPre - |
| { |
| switch( nOpcode ) |
| { |
| case 0x0A: // EOF [ 2345] |
| eAkt = Z_Biff5W; |
| aIn.SeekGlobalPosition(); // und zurueck an alte Position |
| break; |
| case 0x12: DocProtect(); break; // PROTECT [ 5] |
| case 0x2F: // FILEPASS [ 2345] |
| eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm ); |
| if( eLastErr != ERRCODE_NONE ) |
| eAkt = Z_Ende; |
| break; |
| case EXC_ID_FILESHARING: ReadFileSharing(); break; |
| case 0x3D: Window1(); break; |
| case 0x42: Codepage(); break; // CODEPAGE [ 2345] |
| case 0x85: Boundsheet(); break; // BOUNDSHEET [ 5] |
| case 0x8C: Country(); break; // COUNTRY [ 345] |
| // PALETTE follows XFs, but already needed while reading the XFs |
| case 0x92: rPal.ReadPalette( maStrm ); break; |
| } |
| } |
| break; |
| case Z_Biff5W: // --------------------------------- Z_Biff5W - |
| { |
| switch( nOpcode ) |
| { |
| case 0x0A: // EOF [ 2345] |
| rNumFmtBfr.CreateScFormats(); |
| rXFBfr.CreateUserStyles(); |
| eAkt = Z_Biff5E; |
| break; |
| case 0x18: rNameMgr.ReadName( maStrm ); break; |
| case 0x1E: rNumFmtBfr.ReadFormat( maStrm ); break; |
| case 0x22: Rec1904(); break; // 1904 [ 2345] |
| case 0x31: rFontBfr.ReadFont( maStrm ); break; |
| case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ] |
| case 0x8D: Hideobj(); break; // HIDEOBJ [ 345] |
| case 0xDE: Olesize(); break; |
| case 0xE0: rXFBfr.ReadXF( maStrm ); break; |
| case 0x0293: rXFBfr.ReadStyle( maStrm ); break; |
| case 0x041E: rNumFmtBfr.ReadFormat( maStrm ); break; |
| } |
| |
| } |
| break; |
| // ---------------------------------------------------------------- |
| case Z_Biff5TPre: // ------------------------------- Z_Biff5Pre - |
| { |
| if( nOpcode == 0x0809 ) |
| nBofLevel++; |
| else if( (nOpcode == 0x000A) && nBofLevel ) |
| nBofLevel--; |
| else if( !nBofLevel ) // don't read chart records |
| { |
| switch( nOpcode ) |
| { |
| case EXC_ID2_DIMENSIONS: |
| case EXC_ID3_DIMENSIONS: ReadDimensions(); break; |
| case 0x08: Row25(); break; // ROW [ 2 5] |
| case 0x0A: // EOF [ 2345] |
| eAkt = Z_Biff5T; |
| aIn.SeekGlobalPosition(); // und zurueck an alte Position |
| break; |
| case 0x12: SheetProtect(); break; // SHEET PROTECTION |
| case 0x1A: |
| case 0x1B: rPageSett.ReadPageBreaks( maStrm ); break; |
| case 0x1D: rTabViewSett.ReadSelection( maStrm ); break; |
| case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345] |
| case 0x21: Array25(); break; // ARRAY [ 2 5] |
| case 0x23: Externname25(); break; // EXTERNNAME [ 2 5] |
| case 0x41: rTabViewSett.ReadPane( maStrm ); break; |
| case 0x42: Codepage(); break; // CODEPAGE [ 2345] |
| case 0x55: DefColWidth(); break; |
| case 0x7D: Colinfo(); break; // COLINFO [ 345] |
| case 0x81: Wsbool(); break; // WSBOOL [ 2345] |
| case 0x8C: Country(); break; // COUNTRY [ 345] |
| case 0x99: Standardwidth(); break; // STANDARDWIDTH[ 45] |
| case 0x0208: Row34(); break; // ROW [ 34 ] |
| case 0x0221: Array34(); break; // ARRAY [ 34 ] |
| case 0x0223: Externname34(); break; // EXTERNNAME [ 34 ] |
| case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345] |
| case 0x023E: rTabViewSett.ReadWindow2( maStrm, false );break; |
| case 0x04BC: Shrfmla(); break; // SHRFMLA [ 5] |
| } |
| } |
| } |
| break; |
| // ---------------------------------------------------------------- |
| case Z_Biff5T: // --------------------------------- Z_Biff5T - |
| { |
| switch( nOpcode ) |
| { |
| case EXC_ID2_BLANK: |
| case EXC_ID3_BLANK: ReadBlank(); break; |
| case EXC_ID2_INTEGER: ReadInteger(); break; |
| case EXC_ID2_NUMBER: |
| case EXC_ID3_NUMBER: ReadNumber(); break; |
| case EXC_ID2_LABEL: |
| case EXC_ID3_LABEL: ReadLabel(); break; |
| case EXC_ID2_BOOLERR: |
| case EXC_ID3_BOOLERR: ReadBoolErr(); break; |
| case EXC_ID_RK: ReadRk(); break; |
| |
| case 0x0006: |
| case 0x0206: |
| case 0x0406: Formula25(); break; |
| case 0x0A: Eof(); eAkt = Z_Biff5E; break; |
| case 0x14: |
| case 0x15: rPageSett.ReadHeaderFooter( maStrm ); break; |
| case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345] |
| case 0x1C: GetCurrSheetDrawing().ReadNote( maStrm );break; |
| case 0x1D: rTabViewSett.ReadSelection( maStrm ); break; |
| case 0x23: Externname25(); break; // EXTERNNAME [ 2 5] |
| case 0x26: |
| case 0x27: |
| case 0x28: |
| case 0x29: rPageSett.ReadMargin( maStrm ); break; |
| case 0x2A: rPageSett.ReadPrintHeaders( maStrm ); break; |
| case 0x2B: rPageSett.ReadPrintGridLines( maStrm ); break; |
| case 0x2F: // FILEPASS [ 2345] |
| eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm ); |
| if( eLastErr != ERRCODE_NONE ) |
| eAkt = Z_Ende; |
| break; |
| case 0x5D: GetCurrSheetDrawing().ReadObj( maStrm );break; |
| case 0x83: |
| case 0x84: rPageSett.ReadCenter( maStrm ); break; |
| case 0xA0: rTabViewSett.ReadScl( maStrm ); break; |
| case 0xA1: rPageSett.ReadSetup( maStrm ); break; |
| case 0xBD: Mulrk(); break; // MULRK [ 5] |
| case 0xBE: Mulblank(); break; // MULBLANK [ 5] |
| case 0xD6: Rstring(); break; // RSTRING [ 5] |
| case 0x00E5: Cellmerging(); break; // #i62300# |
| case 0x0236: TableOp(); break; // TABLE [ 5] |
| case 0x0809: // BOF [ 5] |
| XclTools::SkipSubStream( maStrm ); |
| break; |
| } |
| |
| } |
| break; |
| // ---------------------------------------------------------------- |
| case Z_Biff5E: // --------------------------------- Z_Biff5E - |
| { |
| switch( nOpcode ) |
| { |
| case 0x0809: // BOF [ 5] |
| Bof5(); |
| NeueTabelle(); |
| switch( pExcRoot->eDateiTyp ) |
| { |
| case Biff5: |
| case Biff5M4: |
| eAkt = Z_Biff5TPre; // Shrfmla Prefetch, Row-Prefetch |
| nBofLevel = 0; |
| aIn.StoreGlobalPosition(); // und Position merken |
| break; |
| case Biff5C: // chart sheet |
| GetCurrSheetDrawing().ReadTabChart( maStrm ); |
| Eof(); |
| GetTracer().TraceChartOnlySheet(); |
| break; |
| case Biff5V: |
| default: |
| pD->SetVisible( GetCurrScTab(), sal_False ); |
| ePrev = eAkt; |
| eAkt = Z_Biffn0; |
| } |
| DBG_ASSERT( pExcRoot->eDateiTyp != Biff5W, |
| "+ImportExcel::Read(): Doppel-Whopper-Workbook!" ); |
| |
| break; |
| } |
| |
| } |
| break; |
| case Z_Biffn0: // --------------------------------- Z_Biffn0 - |
| { |
| switch( nOpcode ) |
| { |
| case 0x0A: // EOF [ 2345] |
| eAkt = ePrev; |
| IncCurrScTab(); |
| break; |
| } |
| |
| } |
| break; |
| // ---------------------------------------------------------------- |
| case Z_Ende: // ----------------------------------- Z_Ende - |
| DBG_ERROR( "*ImportExcel::Read(): Not possible state!" ); |
| break; |
| default: DBG_ERROR( "-ImportExcel::Read(): Zustand vergessen!" ); |
| } |
| } |
| |
| if( eLastErr == eERR_OK ) |
| { |
| pProgress.reset(); |
| |
| AdjustRowHeight(); |
| PostDocLoad(); |
| |
| pD->CalcAfterLoad(); |
| |
| const XclImpAddressConverter& rAddrConv = GetAddressConverter(); |
| if( rAddrConv.IsTabTruncated() ) |
| eLastErr = SCWARN_IMPORT_SHEET_OVERFLOW; |
| else if( bTabTruncated || rAddrConv.IsRowTruncated() ) |
| eLastErr = SCWARN_IMPORT_ROW_OVERFLOW; |
| else if( rAddrConv.IsColTruncated() ) |
| eLastErr = SCWARN_IMPORT_COLUMN_OVERFLOW; |
| } |
| |
| return eLastErr; |
| } |
| |
| |
| //___________________________________________________________________ |
| |
| FltError ImportExcel8::Read( void ) |
| { |
| #if EXC_INCL_DUMPER |
| { |
| Biff8RecDumper aDumper( GetRoot(), sal_True ); |
| if( aDumper.Dump( aIn ) ) |
| return ERRCODE_ABORT; |
| } |
| #endif |
| // read the entire BIFF8 stream |
| // don't look too close - this stuff seriously needs to be reworked |
| |
| XclImpPageSettings& rPageSett = GetPageSettings(); |
| XclImpTabViewSettings& rTabViewSett = GetTabViewSettings(); |
| XclImpPalette& rPal = GetPalette(); |
| XclImpFontBuffer& rFontBfr = GetFontBuffer(); |
| XclImpNumFmtBuffer& rNumFmtBfr = GetNumFmtBuffer(); |
| XclImpXFBuffer& rXFBfr = GetXFBuffer(); |
| XclImpSst& rSst = GetSst(); |
| XclImpTabInfo& rTabInfo = GetTabInfo(); |
| XclImpNameManager& rNameMgr = GetNameManager(); |
| XclImpLinkManager& rLinkMgr = GetLinkManager(); |
| XclImpObjectManager& rObjMgr = GetObjectManager(); |
| // call to GetCurrSheetDrawing() cannot be cached (changes in new sheets) |
| XclImpCondFormatManager& rCondFmtMgr = GetCondFormatManager(); |
| XclImpPivotTableManager& rPTableMgr = GetPivotTableManager(); |
| XclImpWebQueryBuffer& rWQBfr = GetWebQueryBuffer(); |
| |
| bool bInUserView = false; // true = In USERSVIEW(BEGIN|END) record block. |
| |
| enum XclImpReadState |
| { |
| EXC_STATE_BEFORE_GLOBALS, /// Before workbook globals (wait for initial BOF). |
| EXC_STATE_GLOBALS_PRE, /// Prefetch for workbook globals. |
| EXC_STATE_GLOBALS, /// Workbook globals. |
| EXC_STATE_BEFORE_SHEET, /// Before worksheet (wait for new worksheet BOF). |
| EXC_STATE_SHEET_PRE, /// Prefetch for worksheet. |
| EXC_STATE_SHEET, /// Worksheet. |
| EXC_STATE_END /// Stop reading. |
| }; |
| |
| XclImpReadState eAkt = EXC_STATE_BEFORE_GLOBALS; |
| |
| FltError eLastErr = eERR_OK; |
| |
| ::std::auto_ptr< ScfSimpleProgressBar > pProgress( new ScfSimpleProgressBar( |
| aIn.GetSvStreamSize(), GetDocShell(), STR_LOAD_DOC ) ); |
| |
| /* #i104057# Need to track a base position for progress bar calculation, |
| because sheet substreams may not be in order of sheets. */ |
| sal_Size nProgressBasePos = 0; |
| sal_Size nProgressBaseSize = 0; |
| |
| while( eAkt != EXC_STATE_END ) |
| { |
| if( eAkt == EXC_STATE_BEFORE_SHEET ) |
| { |
| sal_uInt16 nScTab = GetCurrScTab(); |
| if( nScTab < maSheetOffsets.size() ) |
| { |
| nProgressBaseSize += (maStrm.GetSvStreamPos() - nProgressBasePos); |
| nProgressBasePos = maSheetOffsets[ nScTab ]; |
| maStrm.StartNextRecord( nProgressBasePos ); |
| |
| // #94191# import only 256 sheets |
| if( nScTab > GetScMaxPos().Tab() ) |
| { |
| if( maStrm.GetRecId() != EXC_ID_EOF ) |
| XclTools::SkipSubStream( maStrm ); |
| // #i29930# show warning box |
| GetAddressConverter().CheckScTab( nScTab, true ); |
| eAkt = EXC_STATE_END; |
| } |
| else |
| { |
| // #i109800# SHEET record may point to any record inside the sheet substream |
| bool bIsBof = maStrm.GetRecId() == EXC_ID5_BOF; |
| if( bIsBof ) |
| Bof5(); // read the BOF record |
| else |
| pExcRoot->eDateiTyp = Biff8; // on missing BOF, assume a standard worksheet |
| |
| NeueTabelle(); |
| switch( pExcRoot->eDateiTyp ) |
| { |
| case Biff8: // worksheet |
| case Biff8M4: // macro sheet |
| eAkt = EXC_STATE_SHEET_PRE; // Shrfmla Prefetch, Row-Prefetch |
| // go to next record |
| if( bIsBof ) maStrm.StartNextRecord(); |
| maStrm.StoreGlobalPosition(); |
| break; |
| case Biff8C: // chart sheet |
| GetCurrSheetDrawing().ReadTabChart( maStrm ); |
| Eof(); |
| GetTracer().TraceChartOnlySheet(); |
| break; |
| case Biff8W: // workbook |
| DBG_ERRORFILE( "ImportExcel8::Read - double workbook globals" ); |
| // run through |
| case Biff8V: // VB module |
| default: |
| // TODO: do not create a sheet in the Calc document |
| pD->SetVisible( GetCurrScTab(), sal_False ); |
| XclTools::SkipSubStream( maStrm ); |
| IncCurrScTab(); |
| } |
| } |
| } |
| else |
| eAkt = EXC_STATE_END; |
| } |
| else |
| aIn.StartNextRecord(); |
| |
| if( !aIn.IsValid() ) |
| { |
| // #124240# #i63591# finalize table if EOF is missing |
| switch( eAkt ) |
| { |
| case EXC_STATE_SHEET_PRE: |
| eAkt = EXC_STATE_SHEET; |
| aIn.SeekGlobalPosition(); |
| continue; // next iteration in while loop |
| // break; // unxsols warning: statement unreachable |
| case EXC_STATE_SHEET: |
| Eof(); |
| eAkt = EXC_STATE_END; |
| break; |
| default: |
| eAkt = EXC_STATE_END; |
| } |
| } |
| |
| if( eAkt == EXC_STATE_END ) |
| break; |
| |
| if( eAkt != EXC_STATE_SHEET_PRE && eAkt != EXC_STATE_GLOBALS_PRE ) |
| pProgress->ProgressAbs( nProgressBaseSize + aIn.GetSvStreamPos() - nProgressBasePos ); |
| |
| sal_uInt16 nRecId = aIn.GetRecId(); |
| |
| /* #i39464# Ignore records between USERSVIEWBEGIN and USERSVIEWEND |
| completely (user specific view settings). Otherwise view settings |
| and filters are loaded multiple times, which at least causes |
| problems in auto-filters. */ |
| switch( nRecId ) |
| { |
| case EXC_ID_USERSVIEWBEGIN: |
| DBG_ASSERT( !bInUserView, "ImportExcel8::Read - nested user view settings" ); |
| bInUserView = true; |
| break; |
| case EXC_ID_USERSVIEWEND: |
| DBG_ASSERT( bInUserView, "ImportExcel8::Read - not in user view settings" ); |
| bInUserView = false; |
| break; |
| } |
| |
| if( !bInUserView ) switch( eAkt ) |
| { |
| // ---------------------------------------------------------------- |
| // before workbook globals: wait for initial workbook globals BOF |
| case EXC_STATE_BEFORE_GLOBALS: |
| { |
| if( nRecId == EXC_ID5_BOF ) |
| { |
| DBG_ASSERT( GetBiff() == EXC_BIFF8, "ImportExcel8::Read - wrong BIFF version" ); |
| Bof5(); |
| if( pExcRoot->eDateiTyp == Biff8W ) |
| { |
| eAkt = EXC_STATE_GLOBALS_PRE; |
| maStrm.StoreGlobalPosition(); |
| nBdshtTab = 0; |
| } |
| else if( pExcRoot->eDateiTyp == Biff8 ) |
| { |
| // #i62752# possible to have BIFF8 sheet without globals |
| NeueTabelle(); |
| eAkt = EXC_STATE_SHEET_PRE; // Shrfmla Prefetch, Row-Prefetch |
| aIn.StoreGlobalPosition(); |
| } |
| } |
| } |
| break; |
| |
| // ---------------------------------------------------------------- |
| // prefetch for workbook globals |
| case EXC_STATE_GLOBALS_PRE: |
| { |
| switch( nRecId ) |
| { |
| case EXC_ID_EOF: |
| case EXC_ID_EXTSST: |
| /* #i56376# evil hack: if EOF for globals is missing, |
| simulate it. This hack works only for the bugdoc |
| given in the issue, where the sheet substreams |
| start directly after the EXTSST record. A future |
| implementation should be more robust against |
| missing EOFs. */ |
| if( (nRecId == EXC_ID_EOF) || |
| ((nRecId == EXC_ID_EXTSST) && (maStrm.GetNextRecId() == EXC_ID5_BOF)) ) |
| { |
| eAkt = EXC_STATE_GLOBALS; |
| aIn.SeekGlobalPosition(); |
| } |
| break; |
| case 0x12: DocProtect(); break; // PROTECT [ 5678] |
| case 0x13: DocPasssword(); break; |
| case 0x19: WinProtection(); break; |
| case 0x2F: // FILEPASS [ 2345 ] |
| eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm ); |
| if( eLastErr != ERRCODE_NONE ) |
| eAkt = EXC_STATE_END; |
| break; |
| case EXC_ID_FILESHARING: ReadFileSharing(); break; |
| case 0x3D: Window1(); break; |
| case 0x42: Codepage(); break; // CODEPAGE [ 2345 ] |
| case 0x85: Boundsheet(); break; // BOUNDSHEET [ 5 ] |
| case 0x8C: Country(); break; // COUNTRY [ 345 ] |
| |
| // PALETTE follows XFs, but already needed while reading the XFs |
| case EXC_ID_PALETTE: rPal.ReadPalette( maStrm ); break; |
| } |
| } |
| break; |
| |
| // ---------------------------------------------------------------- |
| // workbook globals |
| case EXC_STATE_GLOBALS: |
| { |
| switch( nRecId ) |
| { |
| case EXC_ID_EOF: |
| case EXC_ID_EXTSST: |
| /* #i56376# evil hack: if EOF for globals is missing, |
| simulate it. This hack works only for the bugdoc |
| given in the issue, where the sheet substreams |
| start directly after the EXTSST record. A future |
| implementation should be more robust against |
| missing EOFs. */ |
| if( (nRecId == EXC_ID_EOF) || |
| ((nRecId == EXC_ID_EXTSST) && (maStrm.GetNextRecId() == EXC_ID5_BOF)) ) |
| { |
| rNumFmtBfr.CreateScFormats(); |
| rXFBfr.CreateUserStyles(); |
| //rPTableMgr.ReadPivotCaches( maStrm ); |
| eAkt = EXC_STATE_BEFORE_SHEET; |
| } |
| break; |
| case 0x0E: Precision(); break; // PRECISION |
| case 0x22: Rec1904(); break; // 1904 [ 2345 ] |
| case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ] |
| case 0x8D: Hideobj(); break; // HIDEOBJ [ 345 ] |
| case 0xD3: SetHasBasic(); break; |
| case 0xDE: Olesize(); break; |
| |
| case EXC_ID_CODENAME: ReadCodeName( aIn, true ); break; |
| case EXC_ID_USESELFS: ReadUsesElfs(); break; |
| |
| case EXC_ID2_FONT: rFontBfr.ReadFont( maStrm ); break; |
| case EXC_ID4_FORMAT: rNumFmtBfr.ReadFormat( maStrm ); break; |
| case EXC_ID5_XF: rXFBfr.ReadXF( maStrm ); break; |
| case EXC_ID_STYLE: rXFBfr.ReadStyle( maStrm ); break; |
| |
| case EXC_ID_SST: rSst.ReadSst( maStrm ); break; |
| case EXC_ID_TABID: rTabInfo.ReadTabid( maStrm ); break; |
| case EXC_ID_NAME: rNameMgr.ReadName( maStrm ); break; |
| |
| case EXC_ID_EXTERNSHEET: rLinkMgr.ReadExternsheet( maStrm ); break; |
| case EXC_ID_SUPBOOK: rLinkMgr.ReadSupbook( maStrm ); break; |
| case EXC_ID_XCT: rLinkMgr.ReadXct( maStrm ); break; |
| case EXC_ID_CRN: rLinkMgr.ReadCrn( maStrm ); break; |
| case EXC_ID_EXTERNNAME: rLinkMgr.ReadExternname( maStrm, pFormConv ); break; |
| |
| case EXC_ID_MSODRAWINGGROUP:rObjMgr.ReadMsoDrawingGroup( maStrm ); break; |
| |
| case EXC_ID_SXIDSTM: rPTableMgr.ReadSxidstm( maStrm ); break; |
| case EXC_ID_SXVS: rPTableMgr.ReadSxvs( maStrm ); break; |
| case EXC_ID_DCONREF: rPTableMgr.ReadDconref( maStrm ); break; |
| } |
| |
| } |
| break; |
| |
| // ---------------------------------------------------------------- |
| // prefetch for worksheet |
| case EXC_STATE_SHEET_PRE: |
| { |
| switch( nRecId ) |
| { |
| // skip chart substream |
| case EXC_ID2_BOF: |
| case EXC_ID3_BOF: |
| case EXC_ID4_BOF: |
| case EXC_ID5_BOF: XclTools::SkipSubStream( maStrm ); break; |
| |
| case EXC_ID_WINDOW2: rTabViewSett.ReadWindow2( maStrm, false );break; |
| case EXC_ID_SCL: rTabViewSett.ReadScl( maStrm ); break; |
| case EXC_ID_PANE: rTabViewSett.ReadPane( maStrm ); break; |
| case EXC_ID_SELECTION: rTabViewSett.ReadSelection( maStrm ); break; |
| |
| case EXC_ID2_DIMENSIONS: |
| case EXC_ID3_DIMENSIONS: ReadDimensions(); break; |
| |
| case EXC_ID_CODENAME: ReadCodeName( aIn, false ); break; |
| |
| case 0x0A: // EOF [ 2345 ] |
| eAkt = EXC_STATE_SHEET; |
| aIn.SeekGlobalPosition(); // und zurueck an alte Position |
| break; |
| case 0x12: SheetProtect(); break; |
| case 0x13: SheetPassword(); break; |
| case 0x42: Codepage(); break; // CODEPAGE [ 2345 ] |
| case 0x55: DefColWidth(); break; |
| case 0x7D: Colinfo(); break; // COLINFO [ 345 ] |
| case 0x81: Wsbool(); break; // WSBOOL [ 2345 ] |
| case 0x8C: Country(); break; // COUNTRY [ 345 ] |
| case 0x99: Standardwidth(); break; // STANDARDWIDTH[ 45 ] |
| case 0x9B: FilterMode(); break; // FILTERMODE |
| case 0x9D: AutoFilterInfo(); break;// AUTOFILTERINFO |
| case 0x9E: AutoFilter(); break; // AUTOFILTER |
| case 0x0208: Row34(); break; // ROW [ 34 ] |
| case 0x0021: |
| case 0x0221: Array34(); break; // ARRAY [ 34 ] |
| case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345 ] |
| case 0x04BC: Shrfmla(); break; // SHRFMLA [ 5 ] |
| case 0x0867: SheetProtection(); break; // SHEETPROTECTION |
| } |
| } |
| break; |
| |
| // ---------------------------------------------------------------- |
| // worksheet |
| case EXC_STATE_SHEET: |
| { |
| switch( nRecId ) |
| { |
| // skip unknown substreams |
| case EXC_ID2_BOF: |
| case EXC_ID3_BOF: |
| case EXC_ID4_BOF: |
| case EXC_ID5_BOF: XclTools::SkipSubStream( maStrm ); break; |
| |
| case EXC_ID_EOF: Eof(); eAkt = EXC_STATE_BEFORE_SHEET; break; |
| |
| case EXC_ID2_BLANK: |
| case EXC_ID3_BLANK: ReadBlank(); break; |
| case EXC_ID2_INTEGER: ReadInteger(); break; |
| case EXC_ID2_NUMBER: |
| case EXC_ID3_NUMBER: ReadNumber(); break; |
| case EXC_ID2_LABEL: |
| case EXC_ID3_LABEL: ReadLabel(); break; |
| case EXC_ID2_BOOLERR: |
| case EXC_ID3_BOOLERR: ReadBoolErr(); break; |
| case EXC_ID_RK: ReadRk(); break; |
| |
| case 0x0006: |
| case 0x0206: |
| case 0x0406: Formula25(); break; // FORMULA [ 2 5 ] |
| case 0x000C: Calccount(); break; // CALCCOUNT |
| case 0x0010: Delta(); break; // DELTA |
| case 0x0011: Iteration(); break; // ITERATION |
| case 0x007E: |
| case 0x00AE: Scenman(); break; // SCENMAN |
| case 0x00AF: Scenario(); break; // SCENARIO |
| case 0x00BD: Mulrk(); break; // MULRK [ 5 ] |
| case 0x00BE: Mulblank(); break; // MULBLANK [ 5 ] |
| case 0x00D6: Rstring(); break; // RSTRING [ 5 ] |
| case 0x00E5: Cellmerging(); break; // CELLMERGING |
| case 0x00FD: Labelsst(); break; // LABELSST [ 8 ] |
| case 0x0236: TableOp(); break; // TABLE |
| |
| case EXC_ID_HORPAGEBREAKS: |
| case EXC_ID_VERPAGEBREAKS: rPageSett.ReadPageBreaks( maStrm ); break; |
| case EXC_ID_HEADER: |
| case EXC_ID_FOOTER: rPageSett.ReadHeaderFooter( maStrm ); break; |
| case EXC_ID_LEFTMARGIN: |
| case EXC_ID_RIGHTMARGIN: |
| case EXC_ID_TOPMARGIN: |
| case EXC_ID_BOTTOMMARGIN: rPageSett.ReadMargin( maStrm ); break; |
| case EXC_ID_PRINTHEADERS: rPageSett.ReadPrintHeaders( maStrm ); break; |
| case EXC_ID_PRINTGRIDLINES: rPageSett.ReadPrintGridLines( maStrm ); break; |
| case EXC_ID_HCENTER: |
| case EXC_ID_VCENTER: rPageSett.ReadCenter( maStrm ); break; |
| case EXC_ID_SETUP: rPageSett.ReadSetup( maStrm ); break; |
| case EXC_ID8_IMGDATA: rPageSett.ReadImgData( maStrm ); break; |
| |
| case EXC_ID_MSODRAWING: GetCurrSheetDrawing().ReadMsoDrawing( maStrm ); break; |
| // #i61786# weird documents: OBJ without MSODRAWING -> read in BIFF5 format |
| case EXC_ID_OBJ: GetCurrSheetDrawing().ReadObj( maStrm ); break; |
| case EXC_ID_NOTE: GetCurrSheetDrawing().ReadNote( maStrm ); break; |
| |
| case EXC_ID_HLINK: XclImpHyperlink::ReadHlink( maStrm ); break; |
| case EXC_ID_LABELRANGES: XclImpLabelranges::ReadLabelranges( maStrm ); break; |
| |
| case EXC_ID_CONDFMT: rCondFmtMgr.ReadCondfmt( maStrm ); break; |
| case EXC_ID_CF: rCondFmtMgr.ReadCF( maStrm ); break; |
| |
| case EXC_ID_DVAL: XclImpValidation::ReadDval( maStrm ); break; |
| case EXC_ID_DV: XclImpValidation::ReadDV( maStrm ); break; |
| |
| case EXC_ID_QSI: rWQBfr.ReadQsi( maStrm ); break; |
| case EXC_ID_WQSTRING: rWQBfr.ReadWqstring( maStrm ); break; |
| case EXC_ID_PQRY: rWQBfr.ReadParamqry( maStrm ); break; |
| case EXC_ID_WQSETT: rWQBfr.ReadWqsettings( maStrm ); break; |
| case EXC_ID_WQTABLES: rWQBfr.ReadWqtables( maStrm ); break; |
| |
| case EXC_ID_SXVIEW: rPTableMgr.ReadSxview( maStrm ); break; |
| case EXC_ID_SXVD: rPTableMgr.ReadSxvd( maStrm ); break; |
| case EXC_ID_SXVI: rPTableMgr.ReadSxvi( maStrm ); break; |
| case EXC_ID_SXIVD: rPTableMgr.ReadSxivd( maStrm ); break; |
| case EXC_ID_SXPI: rPTableMgr.ReadSxpi( maStrm ); break; |
| case EXC_ID_SXDI: rPTableMgr.ReadSxdi( maStrm ); break; |
| case EXC_ID_SXVDEX: rPTableMgr.ReadSxvdex( maStrm ); break; |
| case EXC_ID_SXEX: rPTableMgr.ReadSxex( maStrm ); break; |
| case EXC_ID_SHEETEXT: rTabViewSett.ReadTabBgColor( maStrm, rPal ); break; |
| case EXC_ID_SXVIEWEX9: rPTableMgr.ReadSxViewEx9( maStrm ); break; |
| } |
| } |
| break; |
| |
| // ---------------------------------------------------------------- |
| default:; |
| } |
| } |
| |
| if( eLastErr == eERR_OK ) |
| { |
| // #i45843# Convert pivot tables before calculation, so they are available |
| // for the GETPIVOTDATA function. |
| if( GetBiff() == EXC_BIFF8 ) |
| // GetPivotTableManager().ConvertPivotTables(); |
| { |
| SCTAB nTabCount = GetDoc().GetTableCount(); |
| |
| GetPivotTableManager().ConvertPivotTables( maStrm ); |
| |
| for( SCTAB nDummyTab = GetDoc().GetTableCount() - 1; nDummyTab >= nTabCount; nDummyTab-- ) |
| GetDoc().DeleteTab( nDummyTab ); |
| } |
| pProgress.reset(); |
| |
| if (pD->IsAdjustHeightEnabled()) |
| AdjustRowHeight(); |
| |
| PostDocLoad(); |
| |
| pD->CalcAfterLoad(); |
| |
| // import change tracking data |
| XclImpChangeTrack aImpChTr( GetRoot(), maStrm ); |
| aImpChTr.Apply(); |
| |
| const XclImpAddressConverter& rAddrConv = GetAddressConverter(); |
| if( rAddrConv.IsTabTruncated() ) |
| eLastErr = SCWARN_IMPORT_SHEET_OVERFLOW; |
| else if( bTabTruncated || rAddrConv.IsRowTruncated() ) |
| eLastErr = SCWARN_IMPORT_ROW_OVERFLOW; |
| else if( rAddrConv.IsColTruncated() ) |
| eLastErr = SCWARN_IMPORT_COLUMN_OVERFLOW; |
| |
| // Refreshing pivot tables moves to the end of converting every table |
| // if( GetBiff() == EXC_BIFF8 ) |
| // GetPivotTableManager().MaybeRefreshPivotTables(); |
| } |
| |
| return eLastErr; |
| } |
| |
| //___________________________________________________________________ |
| |