getDrawingHashTable()->count(); ++$i) { $shape = $this->getDrawingHashTable()->getByIndex($i); if ($shape instanceof Chart) { $this->getZip()->addFromString('ppt/charts/' . $shape->getIndexedFilename(), $this->writeChart($shape)); if ($shape->hasIncludedSpreadsheet()) { $this->getZip()->addFromString('ppt/charts/_rels/' . $shape->getIndexedFilename() . '.rels', $this->writeChartRelationships($shape)); $pFilename = \tempnam(\sys_get_temp_dir(), 'PhpSpreadsheet'); $this->getZip()->addFromString('ppt/embeddings/' . $shape->getIndexedFilename() . '.xlsx', $this->writeSpreadsheet($this->getPresentation(), $shape, $pFilename . '.xlsx')); // remove temp file if (false === @\unlink($pFilename)) { throw new FileRemoveException($pFilename); } } } } return $this->getZip(); } /** * Write chart to XML format. * * @return string XML Output */ protected function writeChart(Chart $chart): string { // Create XML writer $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); // XML header $objWriter->startDocument('1.0', 'UTF-8', 'yes'); // c:chartSpace $objWriter->startElement('c:chartSpace'); $objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart'); $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main'); $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'); // c:date1904 $objWriter->startElement('c:date1904'); $objWriter->writeAttribute('val', '1'); $objWriter->endElement(); // c:lang $objWriter->startElement('c:lang'); $objWriter->writeAttribute('val', 'en-US'); $objWriter->endElement(); // c:chart $objWriter->startElement('c:chart'); // Title? if ($chart->getTitle()->isVisible()) { // Write title $this->writeTitle($objWriter, $chart->getTitle()); } // c:autoTitleDeleted $objWriter->startElement('c:autoTitleDeleted'); $objWriter->writeAttribute('val', $chart->getTitle()->isVisible() ? '0' : '1'); $objWriter->endElement(); // c:view3D $objWriter->startElement('c:view3D'); // c:rotX $objWriter->startElement('c:rotX'); $objWriter->writeAttribute('val', $chart->getView3D()->getRotationX()); $objWriter->endElement(); // c:hPercent $hPercent = $chart->getView3D()->getHeightPercent(); $objWriter->writeElementIf(null != $hPercent, 'c:hPercent', 'val', $hPercent); // c:rotY $objWriter->startElement('c:rotY'); $objWriter->writeAttribute('val', $chart->getView3D()->getRotationY()); $objWriter->endElement(); // c:depthPercent $objWriter->startElement('c:depthPercent'); $objWriter->writeAttribute('val', $chart->getView3D()->getDepthPercent()); $objWriter->endElement(); // c:rAngAx $objWriter->startElement('c:rAngAx'); $objWriter->writeAttribute('val', $chart->getView3D()->hasRightAngleAxes() ? '1' : '0'); $objWriter->endElement(); // c:perspective $objWriter->startElement('c:perspective'); $objWriter->writeAttribute('val', $chart->getView3D()->getPerspective()); $objWriter->endElement(); $objWriter->endElement(); // Write plot area $this->writePlotArea($objWriter, $chart->getPlotArea(), $chart); // Legend? if ($chart->getLegend()->isVisible()) { // Write legend $this->writeLegend($objWriter, $chart->getLegend()); } // c:plotVisOnly $objWriter->startElement('c:plotVisOnly'); $objWriter->writeAttribute('val', '1'); $objWriter->endElement(); // c:dispBlanksAs $objWriter->startElement('c:dispBlanksAs'); $objWriter->writeAttribute('val', $chart->getDisplayBlankAs()); $objWriter->endElement(); $objWriter->endElement(); // c:spPr $objWriter->startElement('c:spPr'); // Fill $this->writeFill($objWriter, $chart->getFill()); // Border if (Border::LINE_NONE != $chart->getBorder()->getLineStyle()) { $this->writeBorder($objWriter, $chart->getBorder(), ''); } // Shadow if ($chart->getShadow()->isVisible()) { // a:effectLst $objWriter->startElement('a:effectLst'); // a:outerShdw $objWriter->startElement('a:outerShdw'); $objWriter->writeAttribute('blurRad', CommonDrawing::pixelsToEmu($chart->getShadow()->getBlurRadius())); $objWriter->writeAttribute('dist', CommonDrawing::pixelsToEmu($chart->getShadow()->getDistance())); $objWriter->writeAttribute('dir', CommonDrawing::degreesToAngle((int) $chart->getShadow()->getDirection())); $objWriter->writeAttribute('algn', $chart->getShadow()->getAlignment()); $objWriter->writeAttribute('rotWithShape', '0'); $this->writeColor($objWriter, $chart->getShadow()->getColor(), $chart->getShadow()->getAlpha()); $objWriter->endElement(); $objWriter->endElement(); } $objWriter->endElement(); // External data? if ($chart->hasIncludedSpreadsheet()) { // c:externalData $objWriter->startElement('c:externalData'); $objWriter->writeAttribute('r:id', 'rId1'); // c:autoUpdate $objWriter->startElement('c:autoUpdate'); $objWriter->writeAttribute('val', '0'); $objWriter->endElement(); $objWriter->endElement(); } $objWriter->endElement(); // Return return $objWriter->getData(); } /** * Write chart to XML format. * * @return string String output * * @throws FileRemoveException */ protected function writeSpreadsheet(PhpPresentation $presentation, Chart $chart, string $tempName): string { // Create new spreadsheet $spreadsheet = new Spreadsheet(); // Set properties $title = $chart->getTitle()->getText(); if (0 == \strlen($title)) { $title = 'Chart'; } $spreadsheet->getProperties() ->setCreator( $presentation->getDocumentProperties()->getCreator())->setLastModifiedBy( $presentation->getDocumentProperties()->getLastModifiedBy() ) ->setTitle($title); // Add chart data $sheet = $spreadsheet->setActiveSheetIndex(0); $sheet->setTitle('Sheet1'); // Write series $seriesIndex = 0; foreach ($chart->getPlotArea()->getType()->getSeries() as $series) { // Title $sheet->setCellValueByColumnAndRow(1 + $seriesIndex, 1, $series->getTitle()); // X-axis $axisXData = \array_keys($series->getValues()); $numAxisXData = \count($axisXData); for ($i = 0; $i < $numAxisXData; ++$i) { $sheet->setCellValueByColumnAndRow(0, $i + 2, $axisXData[$i]); } // Y-axis $axisYData = \array_values($series->getValues()); $numAxisYData = \count($axisYData); for ($i = 0; $i < $numAxisYData; ++$i) { $sheet->setCellValueByColumnAndRow(1 + $seriesIndex, $i + 2, $axisYData[$i]); } ++$seriesIndex; } // Save to string $writer = IOFactory::createWriter($spreadsheet, 'Xlsx'); $writer->save($tempName); // Load file in memory $returnValue = \file_get_contents($tempName); if (false === @\unlink($tempName)) { throw new FileRemoveException($tempName); } return $returnValue; } /** * Write element with value attribute. * * @param XMLWriter $objWriter XML Writer */ protected function writeElementWithValAttribute(XMLWriter $objWriter, string $elementName, string $value): void { $objWriter->startElement($elementName); $objWriter->writeAttribute('val', $value); $objWriter->endElement(); } /** * Write single value or reference. * * @param XMLWriter $objWriter XML Writer */ protected function writeSingleValueOrReference(XMLWriter $objWriter, bool $isReference, string $value, string $reference): void { if (!$isReference) { // Value $objWriter->writeElement('c:v', $value); return; } // Reference and cache // c:strRef $objWriter->startElement('c:strRef'); // c:strRef/c:f $objWriter->writeElement('c:f', $reference); // c:strRef/c:strCache $objWriter->startElement('c:strCache'); // c:strRef/c:strCache/c:ptCount $objWriter->startElement('c:ptCount'); $objWriter->writeAttribute('val', '1'); $objWriter->endElement(); // c:strRef/c:strCache/c:pt $objWriter->startElement('c:pt'); $objWriter->writeAttribute('idx', '0'); // c:strRef/c:strCache/c:pt/c:v $objWriter->writeElement('c:v', $value); // c:strRef/c:strCache/c:pt $objWriter->endElement(); // c:strRef/c:strCache $objWriter->endElement(); // c:strRef $objWriter->endElement(); } /** * Write series value or reference. * * @param XMLWriter $objWriter XML Writer * @param array $values */ protected function writeMultipleValuesOrReference(XMLWriter $objWriter, bool $isReference, array $values, string $reference): void { // c:strLit / c:numLit // c:strRef / c:numRef $referenceType = ($isReference ? 'Ref' : 'Lit'); $dataType = \is_numeric($values[0]) ? 'num' : 'str'; $objWriter->startElement('c:' . $dataType . $referenceType); $numValues = \count($values); if (!$isReference) { // Value // c:ptCount $objWriter->startElement('c:ptCount'); $objWriter->writeAttribute('val', \count($values)); $objWriter->endElement(); // Add points for ($i = 0; $i < $numValues; ++$i) { // c:pt $objWriter->startElement('c:pt'); $objWriter->writeAttribute('idx', $i); $objWriter->writeElement('c:v', \strval($values[$i])); $objWriter->endElement(); } } else { // Reference $objWriter->writeElement('c:f', $reference); $objWriter->startElement('c:' . $dataType . 'Cache'); // c:ptCount $objWriter->startElement('c:ptCount'); $objWriter->writeAttribute('val', \count($values)); $objWriter->endElement(); // Add points for ($i = 0; $i < $numValues; ++$i) { // c:pt $objWriter->startElement('c:pt'); $objWriter->writeAttribute('idx', $i); $objWriter->writeElement('c:v', \strval($values[$i])); $objWriter->endElement(); } $objWriter->endElement(); } $objWriter->endElement(); } /** * Write Title */ protected function writeTitle(XMLWriter $objWriter, Title $subject): void { // c:title $objWriter->startElement('c:title'); // c:tx $objWriter->startElement('c:tx'); // c:rich $objWriter->startElement('c:rich'); // a:bodyPr $objWriter->writeElement('a:bodyPr', null); // a:lstStyle $objWriter->writeElement('a:lstStyle', null); // a:p $objWriter->startElement('a:p'); // a:pPr $objWriter->startElement('a:pPr'); $objWriter->writeAttribute('algn', $subject->getAlignment()->getHorizontal()); $objWriter->writeAttribute('fontAlgn', $subject->getAlignment()->getVertical()); $objWriter->writeAttribute('marL', CommonDrawing::pixelsToEmu($subject->getAlignment()->getMarginLeft())); $objWriter->writeAttribute('marR', CommonDrawing::pixelsToEmu($subject->getAlignment()->getMarginRight())); $objWriter->writeAttribute('indent', CommonDrawing::pixelsToEmu($subject->getAlignment()->getIndent())); $objWriter->writeAttribute('lvl', $subject->getAlignment()->getLevel()); // a:defRPr $objWriter->writeElement('a:defRPr', null); $objWriter->endElement(); // a:r $objWriter->startElement('a:r'); // a:rPr $objWriter->startElement('a:rPr'); $objWriter->writeAttribute('lang', 'en-US'); $objWriter->writeAttribute('dirty', '0'); $objWriter->writeAttribute('b', ($subject->getFont()->isBold() ? 'true' : 'false')); $objWriter->writeAttribute('i', ($subject->getFont()->isItalic() ? 'true' : 'false')); $objWriter->writeAttribute('strike', ($subject->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike')); $objWriter->writeAttribute('sz', ($subject->getFont()->getSize() * 100)); $objWriter->writeAttribute('u', $subject->getFont()->getUnderline()); $objWriter->writeAttributeIf($subject->getFont()->isSuperScript(), 'baseline', '300000'); $objWriter->writeAttributeIf($subject->getFont()->isSubScript(), 'baseline', '-250000'); // Font - a:solidFill $objWriter->startElement('a:solidFill'); $this->writeColor($objWriter, $subject->getFont()->getColor()); $objWriter->endElement(); // Font - a:latin $objWriter->startElement('a:latin'); $objWriter->writeAttribute('typeface', $subject->getFont()->getName()); $objWriter->endElement(); $objWriter->endElement(); // a:t $objWriter->writeElement('a:t', $subject->getText()); $objWriter->endElement(); // a:endParaRPr $objWriter->startElement('a:endParaRPr'); $objWriter->writeAttribute('lang', 'en-US'); $objWriter->writeAttribute('dirty', '0'); $objWriter->endElement(); $objWriter->endElement(); $objWriter->endElement(); $objWriter->endElement(); // Write layout $this->writeLayout($objWriter, $subject); // c:overlay $objWriter->startElement('c:overlay'); $objWriter->writeAttribute('val', '0'); $objWriter->endElement(); $objWriter->endElement(); } /** * Write Plot Area. * * @param XMLWriter $objWriter XML Writer * * @throws UndefinedChartTypeException */ protected function writePlotArea(XMLWriter $objWriter, PlotArea $subject, Chart $chart): void { // c:plotArea $objWriter->startElement('c:plotArea'); // Write layout $this->writeLayout($objWriter, $subject); // Write chart $chartType = $subject->getType(); if ($chartType instanceof Area) { $this->writeTypeArea($objWriter, $chartType, $chart->hasIncludedSpreadsheet()); } elseif ($chartType instanceof Bar) { $this->writeTypeBar($objWriter, $chartType, $chart->hasIncludedSpreadsheet()); } elseif ($chartType instanceof Bar3D) { $this->writeTypeBar3D($objWriter, $chartType, $chart->hasIncludedSpreadsheet()); } elseif ($chartType instanceof Doughnut) { $this->writeTypeDoughnut($objWriter, $chartType, $chart->hasIncludedSpreadsheet()); } elseif ($chartType instanceof Pie) { $this->writeTypePie($objWriter, $chartType, $chart->hasIncludedSpreadsheet()); } elseif ($chartType instanceof Pie3D) { $this->writeTypePie3D($objWriter, $chartType, $chart->hasIncludedSpreadsheet()); } elseif ($chartType instanceof Line) { $this->writeTypeLine($objWriter, $chartType, $chart->hasIncludedSpreadsheet()); } elseif ($chartType instanceof Radar) { $this->writeTypeRadar($objWriter, $chartType, $chart->hasIncludedSpreadsheet()); } elseif ($chartType instanceof Scatter) { $this->writeTypeScatter($objWriter, $chartType, $chart->hasIncludedSpreadsheet()); } else { throw new UndefinedChartTypeException(); } // Write X axis? if ($chartType->hasAxisX()) { $this->writeAxis($objWriter, $subject->getAxisX(), Chart\Axis::AXIS_X, $chartType); } // Write Y axis? if ($chartType->hasAxisY()) { $this->writeAxis($objWriter, $subject->getAxisY(), Chart\Axis::AXIS_Y, $chartType); } $objWriter->endElement(); } /** * Write Legend. * * @param XMLWriter $objWriter XML Writer * @param Chart\Legend $subject */ protected function writeLegend(XMLWriter $objWriter, Legend $subject): void { // c:legend $objWriter->startElement('c:legend'); // c:legendPos $objWriter->startElement('c:legendPos'); $objWriter->writeAttribute('val', $subject->getPosition()); $objWriter->endElement(); // Write layout $this->writeLayout($objWriter, $subject); // c:overlay $objWriter->startElement('c:overlay'); $objWriter->writeAttribute('val', '0'); $objWriter->endElement(); // c:spPr $objWriter->startElement('c:spPr'); // Fill $this->writeFill($objWriter, $subject->getFill()); // Border if (Border::LINE_NONE != $subject->getBorder()->getLineStyle()) { $this->writeBorder($objWriter, $subject->getBorder(), ''); } $objWriter->endElement(); // c:txPr $objWriter->startElement('c:txPr'); // a:bodyPr $objWriter->writeElement('a:bodyPr', null); // a:lstStyle $objWriter->writeElement('a:lstStyle', null); // a:p $objWriter->startElement('a:p'); // a:pPr $objWriter->startElement('a:pPr'); $objWriter->writeAttribute('algn', $subject->getAlignment()->getHorizontal()); $objWriter->writeAttribute('fontAlgn', $subject->getAlignment()->getVertical()); $objWriter->writeAttribute('marL', CommonDrawing::pixelsToEmu($subject->getAlignment()->getMarginLeft())); $objWriter->writeAttribute('marR', CommonDrawing::pixelsToEmu($subject->getAlignment()->getMarginRight())); $objWriter->writeAttribute('indent', CommonDrawing::pixelsToEmu($subject->getAlignment()->getIndent())); $objWriter->writeAttribute('lvl', $subject->getAlignment()->getLevel()); // a:defRPr $objWriter->startElement('a:defRPr'); $objWriter->writeAttribute('b', ($subject->getFont()->isBold() ? 'true' : 'false')); $objWriter->writeAttribute('i', ($subject->getFont()->isItalic() ? 'true' : 'false')); $objWriter->writeAttribute('strike', ($subject->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike')); $objWriter->writeAttribute('sz', ($subject->getFont()->getSize() * 100)); $objWriter->writeAttribute('u', $subject->getFont()->getUnderline()); $objWriter->writeAttributeIf($subject->getFont()->isSuperScript(), 'baseline', '300000'); $objWriter->writeAttributeIf($subject->getFont()->isSubScript(), 'baseline', '-250000'); // Font - a:solidFill $objWriter->startElement('a:solidFill'); $this->writeColor($objWriter, $subject->getFont()->getColor()); $objWriter->endElement(); // Font - a:latin $objWriter->startElement('a:latin'); $objWriter->writeAttribute('typeface', $subject->getFont()->getName()); $objWriter->endElement(); $objWriter->endElement(); $objWriter->endElement(); // a:endParaRPr $objWriter->startElement('a:endParaRPr'); $objWriter->writeAttribute('lang', 'en-US'); $objWriter->writeAttribute('dirty', '0'); $objWriter->endElement(); $objWriter->endElement(); $objWriter->endElement(); $objWriter->endElement(); } /** * Write Layout. * * @param XMLWriter $objWriter XML Writer * @param Legend|PlotArea|Title $subject */ protected function writeLayout(XMLWriter $objWriter, $subject): void { // c:layout $objWriter->startElement('c:layout'); // c:manualLayout $objWriter->startElement('c:manualLayout'); // c:xMode $objWriter->startElement('c:xMode'); $objWriter->writeAttribute('val', 'edge'); $objWriter->endElement(); // c:yMode $objWriter->startElement('c:yMode'); $objWriter->writeAttribute('val', 'edge'); $objWriter->endElement(); if (0 != $subject->getOffsetX()) { // c:x $objWriter->startElement('c:x'); $objWriter->writeAttribute('val', $subject->getOffsetX()); $objWriter->endElement(); } if (0 != $subject->getOffsetY()) { // c:y $objWriter->startElement('c:y'); $objWriter->writeAttribute('val', $subject->getOffsetY()); $objWriter->endElement(); } if (0 != $subject->getWidth()) { // c:w $objWriter->startElement('c:w'); $objWriter->writeAttribute('val', $subject->getWidth()); $objWriter->endElement(); } if (0 != $subject->getHeight()) { // c:h $objWriter->startElement('c:h'); $objWriter->writeAttribute('val', $subject->getHeight()); $objWriter->endElement(); } $objWriter->endElement(); $objWriter->endElement(); } /** * Write Type Area. * * @param XMLWriter $objWriter XML Writer * @param Chart\Type\Area $subject * @param bool $includeSheet */ protected function writeTypeArea(XMLWriter $objWriter, Area $subject, bool $includeSheet = false): void { // c:lineChart $objWriter->startElement('c:areaChart'); // c:grouping $objWriter->startElement('c:grouping'); $objWriter->writeAttribute('val', 'standard'); $objWriter->endElement(); // Write series $seriesIndex = 0; foreach ($subject->getSeries() as $series) { // c:ser $objWriter->startElement('c:ser'); // c:ser > c:idx $objWriter->startElement('c:idx'); $objWriter->writeAttribute('val', $seriesIndex); $objWriter->endElement(); // c:ser > c:order $objWriter->startElement('c:order'); $objWriter->writeAttribute('val', $seriesIndex); $objWriter->endElement(); // c:ser > c:tx $objWriter->startElement('c:tx'); $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex(1 + $seriesIndex) . '$1' : ''); $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords); $objWriter->endElement(); // c:ser > c:dLbls // @link : https://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.charts.areachartseries.aspx $objWriter->startElement('c:dLbls'); // c:ser > c:dLbls > c:showVal $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0'); // c:ser > c:dLbls > c:showCatName $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0'); // c:ser > c:dLbls > c:showSerName $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0'); // c:ser > c:dLbls > c:showPercent $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0'); // c:ser > ##c:dLbls $objWriter->endElement(); if (Fill::FILL_NONE != $series->getFill()->getFillType()) { // c:spPr $objWriter->startElement('c:spPr'); // Write fill $this->writeFill($objWriter, $series->getFill()); // ## c:spPr $objWriter->endElement(); } // Write X axis data $axisXData = \array_keys($series->getValues()); // c:cat $objWriter->startElement('c:cat'); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + \count($axisXData))); $objWriter->endElement(); // Write Y axis data $axisYData = \array_values($series->getValues()); // c:val $objWriter->startElement('c:val'); $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + \count($axisYData)) : ''); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords); $objWriter->endElement(); $objWriter->endElement(); ++$seriesIndex; } // c:axId $objWriter->startElement('c:axId'); $objWriter->writeAttribute('val', '52743552'); $objWriter->endElement(); // c:axId $objWriter->startElement('c:axId'); $objWriter->writeAttribute('val', '52749440'); $objWriter->endElement(); $objWriter->endElement(); } /** * Write Type Bar. * * @param XMLWriter $objWriter XML Writer * @param Chart\Type\Bar $subject * @param bool $includeSheet */ protected function writeTypeBar(XMLWriter $objWriter, Bar $subject, bool $includeSheet = false): void { // c:barChart $objWriter->startElement('c:barChart'); // c:barDir $objWriter->startElement('c:barDir'); $objWriter->writeAttribute('val', $subject->getBarDirection()); $objWriter->endElement(); // c:grouping $objWriter->startElement('c:grouping'); $objWriter->writeAttribute('val', $subject->getBarGrouping()); $objWriter->endElement(); // Write series $seriesIndex = 0; foreach ($subject->getSeries() as $series) { // c:ser $objWriter->startElement('c:ser'); // c:idx $objWriter->startElement('c:idx'); $objWriter->writeAttribute('val', $seriesIndex); $objWriter->endElement(); // c:order $objWriter->startElement('c:order'); $objWriter->writeAttribute('val', $seriesIndex); $objWriter->endElement(); // c:tx $objWriter->startElement('c:tx'); $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex(1 + $seriesIndex) . '$1' : ''); $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords); $objWriter->endElement(); // Fills for points? $dataPointFills = $series->getDataPointFills(); foreach ($dataPointFills as $key => $value) { // c:dPt $objWriter->startElement('c:dPt'); // c:idx $this->writeElementWithValAttribute($objWriter, 'c:idx', (string) $key); if (Fill::FILL_NONE != $value->getFillType()) { // c:spPr $objWriter->startElement('c:spPr'); // Write fill $this->writeFill($objWriter, $value); // ## c:spPr $objWriter->endElement(); } // ## c:dPt $objWriter->endElement(); } // c:dLbls $objWriter->startElement('c:dLbls'); if ($series->hasDlblNumFormat()) { //c:numFmt $objWriter->startElement('c:numFmt'); $objWriter->writeAttribute('formatCode', $series->getDlblNumFormat()); $objWriter->writeAttribute('sourceLinked', '0'); $objWriter->endElement(); } // c:txPr $objWriter->startElement('c:txPr'); // a:bodyPr $objWriter->writeElement('a:bodyPr'); // a:lstStyle $objWriter->writeElement('a:lstStyle'); // a:p $objWriter->startElement('a:p'); // a:pPr $objWriter->startElement('a:pPr'); // a:defRPr $objWriter->startElement('a:defRPr'); $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false')); $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false')); $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike')); $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100)); $objWriter->writeAttribute('u', $series->getFont()->getUnderline()); $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '300000'); $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-250000'); // a:solidFill $objWriter->startElement('a:solidFill'); $this->writeColor($objWriter, $series->getFont()->getColor()); // >a:solidFill $objWriter->endElement(); // a:latin $objWriter->startElement('a:latin'); $objWriter->writeAttribute('typeface', $series->getFont()->getName()); // >a:latin $objWriter->endElement(); // >a:defRPr $objWriter->endElement(); // >a:pPr $objWriter->endElement(); // a:endParaRPr $objWriter->startElement('a:endParaRPr'); $objWriter->writeAttribute('lang', 'en-US'); $objWriter->writeAttribute('dirty', '0'); $objWriter->endElement(); // >a:p $objWriter->endElement(); // >a:lstStyle $objWriter->endElement(); // c:dLblPos $this->writeElementWithValAttribute($objWriter, 'c:dLblPos', $series->getLabelPosition()); // c:showVal $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0'); // c:showCatName $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0'); // c:showSerName $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0'); // c:showPercent $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0'); // c:separator $objWriter->writeElement('c:separator', $series->hasShowSeparator() ? $series->getSeparator() : ''); // c:showLeaderLines $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0'); $objWriter->endElement(); // c:spPr if (Fill::FILL_NONE != $series->getFill()->getFillType()) { // c:spPr $objWriter->startElement('c:spPr'); // Write fill $this->writeFill($objWriter, $series->getFill()); // ## c:spPr $objWriter->endElement(); } // Write X axis data $axisXData = \array_keys($series->getValues()); // c:cat $objWriter->startElement('c:cat'); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + \count($axisXData))); $objWriter->endElement(); // Write Y axis data $axisYData = \array_values($series->getValues()); // c:val $objWriter->startElement('c:val'); $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + \count($axisYData)) : ''); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords); $objWriter->endElement(); $objWriter->endElement(); ++$seriesIndex; } // c:gapWidth $objWriter->startElement('c:gapWidth'); $objWriter->writeAttribute('val', $subject->getGapWidthPercent()); $objWriter->endElement(); // c:overlap $objWriter->startElement('c:overlap'); $objWriter->writeAttribute('val', $subject->getOverlapWidthPercent()); $objWriter->endElement(); // c:axId $objWriter->startElement('c:axId'); $objWriter->writeAttribute('val', '52743552'); $objWriter->endElement(); // c:axId $objWriter->startElement('c:axId'); $objWriter->writeAttribute('val', '52749440'); $objWriter->endElement(); // c:extLst $objWriter->startElement('c:extLst'); $objWriter->endElement(); $objWriter->endElement(); } /** * Write Type Bar3D. * * @param XMLWriter $objWriter XML Writer * @param Chart\Type\Bar3D $subject * @param bool $includeSheet */ protected function writeTypeBar3D(XMLWriter $objWriter, Bar3D $subject, bool $includeSheet = false): void { // c:bar3DChart $objWriter->startElement('c:bar3DChart'); // c:barDir $objWriter->startElement('c:barDir'); $objWriter->writeAttribute('val', $subject->getBarDirection()); $objWriter->endElement(); // c:grouping $objWriter->startElement('c:grouping'); $objWriter->writeAttribute('val', $subject->getBarGrouping()); $objWriter->endElement(); // Write series $seriesIndex = 0; foreach ($subject->getSeries() as $series) { // c:ser $objWriter->startElement('c:ser'); // c:idx $objWriter->startElement('c:idx'); $objWriter->writeAttribute('val', $seriesIndex); $objWriter->endElement(); // c:order $objWriter->startElement('c:order'); $objWriter->writeAttribute('val', $seriesIndex); $objWriter->endElement(); // c:tx $objWriter->startElement('c:tx'); $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex(1 + $seriesIndex) . '$1' : ''); $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords); $objWriter->endElement(); // Fills for points? $dataPointFills = $series->getDataPointFills(); foreach ($dataPointFills as $key => $value) { // c:dPt $objWriter->startElement('c:dPt'); // c:idx $this->writeElementWithValAttribute($objWriter, 'c:idx', (string) $key); if (Fill::FILL_NONE != $value->getFillType()) { // c:spPr $objWriter->startElement('c:spPr'); // Write fill $this->writeFill($objWriter, $value); // ## c:spPr $objWriter->endElement(); } // ## c:dPt $objWriter->endElement(); } // c:dLbls $objWriter->startElement('c:dLbls'); // c:txPr $objWriter->startElement('c:txPr'); // a:bodyPr $objWriter->writeElement('a:bodyPr', null); // a:lstStyle $objWriter->writeElement('a:lstStyle', null); // a:p $objWriter->startElement('a:p'); // a:pPr $objWriter->startElement('a:pPr'); // a:defRPr $objWriter->startElement('a:defRPr'); $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false')); $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false')); $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike')); $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100)); $objWriter->writeAttribute('u', $series->getFont()->getUnderline()); $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '300000'); $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-250000'); // Font - a:solidFill $objWriter->startElement('a:solidFill'); $this->writeColor($objWriter, $series->getFont()->getColor()); $objWriter->endElement(); // Font - a:latin $objWriter->startElement('a:latin'); $objWriter->writeAttribute('typeface', $series->getFont()->getName()); $objWriter->endElement(); $objWriter->endElement(); $objWriter->endElement(); // a:endParaRPr $objWriter->startElement('a:endParaRPr'); $objWriter->writeAttribute('lang', 'en-US'); $objWriter->writeAttribute('dirty', '0'); $objWriter->endElement(); $objWriter->endElement(); $objWriter->endElement(); // c:showVal $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0'); // c:showCatName $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0'); // c:showSerName $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0'); // c:showPercent $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0'); // c:showLeaderLines $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0'); $objWriter->endElement(); // c:spPr if (Fill::FILL_NONE != $series->getFill()->getFillType()) { // c:spPr $objWriter->startElement('c:spPr'); // Write fill $this->writeFill($objWriter, $series->getFill()); // ## c:spPr $objWriter->endElement(); } // Write X axis data $axisXData = \array_keys($series->getValues()); // c:cat $objWriter->startElement('c:cat'); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + \count($axisXData))); $objWriter->endElement(); // Write Y axis data $axisYData = \array_values($series->getValues()); // c:val $objWriter->startElement('c:val'); $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + \count($axisYData)) : ''); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords); $objWriter->endElement(); $objWriter->endElement(); ++$seriesIndex; } // c:gapWidth $objWriter->startElement('c:gapWidth'); $objWriter->writeAttribute('val', $subject->getGapWidthPercent()); $objWriter->endElement(); // c:axId $objWriter->startElement('c:axId'); $objWriter->writeAttribute('val', '52743552'); $objWriter->endElement(); // c:axId $objWriter->startElement('c:axId'); $objWriter->writeAttribute('val', '52749440'); $objWriter->endElement(); // c:axId $objWriter->startElement('c:axId'); $objWriter->writeAttribute('val', '0'); $objWriter->endElement(); $objWriter->endElement(); } /** * Write Type Pie. * * @param XMLWriter $objWriter XML Writer * @param Doughnut $subject * @param bool $includeSheet */ protected function writeTypeDoughnut(XMLWriter $objWriter, Doughnut $subject, bool $includeSheet = false): void { // c:pieChart $objWriter->startElement('c:doughnutChart'); // c:varyColors $objWriter->startElement('c:varyColors'); $objWriter->writeAttribute('val', '1'); $objWriter->endElement(); // Write series $seriesIndex = 0; foreach ($subject->getSeries() as $series) { // c:ser $objWriter->startElement('c:ser'); // c:idx $objWriter->startElement('c:idx'); $objWriter->writeAttribute('val', $seriesIndex); $objWriter->endElement(); // c:order $objWriter->startElement('c:order'); $objWriter->writeAttribute('val', $seriesIndex); $objWriter->endElement(); // c:tx $objWriter->startElement('c:tx'); $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex(1 + $seriesIndex) . '$1' : ''); $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords); $objWriter->endElement(); // Fills for points? $dataPointFills = $series->getDataPointFills(); foreach ($dataPointFills as $key => $value) { // c:dPt $objWriter->startElement('c:dPt'); $this->writeElementWithValAttribute($objWriter, 'c:idx', (string) $key); // c:dPt/c:spPr $objWriter->startElement('c:spPr'); $this->writeFill($objWriter, $value); // c:dPt/##c:spPr $objWriter->endElement(); // ##c:dPt $objWriter->endElement(); } // Write X axis data $axisXData = \array_keys($series->getValues()); // c:cat $objWriter->startElement('c:cat'); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + \count($axisXData))); $objWriter->endElement(); // Write Y axis data $axisYData = \array_values($series->getValues()); // c:val $objWriter->startElement('c:val'); $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + \count($axisYData)) : ''); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords); $objWriter->endElement(); $objWriter->endElement(); ++$seriesIndex; } if (isset($series) && \is_object($series) && $series instanceof Chart\Series) { // c:dLbls $objWriter->startElement('c:dLbls'); $this->writeElementWithValAttribute($objWriter, 'c:showLegendKey', $series->hasShowLegendKey() ? '1' : '0'); $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0'); $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0'); $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0'); $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0'); $this->writeElementWithValAttribute($objWriter, 'c:showBubbleSize', '0'); $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0'); if ($series->hasDlblNumFormat()) { //c:numFmt $objWriter->startElement('c:numFmt'); $objWriter->writeAttribute('formatCode', $series->getDlblNumFormat()); $objWriter->writeAttribute('sourceLinked', '0'); $objWriter->endElement(); } // c:dLbls\c:txPr $objWriter->startElement('c:txPr'); $objWriter->writeElement('a:bodyPr', null); $objWriter->writeElement('a:lstStyle', null); // c:dLbls\c:txPr\a:p $objWriter->startElement('a:p'); // c:dLbls\c:txPr\a:p\a:pPr $objWriter->startElement('a:pPr'); // c:dLbls\c:txPr\a:p\a:pPr\a:defRPr $objWriter->startElement('a:defRPr'); $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false')); $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false')); $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike')); $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100)); $objWriter->writeAttribute('u', $series->getFont()->getUnderline()); $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '300000'); $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-250000'); // c:dLbls\c:txPr\a:p\a:pPr\a:defRPr\a:solidFill $objWriter->startElement('a:solidFill'); $this->writeColor($objWriter, $series->getFont()->getColor()); $objWriter->endElement(); // c:dLbls\c:txPr\a:p\a:pPr\a:defRPr\a:latin $objWriter->startElement('a:latin'); $objWriter->writeAttribute('typeface', $series->getFont()->getName()); $objWriter->endElement(); // c:dLbls\c:txPr\a:p\a:pPr\a:defRPr\ $objWriter->endElement(); // c:dLbls\c:txPr\a:p\a:pPr\ $objWriter->endElement(); // c:dLbls\c:txPr\a:p\a:endParaRPr $objWriter->startElement('a:endParaRPr'); $objWriter->writeAttribute('lang', 'en-US'); $objWriter->writeAttribute('dirty', '0'); $objWriter->endElement(); // c:dLbls\c:txPr\a:p\ $objWriter->endElement(); // c:dLbls\c:txPr\ $objWriter->endElement(); $separator = $series->getSeparator(); if (!empty($separator) && PHP_EOL != $separator) { // c:dLbls\c:separator $objWriter->writeElement('c:separator', $separator); } // c:dLbls\ $objWriter->endElement(); } $this->writeElementWithValAttribute($objWriter, 'c:firstSliceAng', '0'); $this->writeElementWithValAttribute($objWriter, 'c:holeSize', (string) $subject->getHoleSize()); $objWriter->endElement(); } /** * Write Type Pie. * * @param XMLWriter $objWriter XML Writer * @param Pie $subject * @param bool $includeSheet */ protected function writeTypePie(XMLWriter $objWriter, Pie $subject, bool $includeSheet = false): void { // c:pieChart $objWriter->startElement('c:pieChart'); // c:varyColors $objWriter->startElement('c:varyColors'); $objWriter->writeAttribute('val', '1'); $objWriter->endElement(); // Write series $seriesIndex = 0; foreach ($subject->getSeries() as $series) { // c:ser $objWriter->startElement('c:ser'); // c:idx $objWriter->startElement('c:idx'); $objWriter->writeAttribute('val', $seriesIndex); $objWriter->endElement(); // c:order $objWriter->startElement('c:order'); $objWriter->writeAttribute('val', $seriesIndex); $objWriter->endElement(); // c:tx $objWriter->startElement('c:tx'); $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex(1 + $seriesIndex) . '$1' : ''); $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords); $objWriter->endElement(); // Fills for points? $dataPointFills = $series->getDataPointFills(); foreach ($dataPointFills as $key => $value) { // c:dPt $objWriter->startElement('c:dPt'); $this->writeElementWithValAttribute($objWriter, 'c:idx', (string) $key); // c:dPt/c:spPr $objWriter->startElement('c:spPr'); $this->writeFill($objWriter, $value); // c:dPt/##c:spPr $objWriter->endElement(); // ##c:dPt $objWriter->endElement(); } // c:dLbls $objWriter->startElement('c:dLbls'); if ($series->hasDlblNumFormat()) { //c:numFmt $objWriter->startElement('c:numFmt'); $objWriter->writeAttribute('formatCode', $series->getDlblNumFormat()); $objWriter->writeAttribute('sourceLinked', '0'); $objWriter->endElement(); } // c:txPr $objWriter->startElement('c:txPr'); // a:bodyPr $objWriter->writeElement('a:bodyPr', null); // a:lstStyle $objWriter->writeElement('a:lstStyle', null); // a:p $objWriter->startElement('a:p'); // a:pPr $objWriter->startElement('a:pPr'); // a:defRPr $objWriter->startElement('a:defRPr'); $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false')); $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false')); $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike')); $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100)); $objWriter->writeAttribute('u', $series->getFont()->getUnderline()); $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '300000'); $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-250000'); // Font - a:solidFill $objWriter->startElement('a:solidFill'); $this->writeColor($objWriter, $series->getFont()->getColor()); $objWriter->endElement(); // Font - a:latin $objWriter->startElement('a:latin'); $objWriter->writeAttribute('typeface', $series->getFont()->getName()); $objWriter->endElement(); $objWriter->endElement(); $objWriter->endElement(); // a:endParaRPr $objWriter->startElement('a:endParaRPr'); $objWriter->writeAttribute('lang', 'en-US'); $objWriter->writeAttribute('dirty', '0'); $objWriter->endElement(); $objWriter->endElement(); $objWriter->endElement(); // c:dLblPos $this->writeElementWithValAttribute($objWriter, 'c:dLblPos', $series->getLabelPosition()); // c:showLegendKey $this->writeElementWithValAttribute($objWriter, 'c:showLegendKey', $series->hasShowLegendKey() ? '1' : '0'); // c:showVal $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0'); // c:showCatName $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0'); // c:showSerName $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0'); // c:showPercent $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0'); // c:showLeaderLines $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0'); $objWriter->endElement(); // Write X axis data $axisXData = \array_keys($series->getValues()); // c:cat $objWriter->startElement('c:cat'); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + \count($axisXData))); $objWriter->endElement(); // Write Y axis data $axisYData = \array_values($series->getValues()); // c:val $objWriter->startElement('c:val'); $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + \count($axisYData)) : ''); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords); $objWriter->endElement(); $objWriter->endElement(); ++$seriesIndex; } $objWriter->endElement(); } /** * Write Type Pie3D. * * @param XMLWriter $objWriter XML Writer * @param Pie3D $subject * @param bool $includeSheet */ protected function writeTypePie3D(XMLWriter $objWriter, Pie3D $subject, bool $includeSheet = false): void { // c:pie3DChart $objWriter->startElement('c:pie3DChart'); // c:varyColors $objWriter->startElement('c:varyColors'); $objWriter->writeAttribute('val', '1'); $objWriter->endElement(); // Write series $seriesIndex = 0; foreach ($subject->getSeries() as $series) { // c:ser $objWriter->startElement('c:ser'); // c:idx $objWriter->startElement('c:idx'); $objWriter->writeAttribute('val', $seriesIndex); $objWriter->endElement(); // c:order $objWriter->startElement('c:order'); $objWriter->writeAttribute('val', $seriesIndex); $objWriter->endElement(); // c:tx $objWriter->startElement('c:tx'); $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex(1 + $seriesIndex) . '$1' : ''); $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords); $objWriter->endElement(); // c:explosion $objWriter->startElement('c:explosion'); $objWriter->writeAttribute('val', $subject->getExplosion()); $objWriter->endElement(); // Fills for points? $dataPointFills = $series->getDataPointFills(); foreach ($dataPointFills as $key => $value) { // c:dPt $objWriter->startElement('c:dPt'); $this->writeElementWithValAttribute($objWriter, 'c:idx', (string) $key); // c:dPt/c:spPr $objWriter->startElement('c:spPr'); $this->writeFill($objWriter, $value); // c:dPt/##c:spPr $objWriter->endElement(); // ##c:dPt $objWriter->endElement(); } // c:dLbls $objWriter->startElement('c:dLbls'); // c:txPr $objWriter->startElement('c:txPr'); // a:bodyPr $objWriter->writeElement('a:bodyPr', null); // a:lstStyle $objWriter->writeElement('a:lstStyle', null); // a:p $objWriter->startElement('a:p'); // a:pPr $objWriter->startElement('a:pPr'); // a:defRPr $objWriter->startElement('a:defRPr'); $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false')); $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false')); $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike')); $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100)); $objWriter->writeAttribute('u', $series->getFont()->getUnderline()); $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '300000'); $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-250000'); // Font - a:solidFill $objWriter->startElement('a:solidFill'); $this->writeColor($objWriter, $series->getFont()->getColor()); $objWriter->endElement(); // Font - a:latin $objWriter->startElement('a:latin'); $objWriter->writeAttribute('typeface', $series->getFont()->getName()); $objWriter->endElement(); $objWriter->endElement(); $objWriter->endElement(); // a:endParaRPr $objWriter->startElement('a:endParaRPr'); $objWriter->writeAttribute('lang', 'en-US'); $objWriter->writeAttribute('dirty', '0'); $objWriter->endElement(); $objWriter->endElement(); $objWriter->endElement(); // c:dLblPos $this->writeElementWithValAttribute($objWriter, 'c:dLblPos', $series->getLabelPosition()); // c:showVal $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0'); // c:showCatName $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0'); // c:showSerName $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0'); // c:showPercent $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0'); // c:showLeaderLines $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0'); $objWriter->endElement(); // Write X axis data $axisXData = \array_keys($series->getValues()); // c:cat $objWriter->startElement('c:cat'); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + \count($axisXData))); $objWriter->endElement(); // Write Y axis data $axisYData = \array_values($series->getValues()); // c:val $objWriter->startElement('c:val'); $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + \count($axisYData)) : ''); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords); $objWriter->endElement(); $objWriter->endElement(); ++$seriesIndex; } $objWriter->endElement(); } /** * Write Type Line. * * @param XMLWriter $objWriter XML Writer * @param Line $subject * @param bool $includeSheet */ protected function writeTypeLine(XMLWriter $objWriter, Line $subject, bool $includeSheet = false): void { // c:lineChart $objWriter->startElement('c:lineChart'); // c:grouping $objWriter->startElement('c:grouping'); $objWriter->writeAttribute('val', 'standard'); $objWriter->endElement(); // Write series $seriesIndex = 0; foreach ($subject->getSeries() as $series) { // c:ser $objWriter->startElement('c:ser'); // c:idx $objWriter->startElement('c:idx'); $objWriter->writeAttribute('val', $seriesIndex); $objWriter->endElement(); // c:order $objWriter->startElement('c:order'); $objWriter->writeAttribute('val', $seriesIndex); $objWriter->endElement(); // c:tx $objWriter->startElement('c:tx'); $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex(1 + $seriesIndex) . '$1' : ''); $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords); $objWriter->endElement(); // c:spPr $objWriter->startElement('c:spPr'); // Write fill $this->writeFill($objWriter, $series->getFill()); // Write outline $this->writeOutline($objWriter, $series->getOutline()); // ## c:spPr $objWriter->endElement(); // Marker $this->writeSeriesMarker($objWriter, $series->getMarker()); // c:dLbls $objWriter->startElement('c:dLbls'); // c:txPr $objWriter->startElement('c:txPr'); // a:bodyPr $objWriter->writeElement('a:bodyPr', null); // a:lstStyle $objWriter->writeElement('a:lstStyle', null); // a:p $objWriter->startElement('a:p'); // a:pPr $objWriter->startElement('a:pPr'); // a:defRPr $objWriter->startElement('a:defRPr'); $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false')); $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false')); $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike')); $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100)); $objWriter->writeAttribute('u', $series->getFont()->getUnderline()); $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '300000'); $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-250000'); // Font - a:solidFill $objWriter->startElement('a:solidFill'); $this->writeColor($objWriter, $series->getFont()->getColor()); $objWriter->endElement(); // Font - a:latin $objWriter->startElement('a:latin'); $objWriter->writeAttribute('typeface', $series->getFont()->getName()); $objWriter->endElement(); $objWriter->endElement(); $objWriter->endElement(); // a:endParaRPr $objWriter->startElement('a:endParaRPr'); $objWriter->writeAttribute('lang', 'en-US'); $objWriter->writeAttribute('dirty', '0'); $objWriter->endElement(); $objWriter->endElement(); $objWriter->endElement(); // c:showVal $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0'); // c:showCatName $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0'); // c:showSerName $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0'); // c:showPercent $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0'); // c:showLeaderLines $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0'); // > c:dLbls $objWriter->endElement(); // Write X axis data $axisXData = \array_keys($series->getValues()); // c:cat $objWriter->startElement('c:cat'); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + \count($axisXData))); $objWriter->endElement(); // Write Y axis data $axisYData = \array_values($series->getValues()); // c:val $objWriter->startElement('c:val'); $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + \count($axisYData)) : ''); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords); $objWriter->endElement(); // c:smooth $objWriter->startElement('c:smooth'); $objWriter->writeAttribute('val', $subject->isSmooth() ? '1' : '0'); $objWriter->endElement(); $objWriter->endElement(); ++$seriesIndex; } // c:marker $objWriter->startElement('c:marker'); $objWriter->writeAttribute('val', '1'); $objWriter->endElement(); // c:axId $objWriter->startElement('c:axId'); $objWriter->writeAttribute('val', '52743552'); $objWriter->endElement(); // c:axId $objWriter->startElement('c:axId'); $objWriter->writeAttribute('val', '52749440'); $objWriter->endElement(); $objWriter->endElement(); } /** * Write Type Radar * * @param XMLWriter $objWriter XML Writer * @param Radar $subject * @param bool $includeSheet */ protected function writeTypeRadar(XMLWriter $objWriter, Radar $subject, bool $includeSheet = false): void { // c:scatterChart $objWriter->startElement('c:radarChart'); // c:radarStyle $objWriter->startElement('c:radarStyle'); $objWriter->writeAttribute('val', 'marker'); $objWriter->endElement(); // c:varyColors $objWriter->startElement('c:varyColors'); $objWriter->writeAttribute('val', '0'); $objWriter->endElement(); // Write series $seriesIndex = 0; foreach ($subject->getSeries() as $series) { // c:ser $objWriter->startElement('c:ser'); // c:idx $objWriter->startElement('c:idx'); $objWriter->writeAttribute('val', $seriesIndex); $objWriter->endElement(); // c:order $objWriter->startElement('c:order'); $objWriter->writeAttribute('val', $seriesIndex); $objWriter->endElement(); // c:tx $objWriter->startElement('c:tx'); $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex(1 + $seriesIndex) . '$1' : ''); $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords); $objWriter->endElement(); // Marker $this->writeSeriesMarker($objWriter, $series->getMarker()); // c:dLbls $objWriter->startElement('c:dLbls'); // c:txPr $objWriter->startElement('c:txPr'); // a:bodyPr $objWriter->writeElement('a:bodyPr', null); // a:lstStyle $objWriter->writeElement('a:lstStyle', null); // a:p $objWriter->startElement('a:p'); // a:pPr $objWriter->startElement('a:pPr'); // a:defRPr $objWriter->startElement('a:defRPr'); $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false')); $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false')); $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike')); $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100)); $objWriter->writeAttribute('u', $series->getFont()->getUnderline()); $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '30000'); $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-25000'); // Font - a:solidFill $objWriter->startElement('a:solidFill'); $this->writeColor($objWriter, $series->getFont()->getColor()); $objWriter->endElement(); // Font - a:latin $objWriter->startElement('a:latin'); $objWriter->writeAttribute('typeface', $series->getFont()->getName()); $objWriter->endElement(); $objWriter->endElement(); $objWriter->endElement(); // a:endParaRPr $objWriter->startElement('a:endParaRPr'); $objWriter->writeAttribute('lang', 'en-US'); $objWriter->writeAttribute('dirty', '0'); $objWriter->endElement(); $objWriter->endElement(); $objWriter->endElement(); // c:showLegendKey $this->writeElementWithValAttribute($objWriter, 'c:showLegendKey', $series->hasShowLegendKey() ? '1' : '0'); // c:showVal $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0'); // c:showCatName $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0'); // c:showSerName $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0'); // c:showPercent $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0'); // c:showLeaderLines $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0'); $objWriter->endElement(); // c:spPr $objWriter->startElement('c:spPr'); // Write fill $this->writeFill($objWriter, $series->getFill()); // Write outline $this->writeOutline($objWriter, $series->getOutline()); // ## c:spPr $objWriter->endElement(); // Write X axis data $axisXData = \array_keys($series->getValues()); // c:cat $objWriter->startElement('c:cat'); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + \count($axisXData))); $objWriter->endElement(); // Write Y axis data $axisYData = \array_values($series->getValues()); // c:val $objWriter->startElement('c:val'); $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + \count($axisYData)) : ''); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords); $objWriter->endElement(); // c:smooth $objWriter->startElement('c:smooth'); $objWriter->writeAttribute('val', '0'); $objWriter->endElement(); $objWriter->endElement(); ++$seriesIndex; } // c:axId $objWriter->startElement('c:axId'); $objWriter->writeAttribute('val', '52743552'); $objWriter->endElement(); // c:axId $objWriter->startElement('c:axId'); $objWriter->writeAttribute('val', '52749440'); $objWriter->endElement(); $objWriter->endElement(); } /** * Write Type Scatter * * @param XMLWriter $objWriter * @param Scatter $subject * @param bool $includeSheet */ protected function writeTypeScatter(XMLWriter $objWriter, Scatter $subject, bool $includeSheet = false): void { // c:scatterChart $objWriter->startElement('c:scatterChart'); // c:scatterStyle $objWriter->startElement('c:scatterStyle'); $objWriter->writeAttribute('val', 'lineMarker'); $objWriter->endElement(); // c:varyColors $objWriter->startElement('c:varyColors'); $objWriter->writeAttribute('val', '0'); $objWriter->endElement(); // Write series $seriesIndex = 0; foreach ($subject->getSeries() as $series) { // c:ser $objWriter->startElement('c:ser'); // c:idx $objWriter->startElement('c:idx'); $objWriter->writeAttribute('val', $seriesIndex); $objWriter->endElement(); // c:order $objWriter->startElement('c:order'); $objWriter->writeAttribute('val', $seriesIndex); $objWriter->endElement(); // c:tx $objWriter->startElement('c:tx'); $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex(1 + $seriesIndex) . '$1' : ''); $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords); $objWriter->endElement(); // c:spPr $objWriter->startElement('c:spPr'); // Write fill $this->writeFill($objWriter, $series->getFill()); // Write outline $this->writeOutline($objWriter, $series->getOutline()); // ## c:spPr $objWriter->endElement(); // Marker $this->writeSeriesMarker($objWriter, $series->getMarker()); // c:dLbls $objWriter->startElement('c:dLbls'); // c:txPr $objWriter->startElement('c:txPr'); // a:bodyPr $objWriter->writeElement('a:bodyPr', null); // a:lstStyle $objWriter->writeElement('a:lstStyle', null); // a:p $objWriter->startElement('a:p'); // a:pPr $objWriter->startElement('a:pPr'); // a:defRPr $objWriter->startElement('a:defRPr'); $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false')); $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false')); $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike')); $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100)); $objWriter->writeAttribute('u', $series->getFont()->getUnderline()); $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '300000'); $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-250000'); // Font - a:solidFill $objWriter->startElement('a:solidFill'); $this->writeColor($objWriter, $series->getFont()->getColor()); $objWriter->endElement(); // Font - a:latin $objWriter->startElement('a:latin'); $objWriter->writeAttribute('typeface', $series->getFont()->getName()); $objWriter->endElement(); $objWriter->endElement(); $objWriter->endElement(); // a:endParaRPr $objWriter->startElement('a:endParaRPr'); $objWriter->writeAttribute('lang', 'en-US'); $objWriter->writeAttribute('dirty', '0'); $objWriter->endElement(); $objWriter->endElement(); $objWriter->endElement(); // c:showLegendKey $this->writeElementWithValAttribute($objWriter, 'c:showLegendKey', $series->hasShowLegendKey() ? '1' : '0'); // c:showVal $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0'); // c:showCatName $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0'); // c:showSerName $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0'); // c:showPercent $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0'); // c:separator $separator = $series->getSeparator(); if (!empty($separator) && PHP_EOL != $separator) { // c:dLbls\c:separator $objWriter->writeElement('c:separator', $separator); } // c:showLeaderLines $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0'); $objWriter->endElement(); // Write X axis data $axisXData = \array_keys($series->getValues()); // c:xVal $objWriter->startElement('c:xVal'); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + \count($axisXData))); $objWriter->endElement(); // Write Y axis data $axisYData = \array_values($series->getValues()); // c:yVal $objWriter->startElement('c:yVal'); $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + \count($axisYData)) : ''); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords); $objWriter->endElement(); // c:smooth $objWriter->startElement('c:smooth'); $objWriter->writeAttribute('val', $subject->isSmooth() ? '1' : '0'); $objWriter->endElement(); $objWriter->endElement(); ++$seriesIndex; } // c:axId $objWriter->startElement('c:axId'); $objWriter->writeAttribute('val', '52743552'); $objWriter->endElement(); // c:axId $objWriter->startElement('c:axId'); $objWriter->writeAttribute('val', '52749440'); $objWriter->endElement(); $objWriter->endElement(); } /** * Write chart relationships to XML format. * * @param Chart $pChart * * @return string XML Output */ protected function writeChartRelationships(Chart $pChart): string { // Create XML writer $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); // XML header $objWriter->startDocument('1.0', 'UTF-8', 'yes'); // Relationships $objWriter->startElement('Relationships'); $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships'); // Write spreadsheet relationship? if ($pChart->hasIncludedSpreadsheet()) { $this->writeRelationship($objWriter, 1, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/package', '../embeddings/' . $pChart->getIndexedFilename() . '.xlsx'); } $objWriter->endElement(); // Return return $objWriter->getData(); } /** * @param XMLWriter $objWriter * @param Chart\Marker $marker */ protected function writeSeriesMarker(XMLWriter $objWriter, Chart\Marker $marker): void { // c:marker $objWriter->startElement('c:marker'); // c:marker > c:symbol $objWriter->startElement('c:symbol'); $objWriter->writeAttribute('val', $marker->getSymbol()); $objWriter->endElement(); // Size if different of none if (Chart\Marker::SYMBOL_NONE != $marker->getSymbol()) { $markerSize = (int) $marker->getSize(); if ($markerSize < 2) { $markerSize = 2; } if ($markerSize > 72) { $markerSize = 72; } /* * c:marker > c:size * Size in points * @link : https://msdn.microsoft.com/en-us/library/hh658135(v=office.12).aspx */ $objWriter->startElement('c:size'); $objWriter->writeAttribute('val', $markerSize); $objWriter->endElement(); } // // c:marker > c:spPr $objWriter->startElement('c:spPr'); $this->writeFill($objWriter, $marker->getFill()); $this->writeBorder($objWriter, $marker->getBorder(), '', true); $objWriter->endElement(); // > c:marker $objWriter->endElement(); } /** * @param XMLWriter $objWriter * @param Chart\Axis $oAxis * @param string $typeAxis * @param Chart\Type\AbstractType $typeChart */ protected function writeAxis(XMLWriter $objWriter, Chart\Axis $oAxis, string $typeAxis, Chart\Type\AbstractType $typeChart): void { if (Chart\Axis::AXIS_X != $typeAxis && Chart\Axis::AXIS_Y != $typeAxis) { return; } $crossesAt = $oAxis->getCrossesAt(); $orientation = $oAxis->isReversedOrder() ? 'maxMin' : 'minMax'; if (Chart\Axis::AXIS_X == $typeAxis) { $mainElement = 'c:catAx'; $axIdVal = '52743552'; $axPosVal = $crossesAt === 'max' ? 't' : 'b'; $crossAxVal = '52749440'; } else { $mainElement = 'c:valAx'; $axIdVal = '52749440'; $axPosVal = $crossesAt === 'max' ? 'r' : 'l'; $crossAxVal = '52743552'; } // $mainElement $objWriter->startElement($mainElement); // $mainElement > c:axId $objWriter->startElement('c:axId'); $objWriter->writeAttribute('val', $axIdVal); $objWriter->endElement(); // $mainElement > c:scaling $objWriter->startElement('c:scaling'); // $mainElement > c:scaling > c:orientation $objWriter->startElement('c:orientation'); $objWriter->writeAttribute('val', $orientation); $objWriter->endElement(); if (null != $oAxis->getMaxBounds()) { $objWriter->startElement('c:max'); $objWriter->writeAttribute('val', $oAxis->getMaxBounds()); $objWriter->endElement(); } if (null != $oAxis->getMinBounds()) { $objWriter->startElement('c:min'); $objWriter->writeAttribute('val', $oAxis->getMinBounds()); $objWriter->endElement(); } // $mainElement > ##c:scaling $objWriter->endElement(); // $mainElement > c:delete $objWriter->startElement('c:delete'); $objWriter->writeAttribute('val', $oAxis->isVisible() ? '0' : '1'); $objWriter->endElement(); // $mainElement > c:axPos $objWriter->startElement('c:axPos'); $objWriter->writeAttribute('val', $axPosVal); $objWriter->endElement(); $oMajorGridlines = $oAxis->getMajorGridlines(); if ($oMajorGridlines instanceof Gridlines) { $objWriter->startElement('c:majorGridlines'); $this->writeAxisGridlines($objWriter, $oMajorGridlines); $objWriter->endElement(); } $oMinorGridlines = $oAxis->getMinorGridlines(); if ($oMinorGridlines instanceof Gridlines) { $objWriter->startElement('c:minorGridlines'); $this->writeAxisGridlines($objWriter, $oMinorGridlines); $objWriter->endElement(); } if ('' != $oAxis->getTitle()) { // c:title $objWriter->startElement('c:title'); // c:tx $objWriter->startElement('c:tx'); // c:rich $objWriter->startElement('c:rich'); // a:bodyPr $objWriter->startElement('a:bodyPr'); $objWriter->writeAttributeIf($oAxis->getTitleRotation() != 0, 'rot', CommonDrawing::degreesToAngle((int) $oAxis->getTitleRotation())); $objWriter->endElement(); // a:lstStyle $objWriter->writeElement('a:lstStyle', null); // a:p $objWriter->startElement('a:p'); // a:pPr $objWriter->startElement('a:pPr'); // a:defRPr $objWriter->startElement('a:defRPr'); $objWriter->writeAttribute('b', ($oAxis->getFont()->isBold() ? 'true' : 'false')); $objWriter->writeAttribute('i', ($oAxis->getFont()->isItalic() ? 'true' : 'false')); $objWriter->writeAttribute('strike', ($oAxis->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike')); $objWriter->writeAttribute('sz', ($oAxis->getFont()->getSize() * 100)); $objWriter->writeAttribute('u', $oAxis->getFont()->getUnderline()); $objWriter->writeAttributeIf($oAxis->getFont()->isSuperScript(), 'baseline', '300000'); $objWriter->writeAttributeIf($oAxis->getFont()->isSubScript(), 'baseline', '-250000'); // Font - a:solidFill $objWriter->startElement('a:solidFill'); $this->writeColor($objWriter, $oAxis->getFont()->getColor()); $objWriter->endElement(); // Font - a:latin $objWriter->startElement('a:latin'); $objWriter->writeAttribute('typeface', $oAxis->getFont()->getName()); $objWriter->endElement(); $objWriter->endElement(); // ## a:pPr $objWriter->endElement(); // a:r $objWriter->startElement('a:r'); // a:rPr $objWriter->startElement('a:rPr'); $objWriter->writeAttribute('lang', 'en-US'); $objWriter->writeAttribute('dirty', '0'); $objWriter->endElement(); // a:t $objWriter->writeElement('a:t', $oAxis->getTitle()); // ## a:r $objWriter->endElement(); // a:endParaRPr $objWriter->startElement('a:endParaRPr'); $objWriter->writeAttribute('lang', 'en-US'); $objWriter->writeAttribute('dirty', '0'); $objWriter->endElement(); // ## a:p $objWriter->endElement(); // ## c:rich $objWriter->endElement(); // ## c:tx $objWriter->endElement(); // ## c:title $objWriter->endElement(); } // c:numFmt $objWriter->startElement('c:numFmt'); $objWriter->writeAttribute('formatCode', $oAxis->getFormatCode()); $objWriter->writeAttribute('sourceLinked', '1'); $objWriter->endElement(); // c:majorTickMark $objWriter->startElement('c:majorTickMark'); $objWriter->writeAttribute('val', $oAxis->getMajorTickMark()); $objWriter->endElement(); // c:minorTickMark $objWriter->startElement('c:minorTickMark'); $objWriter->writeAttribute('val', $oAxis->getMinorTickMark()); $objWriter->endElement(); // c:tickLblPos $objWriter->startElement('c:tickLblPos'); $objWriter->writeAttribute('val', $oAxis->getTickLabelPosition()); $objWriter->endElement(); // c:spPr $objWriter->startElement('c:spPr'); // Outline $this->writeOutline($objWriter, $oAxis->getOutline()); // ##c:spPr $objWriter->endElement(); // c:crossAx $objWriter->startElement('c:crossAx'); $objWriter->writeAttribute('val', $crossAxVal); $objWriter->endElement(); // c:crosses "autoZero" | "min" | "max" | custom string value if (\in_array($crossesAt, ['autoZero', 'min', 'max'])) { $objWriter->startElement('c:crosses'); $objWriter->writeAttribute('val', $crossesAt); $objWriter->endElement(); } else { $objWriter->startElement('c:crossesAt'); $objWriter->writeAttribute('val', $crossesAt); $objWriter->endElement(); } if (Chart\Axis::AXIS_X == $typeAxis) { // c:lblAlgn $objWriter->startElement('c:lblAlgn'); $objWriter->writeAttribute('val', 'ctr'); $objWriter->endElement(); // c:lblOffset $objWriter->startElement('c:lblOffset'); $objWriter->writeAttribute('val', '100'); $objWriter->endElement(); // c:majorUnit if ($oAxis->getMajorUnit() != null) { $objWriter->startElement('c:tickLblSkip'); $objWriter->writeAttribute('val', $oAxis->getMajorUnit()); $objWriter->endElement(); } } if (Chart\Axis::AXIS_Y == $typeAxis) { // c:crossBetween $objWriter->startElement('c:crossBetween'); // midCat : Position Axis On Tick Marks // between : Between Tick Marks if ($typeChart instanceof Area) { $objWriter->writeAttribute('val', 'midCat'); } else { $objWriter->writeAttribute('val', 'between'); } $objWriter->endElement(); // c:majorUnit if (null != $oAxis->getMajorUnit()) { $objWriter->startElement('c:majorUnit'); $objWriter->writeAttribute('val', $oAxis->getMajorUnit()); $objWriter->endElement(); } // c:minorUnit if (null != $oAxis->getMinorUnit()) { $objWriter->startElement('c:minorUnit'); $objWriter->writeAttribute('val', $oAxis->getMinorUnit()); $objWriter->endElement(); } } $objWriter->endElement(); } /** * @param XMLWriter $objWriter * @param Gridlines $oGridlines */ protected function writeAxisGridlines(XMLWriter $objWriter, Gridlines $oGridlines): void { // c:spPr $objWriter->startElement('c:spPr'); // Outline $this->writeOutline($objWriter, $oGridlines->getOutline()); // ##c:spPr $objWriter->endElement(); } }