summaryrefslogtreecommitdiff
path: root/oox/source/xls/workbookfragment.cxx
diff options
context:
space:
mode:
authorDaniel Rentz <dr@openoffice.org>2010-04-14 17:31:33 +0200
committerDaniel Rentz <dr@openoffice.org>2010-04-14 17:31:33 +0200
commit319c08647f115aaba7f5633376531cbfb4746b2f (patch)
treeab588184dfebf4be0f369015c5c1434277f476f2 /oox/source/xls/workbookfragment.cxx
parent62895872c7f5635b890d150dc6c2d8d4c58917e9 (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.cxx73
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();