30 #include <rtl/math.hxx>
36 #include <com/sun/star/chart2/XAnyDescriptionAccess.hpp>
37 #include <com/sun/star/chart2/XDataSeriesContainer.hpp>
38 #include <com/sun/star/chart2/XChartDocument.hpp>
39 #include <com/sun/star/chart2/XChartTypeContainer.hpp>
40 #include <com/sun/star/chart2/XInternalDataProvider.hpp>
41 #include <com/sun/star/beans/XPropertySet.hpp>
43 #include <com/sun/star/chart2/XCoordinateSystemContainer.hpp>
48 #include <string_view>
52 using ::com::sun::star::uno::Sequence;
53 using ::com::sun::star::uno::Reference;
58 constexpr OUStringLiteral aCategoriesRange =
u"categories";
60 typedef ::std::multimap< OUString, OUString >
61 lcl_tOriginalRangeToInternalRangeMap;
63 struct lcl_ApplyCellToData
65 explicit lcl_ApplyCellToData( Sequence< double > & rOutData ) :
71 ::rtl::math::setNan( &m_fNaN );
76 if( m_nIndex < m_nSize )
86 sal_Int32 getCurrentIndex()
const
98 void lcl_fillRangeMapping(
100 lcl_tOriginalRangeToInternalRangeMap & rOutRangeMap,
101 chart::ChartDataRowSource eDataRowSource )
106 const OUString lcl_aCategoriesRange(aCategoriesRange);
107 static const OUStringLiteral lcl_aLabelPrefix(u
"label ");
110 const size_t nTableRowCount( rTable.
aData.size());
111 for(
size_t nRow = 0; nRow < nTableRowCount; ++nRow )
113 const ::std::vector< SchXMLCell > & rRow( rTable.
aData[nRow] );
114 const size_t nTableColCount( rRow.size());
115 for(
size_t nCol = 0; nCol < nTableColCount; ++nCol )
117 const OUString aRangeId( rRow[nCol].aRangeId );
118 if( !aRangeId.isEmpty())
120 if( eDataRowSource == chart::ChartDataRowSource_COLUMNS )
124 SAL_WARN_IF( static_cast< sal_Int32 >( nRow ) != nRowOffset,
"xmloff.chart",
"nRow != nRowOffset" );
125 rOutRangeMap.emplace(aRangeId, lcl_aCategoriesRange);
129 OUString aColNumStr = OUString::number( nCol - nColOffset);
131 rOutRangeMap.emplace( aRangeId, lcl_aLabelPrefix + aColNumStr );
133 rOutRangeMap.emplace( aRangeId, aColNumStr );
140 SAL_WARN_IF( static_cast< sal_Int32 >( nCol ) != nColOffset,
"xmloff.chart",
"nCol != nColOffset" );
141 rOutRangeMap.emplace( aRangeId, lcl_aCategoriesRange );
145 OUString aRowNumStr = OUString::number( nRow - nRowOffset);
147 rOutRangeMap.emplace( aRangeId, lcl_aLabelPrefix + aRowNumStr );
149 rOutRangeMap.emplace( aRangeId, aRowNumStr );
157 Reference< chart2::data::XDataSequence >
158 lcl_reassignDataSequence(
159 const Reference< chart2::data::XDataSequence > & xSequence,
160 const Reference< chart2::data::XDataProvider > & xDataProvider,
161 lcl_tOriginalRangeToInternalRangeMap & rRangeMap,
162 const OUString & rRange )
164 Reference< chart2::data::XDataSequence > xResult( xSequence );
165 lcl_tOriginalRangeToInternalRangeMap::iterator aIt( rRangeMap.find( rRange ));
166 if( aIt != rRangeMap.end())
169 xResult.set( xDataProvider->createDataSequenceByRangeRepresentation( aIt->second ));
171 rRangeMap.erase( aIt );
177 bool lcl_mapContainsRange(
178 lcl_tOriginalRangeToInternalRangeMap & rRangeMap,
179 const OUString & rRange )
181 lcl_tOriginalRangeToInternalRangeMap::iterator aIt( rRangeMap.find( rRange ));
182 return ( aIt != rRangeMap.end());
185 bool lcl_tableOfRangeMatches(
186 const OUString & rRange,
187 std::u16string_view rTableName )
190 return ( !rRange.isEmpty() &&
191 !rTableName.empty() &&
192 (rRange.indexOf( rTableName ) != -1 ));
202 mbHasRowPermutation( false ),
203 mbHasColumnPermutation( false )
217 const css::uno::Reference< css::xml::sax::XFastAttributeList >& )
252 const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
258 switch(aIter.getToken())
281 SAL_WARN_IF( aPermutation.empty(),
"xmloff.chart",
"aPermutation is NULL");
282 if( aPermutation.empty())
288 bool bModified =
false;
289 ::std::vector< SchXMLCell > aModifiedRow;
290 const size_t nPermSize = aPermutation.size();
291 SAL_WARN_IF( static_cast< sal_Int32 >( nPermSize ) - 1 != *(::std::max_element( aPermutation.begin(), aPermutation.end())),
"xmloff.chart",
"nPermSize - 1 != *(::std::max_element( aPermutation.begin(), aPermutation.end())");
292 const size_t nRowSize = rRow.size();
293 const size_t nDestSize = ::std::min( nPermSize, nRowSize );
294 for(
size_t nDestinationIndex = 0; nDestinationIndex < nDestSize; ++nDestinationIndex )
296 const size_t nSourceIndex =
static_cast< size_t >( aPermutation[ nDestinationIndex ] );
297 if( nSourceIndex != nDestinationIndex &&
298 nSourceIndex < nRowSize )
303 SAL_WARN_IF( !aModifiedRow.empty(),
"xmloff.chart",
"aModifiedRow is NOT NULL");
304 aModifiedRow.insert( aModifiedRow.end(), rRow.begin(), rRow.end() );
305 SAL_WARN_IF( aModifiedRow.empty(),
"xmloff.chart",
"aModifiedRow is NULL");
307 SAL_WARN_IF( nDestinationIndex >= aModifiedRow.size(),
"xmloff.chart",
"nDestinationIndex >= aModifiedRow.size()");
308 aModifiedRow[ nDestinationIndex ] = rRow[ nSourceIndex ];
314 ::std::copy( aModifiedRow.begin(), aModifiedRow.end(), rRow.begin());
320 SAL_WARN_IF( aPermutation.empty(),
"xmloff.chart",
"aPermutation is NULL");
321 if( aPermutation.empty())
324 bool bModified =
false;
325 const size_t nPermSize = aPermutation.size();
326 SAL_WARN_IF( static_cast< sal_Int32 >( nPermSize ) - 1 != *(::std::max_element( aPermutation.begin(), aPermutation.end())),
"xmloff.chart",
"nPermSize - 1 != *(::std::max_element( aPermutation.begin(), aPermutation.end())");
328 const size_t nDestSize = ::std::min( nPermSize, nTableRowCount );
329 ::std::vector< ::std::vector< SchXMLCell > > aDestination;
330 for(
size_t nDestinationIndex = 0; nDestinationIndex < nDestSize; ++nDestinationIndex )
332 const size_t nSourceIndex =
static_cast< size_t >( aPermutation[ nDestinationIndex ] );
333 if( nSourceIndex != nDestinationIndex &&
334 nSourceIndex < nTableRowCount )
339 SAL_WARN_IF( !aDestination.empty(),
"xmloff.chart",
"aDestination is NOT NULL");
341 SAL_WARN_IF( aDestination.empty(),
"xmloff.chart",
"aDestination is NULL");
343 SAL_WARN_IF( nDestinationIndex >= aDestination.size(),
"xmloff.chart",
"nDestinationIndex >= aDestination.size()");
344 aDestination[ nDestinationIndex ] =
mrTable.
aData[ nSourceIndex ];
351 ::std::copy( aDestination.begin(), aDestination.end(),
mrTable.
aData.begin());
396 const css::uno::Reference< css::xml::sax::XFastAttributeList >& )
418 const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
421 sal_Int32 nRepeated = 1;
422 bool bHidden =
false;
426 switch(aIter.getToken())
430 if( !aIter.isEmpty())
431 nRepeated = aIter.toInt32();
436 OUString aVisibility = aIter.toString();
446 sal_Int32 nNewCount = nOldCount + nRepeated;
453 for( sal_Int32 nN = nOldCount; nN<nNewCount; nN++ )
455 sal_Int32 nHiddenColumnIndex = nN-nColOffset;
456 if( nHiddenColumnIndex>=0 )
482 const css::uno::Reference< css::xml::sax::XFastAttributeList >& )
504 std::vector< SchXMLCell > aNewRow;
516 const css::uno::Reference< css::xml::sax::XFastAttributeList >& )
544 OUString& mrRangeString;
545 OUStringBuffer maRangeStringBuffer;
549 OUString& rRangeString );
553 const css::uno::Reference< css::xml::sax::XFastAttributeList >& AttrList )
override;
554 virtual void SAL_CALL
endFastElement(sal_Int32 nElement)
override;
575 const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList)
577 OUString aCellContent;
582 switch(aIter.getToken())
592 aCellContent = aIter.toString();
602 aCell.
eType = eValueType;
623 const css::uno::Reference< css::xml::sax::XFastAttributeList >& )
667 rComplexLabel.realloc(1);
668 rComplexLabel[0] <<= rCell.
aString;
673 rComplexLabel.realloc( nCount );
674 for( sal_Int32 nN=0; nN<nCount; nN++)
679 rComplexLabel.realloc(1);
680 rComplexLabel[0] <<= rCell.
fValue;
686 const uno::Reference< chart2::XChartDocument >& xChartDoc )
689 if( !xChartDoc.is() || !xChartDoc->hasInternalDataProvider() )
691 Reference< chart2::data::XDataProvider > xDataProv( xChartDoc->getDataProvider() );
692 if( !xDataProv.is() )
696 sal_Int32 nNumRows( static_cast< sal_Int32 >( rTable.
aData.size()));
697 sal_Int32 nRowOffset = 0;
704 sal_Int32 nColOffset = 0;
711 Sequence< Sequence< double > > aDataInRows( nNumRows );
712 Sequence< Sequence< uno::Any > > aComplexRowDescriptions( nNumRows );
713 Sequence< Sequence< uno::Any > > aComplexColumnDescriptions( nNumColumns );
714 for( sal_Int32
i=0;
i<nNumRows; ++
i )
715 aDataInRows[
i].realloc( nNumColumns );
717 if( !rTable.
aData.empty() )
722 const ::std::vector< SchXMLCell >& rFirstRow = rTable.
aData.front();
723 const sal_Int32 nColumnLabelsSize = aComplexColumnDescriptions.getLength();
724 const sal_Int32 nMax = ::std::min< sal_Int32 >( nColumnLabelsSize,
static_cast< sal_Int32
>( rFirstRow.size()) - nColOffset );
725 SAL_WARN_IF( nMax != nColumnLabelsSize,
"xmloff.chart",
"nMax != nColumnLabelsSize");
726 for( sal_Int32
i=0;
i<nMax; ++
i )
730 std::vector< ::std::vector< SchXMLCell > >::const_iterator aRowIter( rTable.
aData.begin() + nRowOffset );
731 std::vector< ::std::vector< SchXMLCell > >::const_iterator aEnd( rTable.
aData.end() );
732 for( sal_Int32 nRow = 0; aRowIter != aEnd && nRow < nNumRows; ++aRowIter, ++nRow )
734 const ::std::vector< SchXMLCell >& rRow = *aRowIter;
742 Sequence< double >& rTargetRow = aDataInRows[nRow];
743 lcl_ApplyCellToData aApplyCellToData = ::std::for_each( rRow.begin() + nColOffset, rRow.end(), lcl_ApplyCellToData( rTargetRow ) );
745 ::rtl::math::setNan( &fNaN );
746 for( sal_Int32 nCurrentIndex = aApplyCellToData.getCurrentIndex(); nCurrentIndex<nNumColumns; nCurrentIndex++ )
747 rTargetRow[nCurrentIndex] = fNaN;
753 Reference< chart2::XAnyDescriptionAccess > xDataAccess( xDataProv, uno::UNO_QUERY );
754 if( !xDataAccess.is() )
757 xDataAccess->setData( aDataInRows );
759 xDataAccess->setAnyRowDescriptions( aComplexRowDescriptions );
761 xDataAccess->setAnyColumnDescriptions( aComplexColumnDescriptions );
768 xProps->setPropertyValue(
"DisableDataTableDialog", uno::makeAny(
true ) );
769 xProps->setPropertyValue(
"DisableComplexChartTypes", uno::makeAny(
true ) );
771 catch ( uno::Exception& )
780 const uno::Reference< chart2::XChartDocument >& xChartDoc,
781 chart::ChartDataRowSource eDataRowSource )
783 if( ! (xChartDoc.is() && xChartDoc->hasInternalDataProvider()))
793 Reference< chart2::data::XDataProvider > xDataProv( xChartDoc->getDataProvider());
796 lcl_tOriginalRangeToInternalRangeMap aRangeMap;
798 lcl_fillRangeMapping( rTable, aRangeMap, eDataRowSource );
800 const OUString lcl_aCategoriesRange(aCategoriesRange);
802 bool bCategoriesApplied =
false;
804 for(
const auto& rLSeq : rLSequencesPerIndex )
806 if( rLSeq.second.is())
812 Reference< chart2::data::XDataSequence > xSeq( rLSeq.second->getValues());
817 lcl_mapContainsRange( aRangeMap, aRange ))
819 Reference< chart2::data::XDataSequence > xNewSeq(
820 lcl_reassignDataSequence( xSeq, xDataProv, aRangeMap, aRange ));
821 if( xNewSeq != xSeq )
825 rLSeq.second->setValues( xNewSeq );
833 bCategoriesApplied =
true;
840 Reference< chart2::data::XDataSequence > xNewSequence(
841 xDataProv->createDataSequenceByRangeRepresentation(
"categories"));
844 rLSeq.second->setValues( xNewSequence );
845 bCategoriesApplied =
true;
850 OUString aRep( OUString::number( rLSeq.first.first ));
851 Reference< chart2::data::XDataSequence > xNewSequence(
852 xDataProv->createDataSequenceByRangeRepresentation( aRep ));
855 rLSeq.second->setValues( xNewSequence );
864 Reference< chart2::data::XDataSequence > xSeq( rLSeq.second->getLabel());
868 lcl_mapContainsRange( aRangeMap, aRange ))
870 Reference< chart2::data::XDataSequence > xNewSeq(
871 lcl_reassignDataSequence( xSeq, xDataProv, aRangeMap, aRange ));
872 if( xNewSeq != xSeq )
876 rLSeq.second->setLabel( xNewSeq );
881 OUString aRep =
"label " + OUString::number( rLSeq.first.first );
883 Reference< chart2::data::XDataSequence > xNewSeq(
884 xDataProv->createDataSequenceByRangeRepresentation( aRep ));
887 rLSeq.second->setLabel( xNewSeq );
896 if( ! bCategoriesApplied )
899 xDataProv, xChartDoc,
"categories",
905 Reference< chart2::XInternalDataProvider > xInternalDataProvider( xDataProv, uno::UNO_QUERY );
906 if( !xInternalDataProvider.is() || rTable.
aHiddenColumns.empty() )
911 Reference< chart2::XCoordinateSystemContainer > xCooSysCnt( xChartDoc->getFirstDiagram(), uno::UNO_QUERY_THROW );
912 const Sequence< Reference< chart2::XCoordinateSystem > > aCooSysSeq( xCooSysCnt->getCoordinateSystems() );
913 for(
const auto& rCooSys : aCooSysSeq )
915 Reference< chart2::XChartTypeContainer > xCooSysContainer( rCooSys, uno::UNO_QUERY_THROW );
916 const Sequence< Reference< chart2::XChartType > > aChartTypeSeq( xCooSysContainer->getChartTypes());
917 for(
const auto& rChartType : aChartTypeSeq )
919 Reference< chart2::XDataSeriesContainer > xSeriesContainer( rChartType, uno::UNO_QUERY );
920 if(!xSeriesContainer.is())
922 const Sequence< Reference< chart2::XDataSeries > > aSeriesSeq( xSeriesContainer->getDataSeries() );
923 std::vector< Reference< chart2::XDataSeries > > aRemainingSeries;
925 for(
const auto& rSeries : aSeriesSeq )
927 Reference< chart2::data::XDataSource > xDataSource( rSeries, uno::UNO_QUERY );
928 if( xDataSource.is() )
930 bool bHasUnhiddenColumns =
false;
932 const uno::Sequence< Reference< chart2::data::XLabeledDataSequence > > aSequences( xDataSource->getDataSequences() );
933 for(
const auto& xLabeledSequence : aSequences )
935 if(!xLabeledSequence.is())
937 Reference< chart2::data::XDataSequence > xValues( xLabeledSequence->getValues() );
940 aRange = xValues->getSourceRangeRepresentation();
942 bHasUnhiddenColumns =
true;
944 if( !bHasUnhiddenColumns )
946 Reference< chart2::data::XDataSequence > xLabel( xLabeledSequence->getLabel() );
949 aRange = xLabel->getSourceRangeRepresentation();
950 const sal_Int32
nId {aRange.getToken(1,
' ').toInt32()};
952 bHasUnhiddenColumns =
true;
956 if( bHasUnhiddenColumns )
957 aRemainingSeries.push_back( rSeries );
961 if( static_cast<sal_Int32>(aRemainingSeries.size()) != aSeriesSeq.getLength() )
967 Reference< chart2::data::XDataSource > xDataSource( xChartDoc, uno::UNO_QUERY );
968 if( xDataSource.is() )
971 std::map< sal_Int32, bool > aUsageMap;
973 const Sequence< Reference< chart2::data::XLabeledDataSequence > > aUsedSequences( xDataSource->getDataSequences() );
974 for(
const auto& xLabeledSequence : aUsedSequences )
976 if(!xLabeledSequence.is())
978 Reference< chart2::data::XDataSequence > xValues( xLabeledSequence->getValues() );
981 aRange = xValues->getSourceRangeRepresentation();
982 sal_Int32
nIndex = aRange.toInt32();
983 if( nIndex!=0 || aRange != lcl_aCategoriesRange )
984 aUsageMap[nIndex] =
true;
986 Reference< chart2::data::XDataSequence > xLabel( xLabeledSequence->getLabel() );
989 aRange = xLabel->getSourceRangeRepresentation();
990 OUString aSecondToken = aRange.getToken(1,
' ');
991 if( !aSecondToken.isEmpty() )
992 aUsageMap[aSecondToken.toInt32()] =
true;
996 ::std::vector< sal_Int32 > aSequenceIndexesToDelete;
998 std::back_inserter(aSequenceIndexesToDelete),
999 [&aUsageMap](sal_Int32 nSequenceIndex) {
return aUsageMap.find(nSequenceIndex) == aUsageMap.end(); });
1004 ::std::sort( aSequenceIndexesToDelete.begin(), aSequenceIndexesToDelete.end());
1005 for( ::std::vector< sal_Int32 >::reverse_iterator aIt(
1006 aSequenceIndexesToDelete.rbegin()); aIt != aSequenceIndexesToDelete.rend(); ++aIt )
1009 xInternalDataProvider->deleteSequence( *aIt );
1016 catch(
const uno::Exception & )
1021 SchXMLRangeSomewhereContext::SchXMLRangeSomewhereContext(
SvXMLImport& rImport,
1022 OUString& rRangeString ) :
1024 mrRangeString( rRangeString )
1028 css::uno::Reference< css::xml::sax::XFastContextHandler > SchXMLRangeSomewhereContext::createFastChildContext(
1030 const css::uno::Reference< css::xml::sax::XFastAttributeList >& )
1041 void SchXMLRangeSomewhereContext::endFastElement(sal_Int32 )
1043 mrRangeString = maRangeStringBuffer.makeStringAndClear();
SchXMLTableRowContext(SvXMLImport &rImport, SchXMLTable &aTable)
SchXMLTableContext(SvXMLImport &rImport, SchXMLTable &aTable)
SchXMLTableRowsContext(SvXMLImport &rImport, SchXMLTable &aTable)
virtual ~SchXMLTableColumnContext() override
virtual void SAL_CALL endFastElement(sal_Int32 nElement) override
endFastElement is called before a context will be destructed, but after an elements context has been ...
virtual void SAL_CALL startFastElement(sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList > &xAttrList) override
SchXMLTableColumnsContext(SvXMLImport &rImport, SchXMLTable &aTable)
SvXMLImport & GetImport()
void setRowPermutation(const css::uno::Sequence< sal_Int32 > &rPermutation)
bool IsXMLToken(std::u16string_view rString, enum XMLTokenEnum eToken)
compare eToken to the string
FastAttributeList & castToFastAttributeList(const css::uno::Reference< css::xml::sax::XFastAttributeList > &xAttrList)
SchXMLTableColumnContext(SvXMLImport &rImport, SchXMLTable &aTable)
css::uno::Sequence< OUString > aComplexString
static void convertDouble(OUStringBuffer &rBuffer, double fNumber, bool bWriteUnits, sal_Int16 nSourceUnit, sal_Int16 nTargetUnit)
virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList > &AttrList) override
virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList > &AttrList) override
DstType sequenceToContainer(const css::uno::Sequence< SrcType > &i_Sequence)
css::uno::Sequence< sal_Int32 > maRowPermutation
const Sequence< Sequence< double > > & m_rData
virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList > &AttrList) override
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
#define XMLOFF_WARN_UNKNOWN(area, rIter)
css::uno::Sequence< sal_Int32 > maColumnPermutation
virtual ~SchXMLTableContext() override
sal_Int32 nNumberOfColsEstimate
the greatest number of columns detected
static void lcl_ApplyCellToComplexLabel(const SchXMLCell &rCell, Sequence< uno::Any > &rComplexLabel)
SchXMLTableCellContext(SvXMLImport &rImport, SchXMLTable &aTable)
virtual void SAL_CALL startFastElement(sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList > &xAttrList) override
virtual ~SchXMLTableRowsContext() override
#define SCH_XML_CATEGORIES_INDEX
virtual ~SchXMLTableCellContext() override
virtual void SAL_CALL startFastElement(sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList > &xAttrList) override
constexpr std::enable_if_t< std::is_signed_v< T >, std::make_unsigned_t< T > > make_unsigned(T value)
sal_Int32 nColumnIndex
reflects the index of the row currently parsed
std::vector< std::vector< SchXMLCell > > aData
Import all text into a string buffer.
This class deliberately does not support XWeak, to improve performance when loading large documents...
bool mbHasColumnPermutation
virtual void SAL_CALL endFastElement(sal_Int32 nElement) override
endFastElement is called before a context will be destructed, but after an elements context has been ...
bool bHasHeaderRow
parsing column-elements may yield an estimate
static void switchRangesFromOuterToInternalIfNecessary(const SchXMLTable &rTable, const tSchXMLLSequencesPerIndex &rLSequencesPerIndex, const css::uno::Reference< css::chart2::XChartDocument > &xChartDoc, css::chart::ChartDataRowSource eDataRowSource)
This function reorders local data to fit the correct data structure.
OUString aTableNameOfFile
#define SAL_WARN_IF(condition, area, stream)
const OUString & GetXMLToken(enum XMLTokenEnum eToken)
return the OUString representation for eToken
virtual void SAL_CALL endFastElement(sal_Int32 Element) override
endFastElement is called before a context will be destructed, but after an elements context has been ...
css::uno::Sequence< DstElementType > containerToSequence(const SrcType &i_Container)
Handling of tokens in XML:
virtual css::uno::Reference< XFastContextHandler > SAL_CALL createFastChildContext(sal_Int32 Element, const css::uno::Reference< css::xml::sax::XFastAttributeList > &Attribs) override
#define XML_ELEMENT(prefix, name)
double getLength(const B2DPolygon &rCandidate)
sal_Int32 nMaxColumnIndex
reflects the index of the column currently parsed
virtual ~SchXMLTableRowContext() override
#define XMLOFF_WARN_UNKNOWN_ELEMENT(area, token)
::std::vector< sal_Int32 > aHiddenColumns
the table name read at the table:table element
With this context all column elements are parsed to determine the index of the column containing the ...
::std::multimap< tSchXMLIndexWithPart, css::uno::Reference< css::chart2::data::XLabeledDataSequence > > tSchXMLLSequencesPerIndex
void setColumnPermutation(const css::uno::Sequence< sal_Int32 > &rPermutation)
virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList > &AttrList) override
static void applyTableToInternalDataProvider(const SchXMLTable &rTable, const css::uno::Reference< css::chart2::XChartDocument > &xChartDoc)
virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList > &AttrList) override
virtual ~SchXMLTableColumnsContext() override
sal_Int32 nRowIndex
an array of rows containing the table contents