diff options
Diffstat (limited to 'oox/source/xls/workbookfragment.cxx')
-rw-r--r-- | oox/source/xls/workbookfragment.cxx | 60 |
1 files changed, 40 insertions, 20 deletions
diff --git a/oox/source/xls/workbookfragment.cxx b/oox/source/xls/workbookfragment.cxx index e61820a2e620..d64abf268008 100644 --- a/oox/source/xls/workbookfragment.cxx +++ b/oox/source/xls/workbookfragment.cxx @@ -31,6 +31,8 @@ #include "oox/helper/progressbar.hxx" #include "oox/helper/propertyset.hxx" #include "oox/helper/recordinputstream.hxx" +#include "oox/ole/olestorage.hxx" +#include "oox/core/filterbase.hxx" #include "oox/drawingml/themefragmenthandler.hxx" #include "oox/xls/biffinputstream.hxx" #include "oox/xls/chartsheetfragment.hxx" @@ -53,6 +55,8 @@ using ::com::sun::star::uno::Reference; using ::com::sun::star::uno::Exception; using ::com::sun::star::uno::UNO_QUERY; using ::com::sun::star::uno::UNO_QUERY_THROW; +using ::com::sun::star::uno::UNO_SET_THROW; +using ::com::sun::star::io::XInputStream; using ::com::sun::star::table::CellAddress; using ::oox::core::ContextHandlerRef; using ::oox::core::FragmentHandlerRef; @@ -284,13 +288,21 @@ void OoxWorkbookFragment::finalizeImport() // load all worksheets for( SheetFragmentVector::iterator aIt = aSheetFragments.begin(), aEnd = aSheetFragments.end(); aIt != aEnd; ++aIt ) { - OOX_LOADSAVE_TIMER( IMPORTSHEETFRAGMENT ); // import the sheet fragment importOoxFragment( *aIt ); // delete fragment object, will free all allocated sheet buffers aIt->clear(); } + // open the VBA project storage + OUString aVbaFragmentPath = getFragmentPathFromFirstType( CREATE_MSOFFICE_RELATIONSTYPE( "vbaProject" ) ); + if( aVbaFragmentPath.getLength() > 0 ) + { + Reference< XInputStream > xInStrm = getBaseFilter().openInputStream( aVbaFragmentPath ); + if( xInStrm.is() ) + setVbaProjectStorage( StorageRef( new ::oox::ole::OleStorage( getGlobalFactory(), xInStrm, false ) ) ); + } + // final conversions, e.g. calculation settings and view settings finalizeWorkbookImport(); } @@ -462,6 +474,8 @@ bool BiffWorkbookFragment::importGlobalsFragment( ISegmentProgressBar& rProgress StylesBuffer& rStyles = getStyles(); WorksheetBuffer& rWorksheets = getWorksheets(); PivotCacheBuffer& rPivotCaches = getPivotCaches(); + bool bHasVbaProject = false; + bool bEmptyVbaProject = false; // collect records that need to be loaded in a second pass typedef ::std::vector< sal_Int64 > RecordHandleVec; @@ -562,25 +576,27 @@ bool BiffWorkbookFragment::importGlobalsFragment( ISegmentProgressBar& rProgress case BIFF8: switch( nRecId ) { - case BIFF_ID_BOOKBOOL: rWorkbookSett.importBookBool( mrStrm ); break; - case BIFF_ID_CODENAME: rWorkbookSett.importCodeName( mrStrm ); break; - case BIFF_ID_CRN: bExtLinkRec = true; break; - case BIFF5_ID_DEFINEDNAME: bExtLinkRec = true; break; - case BIFF_ID_EXTERNALBOOK: bExtLinkRec = true; break; - case BIFF5_ID_EXTERNALNAME: bExtLinkRec = true; break; - case BIFF_ID_EXTERNSHEET: bExtLinkRec = true; break; - case BIFF_ID_FILESHARING: rWorkbookSett.importFileSharing( mrStrm ); break; - case BIFF5_ID_FONT: rStyles.importFont( mrStrm ); break; - case BIFF4_ID_FORMAT: rStyles.importFormat( mrStrm ); break; - case BIFF_ID_HIDEOBJ: rWorkbookSett.importHideObj( mrStrm ); break; - case BIFF_ID_PALETTE: rStyles.importPalette( mrStrm ); break; - case BIFF_ID_PIVOTCACHE: rPivotCaches.importPivotCacheRef( mrStrm ); break; - case BIFF_ID_SHEET: rWorksheets.importSheet( mrStrm ); break; - case BIFF_ID_SST: rSharedStrings.importSst( mrStrm ); break; - case BIFF_ID_STYLE: rStyles.importStyle( mrStrm ); break; - case BIFF_ID_USESELFS: rWorkbookSett.importUsesElfs( mrStrm ); break; - case BIFF_ID_XCT: bExtLinkRec = true; break; - case BIFF5_ID_XF: rStyles.importXf( mrStrm ); break; + case BIFF_ID_BOOKBOOL: rWorkbookSett.importBookBool( mrStrm ); break; + case BIFF_ID_CODENAME: rWorkbookSett.importCodeName( mrStrm ); break; + case BIFF_ID_CRN: bExtLinkRec = true; break; + case BIFF5_ID_DEFINEDNAME: bExtLinkRec = true; break; + case BIFF_ID_EXTERNALBOOK: bExtLinkRec = true; break; + case BIFF5_ID_EXTERNALNAME: bExtLinkRec = true; break; + case BIFF_ID_EXTERNSHEET: bExtLinkRec = true; break; + case BIFF_ID_FILESHARING: rWorkbookSett.importFileSharing( mrStrm ); break; + case BIFF5_ID_FONT: rStyles.importFont( mrStrm ); break; + case BIFF4_ID_FORMAT: rStyles.importFormat( mrStrm ); break; + case BIFF_ID_HIDEOBJ: rWorkbookSett.importHideObj( mrStrm ); break; + case BIFF_ID_VBAPROJECT: bHasVbaProject = true; break; + case BIFF_ID_VBAPROJECTEMPTY: bEmptyVbaProject = true; break; + case BIFF_ID_PALETTE: rStyles.importPalette( mrStrm ); break; + case BIFF_ID_PIVOTCACHE: rPivotCaches.importPivotCacheRef( mrStrm ); break; + case BIFF_ID_SHEET: rWorksheets.importSheet( mrStrm ); break; + case BIFF_ID_SST: rSharedStrings.importSst( mrStrm ); break; + case BIFF_ID_STYLE: rStyles.importStyle( mrStrm ); break; + case BIFF_ID_USESELFS: rWorkbookSett.importUsesElfs( mrStrm ); break; + case BIFF_ID_XCT: bExtLinkRec = true; break; + case BIFF5_ID_XF: rStyles.importXf( mrStrm ); break; } break; @@ -618,6 +634,10 @@ bool BiffWorkbookFragment::importGlobalsFragment( ISegmentProgressBar& rProgress bRet = mrStrm.startRecordByHandle( nEofHandle ); } + // open the VBA project storage + if( bHasVbaProject && !bEmptyVbaProject ) + setVbaProjectStorage( getBaseFilter().openSubStorage( CREATE_OUSTRING( "_VBA_PROJECT_CUR" ), false ) ); + // #i56376# missing EOF - rewind before worksheet BOF record (see above) if( bRet && isBofRecord() ) mrStrm.rewindRecord(); |