diff options
author | Daniel Rentz <dr@openoffice.org> | 2010-04-14 17:31:33 +0200 |
---|---|---|
committer | Daniel Rentz <dr@openoffice.org> | 2010-04-14 17:31:33 +0200 |
commit | 319c08647f115aaba7f5633376531cbfb4746b2f (patch) | |
tree | ab588184dfebf4be0f369015c5c1434277f476f2 /oox/source/xls/workbookfragment.cxx | |
parent | 62895872c7f5635b890d150dc6c2d8d4c58917e9 (diff) |
npower13_objectmodules: make vba import available in oox filters
Diffstat (limited to 'oox/source/xls/workbookfragment.cxx')
-rw-r--r-- | oox/source/xls/workbookfragment.cxx | 73 |
1 files changed, 52 insertions, 21 deletions
diff --git a/oox/source/xls/workbookfragment.cxx b/oox/source/xls/workbookfragment.cxx index e61820a2e620..b5eb9a11dd2c 100644 --- a/oox/source/xls/workbookfragment.cxx +++ b/oox/source/xls/workbookfragment.cxx @@ -31,10 +31,13 @@ #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" #include "oox/xls/connectionsfragment.hxx" +#include "oox/xls/excelvbaproject.hxx" #include "oox/xls/externallinkbuffer.hxx" #include "oox/xls/externallinkfragment.hxx" #include "oox/xls/pivotcachebuffer.hxx" @@ -53,6 +56,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 +289,24 @@ 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(); } + // import the VBA project (after loading the sheets, as they have imported the code names) + OUString aVbaFragmentPath = getFragmentPathFromFirstType( CREATE_MSOFFICE_RELATIONSTYPE( "vbaProject" ) ); + if( aVbaFragmentPath.getLength() > 0 ) + { + Reference< XInputStream > xInStrm = getBaseFilter().openInputStream( aVbaFragmentPath ); + if( xInStrm.is() ) + { + ::oox::ole::OleStorage aVbaStrg( getGlobalFactory(), xInStrm, false ); + getVbaProject().importVbaProject( aVbaStrg, getBaseFilter().getGraphicHelper() ); + } + } + // final conversions, e.g. calculation settings and view settings finalizeWorkbookImport(); } @@ -344,7 +360,8 @@ void OoxWorkbookFragment::importPivotCacheDefFragment( const OUString& rRelId, s // ============================================================================ BiffWorkbookFragment::BiffWorkbookFragment( const WorkbookHelper& rHelper, const OUString& rStrmName ) : - BiffWorkbookFragmentBase( rHelper, rStrmName ) + BiffWorkbookFragmentBase( rHelper, rStrmName ), + mbImportVbaProject( false ) { } @@ -372,6 +389,13 @@ bool BiffWorkbookFragment::importFragment() sal_Int16 nCalcSheet = rWorksheets.getCalcSheetIndex( nWorksheet ); bNextSheet = importSheetFragment( *xSheetProgress, eSheetFragment, nCalcSheet ); } + // import the VBA project (after loading the sheets, as they have imported the code names) + if( mbImportVbaProject ) + { + StorageRef xVbaStrg = getBaseFilter().openSubStorage( CREATE_OUSTRING( "_VBA_PROJECT_CUR" ), false ); + if( xVbaStrg.get() ) + getVbaProject().importVbaProject( *xVbaStrg, getBaseFilter().getGraphicHelper() ); + } } break; @@ -462,6 +486,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 +588,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 +646,9 @@ bool BiffWorkbookFragment::importGlobalsFragment( ISegmentProgressBar& rProgress bRet = mrStrm.startRecordByHandle( nEofHandle ); } + // import the VBA project + mbImportVbaProject = bHasVbaProject && !bEmptyVbaProject; + // #i56376# missing EOF - rewind before worksheet BOF record (see above) if( bRet && isBofRecord() ) mrStrm.rewindRecord(); |