diff options
author | Muthu Subramanian <sumuthu@suse.com> | 2013-07-09 13:31:16 +0530 |
---|---|---|
committer | Muthu Subramanian <sumuthu@suse.com> | 2013-07-09 13:43:15 +0530 |
commit | 7da06efd74be6500895bab6e5e8ed485914ff45e (patch) | |
tree | fbce788eca9357990907977fdcf4a134b030bbaf | |
parent | 00d8a4071628a88465f13d2e860ccd87c3a85b9e (diff) |
n#819822: XLSX Chart import with internal data table.
When the import with xlsx ranges fail - try with
internal data table.
-rw-r--r-- | include/oox/core/xmlfilterbase.hxx | 3 | ||||
-rw-r--r-- | oox/source/drawingml/shape.cxx | 15 | ||||
-rw-r--r-- | sc/source/filter/inc/excelfilter.hxx | 1 | ||||
-rw-r--r-- | sc/source/filter/inc/workbookhelper.hxx | 4 | ||||
-rw-r--r-- | sc/source/filter/oox/excelfilter.cxx | 5 | ||||
-rw-r--r-- | sc/source/filter/oox/workbookhelper.cxx | 21 |
6 files changed, 45 insertions, 4 deletions
diff --git a/include/oox/core/xmlfilterbase.hxx b/include/oox/core/xmlfilterbase.hxx index 4b5c1e093657..5bddea46e594 100644 --- a/include/oox/core/xmlfilterbase.hxx +++ b/include/oox/core/xmlfilterbase.hxx @@ -90,6 +90,9 @@ public: converter object, that should be global per imported document. */ virtual ::oox::drawingml::chart::ChartConverter* getChartConverter() = 0; + /** Helper to switch chart data table - specifically for xlsx imports */ + virtual void useInternalChartDataTable( bool /*bInternal*/ ) { } + /** Has to be implemented by each filter to return the table style list. */ virtual const ::oox::drawingml::table::TableStyleListPtr getTableStyles() = 0; diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx index 0d3a2868dd3e..96a67d6547fa 100644 --- a/oox/source/drawingml/shape.cxx +++ b/oox/source/drawingml/shape.cxx @@ -52,6 +52,7 @@ #include <basegfx/polygon/b2dpolygon.hxx> #include <basegfx/matrix/b2dhommatrix.hxx> #include <com/sun/star/document/XActionLockable.hpp> +#include <com/sun/star/chart2/data/XDataReceiver.hpp> using namespace ::oox::core; using namespace ::com::sun::star; @@ -711,7 +712,21 @@ void Shape::finalizeXShape( XmlFilterBase& rFilter, const Reference< XShapes >& if( !mxChartShapeInfo->mbEmbedShapes ) xExternalPage = rxShapes; if( rFilter.getChartConverter() ) + { rFilter.getChartConverter()->convertFromModel( rFilter, aModel, xChartDoc, xExternalPage, mxShape->getPosition(), mxShape->getSize() ); + if( !xChartDoc->hasInternalDataProvider() ) + { + Reference< chart2::data::XDataReceiver > xDataRec( xChartDoc, UNO_QUERY ); + Reference< chart2::data::XDataSource > xData( xDataRec->getUsedData(), UNO_QUERY ); + if( xData->getDataSequences()[0]->getValues()->getData().getLength() <= 0 ) + { + rFilter.useInternalChartDataTable( true ); + rFilter.getChartConverter()->convertFromModel( rFilter, aModel, xChartDoc, xExternalPage, mxShape->getPosition(), mxShape->getSize() ); + rFilter.useInternalChartDataTable( false ); + } + } + + } } catch( Exception& ) { diff --git a/sc/source/filter/inc/excelfilter.hxx b/sc/source/filter/inc/excelfilter.hxx index 5aa33104b6e0..c368792fbb19 100644 --- a/sc/source/filter/inc/excelfilter.hxx +++ b/sc/source/filter/inc/excelfilter.hxx @@ -48,6 +48,7 @@ public: virtual ::oox::vml::Drawing* getVmlDrawing(); virtual const ::oox::drawingml::table::TableStyleListPtr getTableStyles(); virtual ::oox::drawingml::chart::ChartConverter* getChartConverter(); + virtual void useInternalChartDataTable( bool bInternal ); virtual sal_Bool SAL_CALL filter( const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& rDescriptor ) throw( ::com::sun::star::uno::RuntimeException ); diff --git a/sc/source/filter/inc/workbookhelper.hxx b/sc/source/filter/inc/workbookhelper.hxx index fa1ce19529b6..f4ce1cc1e37c 100644 --- a/sc/source/filter/inc/workbookhelper.hxx +++ b/sc/source/filter/inc/workbookhelper.hxx @@ -23,6 +23,7 @@ #include <boost/shared_ptr.hpp> #include <rtl/ref.hxx> #include "oox/helper/storagebase.hxx" +#include "oox/drawingml/chart/chartconverter.hxx" #include "biffhelper.hxx" #include "rangenam.hxx" @@ -144,6 +145,7 @@ public: void setCurrentSheetIndex( sal_Int16 nSheet ); /** Final conversion after importing the workbook. */ void finalizeWorkbookImport(); + void useInternalChartDataTable( bool bInternal ); // document model --------------------------------------------------------- ScDocument& getScDocument() const; @@ -248,7 +250,7 @@ public: /** Returns the converter for string to cell address/range conversion. */ AddressConverter& getAddressConverter() const; /** Returns the chart object converter. */ - ExcelChartConverter* getChartConverter() const; + oox::drawingml::chart::ChartConverter* getChartConverter() const; /** Returns the page and print settings converter. */ PageSettingsConverter& getPageSettingsConverter() const; diff --git a/sc/source/filter/oox/excelfilter.cxx b/sc/source/filter/oox/excelfilter.cxx index 1c74d360fb34..dc6fadb849ff 100644 --- a/sc/source/filter/oox/excelfilter.cxx +++ b/sc/source/filter/oox/excelfilter.cxx @@ -149,6 +149,11 @@ const TableStyleListPtr ExcelFilter::getTableStyles() return WorkbookHelper( getWorkbookGlobals() ).getChartConverter(); } +void ExcelFilter::useInternalChartDataTable( bool bInternal ) +{ + return WorkbookHelper( getWorkbookGlobals() ).useInternalChartDataTable( bInternal ); +} + GraphicHelper* ExcelFilter::implCreateGraphicHelper() const { return new ExcelGraphicHelper( getWorkbookGlobals() ); diff --git a/sc/source/filter/oox/workbookhelper.cxx b/sc/source/filter/oox/workbookhelper.cxx index 5e9b39f16d1c..37d5191e3a93 100644 --- a/sc/source/filter/oox/workbookhelper.cxx +++ b/sc/source/filter/oox/workbookhelper.cxx @@ -178,6 +178,8 @@ public: Reference< XDatabaseRange > createUnnamedDatabaseRangeObject( const CellRangeAddress& rRangeAddr ) const; /** Creates and returns a com.sun.star.style.Style object for cells or pages. */ Reference< XStyle > createStyleObject( OUString& orStyleName, bool bPageStyle ) const; + /** Helper to switch chart data table - specifically for xlsx imports */ + void useInternalChartDataTable( bool bInternal ); // buffers ---------------------------------------------------------------- @@ -218,7 +220,7 @@ public: /** Returns the converter for string to cell address/range conversion. */ inline AddressConverter& getAddressConverter() const { return *mxAddrConverter; } /** Returns the chart object converter. */ - inline ExcelChartConverter* getChartConverter() const { return mxChartConverter.get(); } + inline oox::drawingml::chart::ChartConverter* getChartConverter() const { return mxChartConverter.get(); } /** Returns the page/print settings converter. */ inline PageSettingsConverter& getPageSettingsConverter() const { return *mxPageSettConverter; } @@ -262,7 +264,7 @@ private: typedef ::std::auto_ptr< FormulaParser > FormulaParserPtr; typedef ::std::auto_ptr< UnitConverter > UnitConvPtr; typedef ::std::auto_ptr< AddressConverter > AddressConvPtr; - typedef ::std::auto_ptr< ExcelChartConverter > ExcelChartConvPtr; + typedef ::std::auto_ptr< oox::drawingml::chart::ChartConverter > ExcelChartConvPtr; typedef ::std::auto_ptr< PageSettingsConverter > PageSettConvPtr; typedef ::std::auto_ptr< BiffCodecHelper > BiffCodecHelperPtr; @@ -506,6 +508,14 @@ Reference< XStyle > WorkbookGlobals::createStyleObject( OUString& orStyleName, b return xStyle; } +void WorkbookGlobals::useInternalChartDataTable( bool bInternal ) +{ + if( bInternal ) + mxChartConverter.reset( new oox::drawingml::chart::ChartConverter() ); + else + mxChartConverter.reset( new ExcelChartConverter( *this ) ); +} + // BIFF specific -------------------------------------------------------------- // private -------------------------------------------------------------------- @@ -896,11 +906,16 @@ AddressConverter& WorkbookHelper::getAddressConverter() const return mrBookGlob.getAddressConverter(); } -ExcelChartConverter* WorkbookHelper::getChartConverter() const +oox::drawingml::chart::ChartConverter* WorkbookHelper::getChartConverter() const { return mrBookGlob.getChartConverter(); } +void WorkbookHelper::useInternalChartDataTable( bool bInternal ) +{ + mrBookGlob.useInternalChartDataTable( bInternal ); +} + PageSettingsConverter& WorkbookHelper::getPageSettingsConverter() const { return mrBookGlob.getPageSettingsConverter(); |