diff options
-rw-r--r-- | xmloff/source/chart/SchXMLChartContext.cxx | 4 | ||||
-rw-r--r-- | xmloff/source/chart/SchXMLTableContext.cxx | 34 | ||||
-rw-r--r-- | xmloff/source/chart/SchXMLTableContext.hxx | 5 |
3 files changed, 37 insertions, 6 deletions
diff --git a/xmloff/source/chart/SchXMLChartContext.cxx b/xmloff/source/chart/SchXMLChartContext.cxx index 8c6aff2c04b0..f45b21056bcf 100644 --- a/xmloff/source/chart/SchXMLChartContext.cxx +++ b/xmloff/source/chart/SchXMLChartContext.cxx @@ -788,7 +788,7 @@ void SchXMLChartContext::EndElement() //own data or only rectangular range available if( xNewDoc->hasInternalDataProvider() ) - SchXMLTableHelper::applyTableToInternalDataProvider( maTable, xNewDoc ); + SchXMLTableHelper::applyTableToInternalDataProvider( maTable, xNewDoc, meDataRowSource ); bool bOlderThan2_3 = SchXMLTools::isDocumentGeneratedWithOpenOfficeOlderThan2_3( Reference< frame::XModel >( xNewDoc, uno::UNO_QUERY )); bool bOldFileWithOwnDataFromRows = (bOlderThan2_3 && bHasOwnData && (meDataRowSource==chart::ChartDataRowSource_ROWS)); // in this case there are range addresses that are simply wrong. @@ -825,7 +825,7 @@ void SchXMLChartContext::EndElement() if( !xNewDoc->hasInternalDataProvider() ) { xNewDoc->createInternalDataProvider( sal_False /* bCloneExistingData */ ); - SchXMLTableHelper::applyTableToInternalDataProvider( maTable, xNewDoc ); + SchXMLTableHelper::applyTableToInternalDataProvider( maTable, xNewDoc, meDataRowSource ); try { lcl_ApplyDataFromRectangularRangeToDiagram( xNewDoc, msChartAddress, meDataRowSource, mbRowHasLabels, mbColHasLabels, bHasOwnData, msColTrans, msRowTrans ); diff --git a/xmloff/source/chart/SchXMLTableContext.cxx b/xmloff/source/chart/SchXMLTableContext.cxx index 4834767fe1b0..7ffce593bdda 100644 --- a/xmloff/source/chart/SchXMLTableContext.cxx +++ b/xmloff/source/chart/SchXMLTableContext.cxx @@ -59,6 +59,7 @@ using ::com::sun::star::uno::Reference; #if DEBUG_CHART_FILTER #include <iostream> +#endif namespace { @@ -858,9 +859,35 @@ static void lcl_ApplyCellToComplexLabel( const SchXMLCell& rCell, Sequence< uno: } } +namespace { + +void transposeTable(SchXMLTable& rTable) +{ + std::vector<std::vector<SchXMLCell> > aNewData; + sal_Int32 nRows = rTable.aData.size(); + aNewData.resize(rTable.nMaxColumnIndex+1); + for(sal_Int32 i = 0; i < nRows; ++i) + { + sal_Int32 nCols = rTable.aData[i].size(); + for(sal_Int32 j = 0; j < nCols; ++j) + { + SchXMLCell& rCell = rTable.aData[i][j]; + aNewData[j].push_back(rCell); + } + } + bool bHasRowHeader = rTable.bHasHeaderRow; + bool bHasColHeader = rTable.bHasHeaderColumn; + rTable.bHasHeaderColumn = bHasRowHeader; + rTable.bHasHeaderRow = bHasColHeader; + rTable.nMaxColumnIndex = nRows; + rTable.aData = aNewData; +} + +} + void SchXMLTableHelper::applyTableToInternalDataProvider( - const SchXMLTable& rTable, - uno::Reference< chart2::XChartDocument > xChartDoc ) + SchXMLTable rTable, + uno::Reference< chart2::XChartDocument > xChartDoc, chart::ChartDataRowSource eDataRowSource ) { // apply all data read from the local table to the internal data provider if( !xChartDoc.is() || !xChartDoc->hasInternalDataProvider() ) @@ -869,6 +896,9 @@ void SchXMLTableHelper::applyTableToInternalDataProvider( if( !xDataProv.is() ) return; + if(eDataRowSource == chart::ChartDataRowSource_ROWS) + transposeTable(rTable); + //prepare the read local table data sal_Int32 nNumRows( static_cast< sal_Int32 >( rTable.aData.size())); sal_Int32 nRowOffset = 0; diff --git a/xmloff/source/chart/SchXMLTableContext.hxx b/xmloff/source/chart/SchXMLTableContext.hxx index 20b87b563fad..864fa4e07059 100644 --- a/xmloff/source/chart/SchXMLTableContext.hxx +++ b/xmloff/source/chart/SchXMLTableContext.hxx @@ -77,8 +77,9 @@ private: sal_Int32& nRows, sal_Int32& nColumns ); public: - static void applyTableToInternalDataProvider( const SchXMLTable& rTable, - com::sun::star::uno::Reference< com::sun::star::chart2::XChartDocument > xChartDoc ); + static void applyTableToInternalDataProvider( SchXMLTable rTable, + com::sun::star::uno::Reference< com::sun::star::chart2::XChartDocument > xChartDoc, + com::sun::star::chart::ChartDataRowSource eDataRowSource ); /** This function reorders local data to fit the correct data structure. Call it after the data series got their styles set. |