usingnamespace ::com::sun::star; 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::Any; using ::com::sun::star::drawing::XDrawPageSupplier; using ::com::sun::star::drawing::XShapes; using ::com::sun::star::chart2::XDiagram; using ::com::sun::star::chart2::XTitled;
// Formulas with no numeric values and strings are zeroes in OOXML line charts also in the mode DispBlanksAs=gap, // unlike in OpenDocument LEAVE_GAP mode. As a workaround, we will use the OpenDocument mode USE_ZERO, if the OOXML // line chart has got formulas with no numeric values and strings, but it doesn't have empty cells, showing the // same chart as in MSO. (Empty cells need gaps, so in that case, we cannot use this workaround). staticbool lcl_useWorkaroundForNoGapInOOXML( Reference< chart2::XChartDocument > const & xChartDoc)
{
Reference <chart2::XDiagram > xDiagram = xChartDoc->getFirstDiagram(); if ( !xDiagram.is() ) returnfalse;
void ChartSpaceConverter::convertFromModel( const Reference< XShapes >& rxExternalPage, const awt::Point& rChartPos )
{ /* create data provider (virtual function in the ChartConverter class,
derived converters may create an external data provider) */
getChartConverter().createDataProvider( getChartDocument() );
// formatting of the chart background. The default fill style varies with applications.
PropertySet aBackPropSet( getChartDocument()->getPageBackground() );
getFormatter().convertFrameFormatting( aBackPropSet, mrModel.mxShapeProp, OBJECTTYPE_CHARTSPACE );
bool bMSO2007Doc = getFilter().isMSO2007Document(); // convert plot area (container of all chart type groups)
PlotAreaConverter aPlotAreaConv( *this, mrModel.mxPlotArea.getOrCreate() );
aPlotAreaConv.convertFromModel( mrModel.mxView3D.getOrCreate(bMSO2007Doc) );
// plot area converter has created the diagram object
Reference< XDiagram > xDiagram = getChartDocument()->getFirstDiagram();
// convert wall and floor formatting in 3D charts if( xDiagram.is() && aPlotAreaConv.isWall3dChart() )
{
WallFloorConverter aFloorConv( *this, mrModel.mxFloor.getOrCreate() );
aFloorConv.convertFromModel( xDiagram, OBJECTTYPE_FLOOR );
// chart title /* tdf#119138 autoTitleDeleted might be omitted by generators other than Excel whileprovidingcustomtitle.mbAutoTitleDelissetonlybasedontheattributevalue
and the default also varies on whether MSO 2007 or newer is the generator, see tdf#78080 */ if( !mrModel.mbAutoTitleDel || mrModel.mxTitle.is() ) try
{ /* If the title model is missing, but the chart shows exactly one
series, the series title is shown as chart title. */
OUString aAutoTitle = aPlotAreaConv.getAutomaticTitle(); if( mrModel.mxTitle.is() || !aAutoTitle.isEmpty() )
{ // tdf#146487 In some cases, we need to show the empty title bool bShowEmptyTitle = aAutoTitle.isEmpty() && !mrModel.mbAutoTitleDel
&& aPlotAreaConv.isSingleSeriesTitle()
&& mrModel.mxTitle->mxShapeProp.is()
&& mrModel.mxTitle->mxTextProp.is()
&& mrModel.mxTitle->mxTextProp->isEmpty(); // Also for tdf#146487 bool bEmptyRichText = mrModel.mxTitle
&& mrModel.mxTitle->mxText.is()
&& mrModel.mxTitle->mxText->mxTextBody.is()
&& mrModel.mxTitle->mxText->mxTextBody->isEmpty();
// tdf#134118 leave gap if the time unit is month bool bIsMonthBasedTimeUnit = false; if( mrModel.mxPlotArea.is() && mrModel.mxPlotArea->maAxes.size() > 0 &&
mrModel.mxPlotArea->maAxes[0]->monBaseTimeUnit.has_value() )
{
bIsMonthBasedTimeUnit = mrModel.mxPlotArea->maAxes[0]->monBaseTimeUnit.value() == XML_months;
}
if (!bIsMonthBasedTimeUnit) switch( mrModel.mnDispBlanksAs )
{ case XML_gap: nMissingValues = LEAVE_GAP; break; case XML_zero: nMissingValues = USE_ZERO; break; case XML_span: nMissingValues = CONTINUE; break;
}
// use a workaround, if it's possible for the difference of OOXML and OpenDocument if ( nMissingValues == LEAVE_GAP && lcl_useWorkaroundForNoGapInOOXML(getChartDocument()) )
nMissingValues = USE_ZERO;
if (mrModel.mbExplicitStyle) { // The <c:style> value, now in mrModel.mnStyle, is handled in the // ObjectFormatter code. Set it here as a property just so it can be // stored for output.
aDiaProp.setProperty( PROP_StyleIndex, mrModel.mnStyle);
}
}
/* Following all conversions needing the old Chart1 API that involves full
initialization of the chart view. */ namespace cssc = css::chart;
Reference< cssc::XChartDocument > xChart1Doc( getChartDocument(), UNO_QUERY ); if( xChart1Doc.is() )
{ /* Set the IncludeHiddenCells property via the old API as only this ensuresthatthedataproviderandallcreatedsequencesgetthis
flag correctly. */
PropertySet aDiaProp( xChart1Doc->getDiagram() );
aDiaProp.setProperty( PROP_IncludeHiddenCells, !mrModel.mbPlotVisOnly );
// plot area position and size
aPlotAreaConv.convertPositionFromModel();
// positions of main title and all axis titles
convertTitlePositions();
}
// embedded drawing shapes if( !mrModel.maDrawingPath.isEmpty() ) try
{ /* Get the internal draw page of the chart document, if no external
drawing page has been passed. */
Reference< XShapes > xShapes;
awt::Point aShapesOffset( 0, 0 ); if( rxExternalPage.is() )
{
xShapes = rxExternalPage; // offset for embedded shapes to move them inside the chart area
aShapesOffset = rChartPos;
} else
{
Reference< XDrawPageSupplier > xDrawPageSupp( getChartDocument(), UNO_QUERY_THROW );
xShapes.set( xDrawPageSupp->getDrawPage(), UNO_QUERY_THROW );
}
/* If an external drawing page is passed, all embedded shapes will be insertedthere(usede.g.with'chartsheets'inspreadsheet documents).Inthiscase,alltypesofshapesincludingOLEobjects aresupported.Iftheshapesareinsertedintotheinternalchart
drawing page instead, it is not possible to embed OLE objects. */ bool bOleSupport = rxExternalPage.is();
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.