123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320 |
- <?php
- /**
- * This file is part of PHPWord - A pure PHP library for reading and writing
- * word processing documents.
- *
- * PHPWord is free software distributed under the terms of the GNU Lesser
- * General Public License version 3 as published by the Free Software Foundation.
- *
- * For the full copyright and license information, please read the LICENSE
- * file that was distributed with this source code. For the full list of
- * contributors, visit https://github.com/PHPOffice/PHPWord/contributors.
- *
- * @link https://github.com/PHPOffice/PHPWord
- * @copyright 2010-2014 PHPWord contributors
- * @license http://www.gnu.org/licenses/lgpl.txt LGPL version 3
- */
-
- namespace PhpOffice\PhpWord\Writer\Word2007\Part;
-
- use PhpOffice\PhpWord\Element\Chart as ChartElement;
- use PhpOffice\PhpWord\Shared\XMLWriter;
-
- /**
- * Word2007 chart part writer: word/charts/chartx.xml
- *
- * @since 0.12.0
- * @link http://www.datypic.com/sc/ooxml/e-draw-chart_chartSpace.html
- */
- class Chart extends AbstractPart
- {
- /**
- * Chart element
- *
- * @var \PhpOffice\PhpWord\Element\Chart $element
- */
- private $element;
-
- /**
- * Type definition
- *
- * @var array
- */
- private $types = array(
- 'pie' => array('type' => 'pie', 'colors' => 1),
- 'doughnut' => array('type' => 'doughnut', 'colors' => 1, 'hole' => 75, 'no3d' => true),
- 'bar' => array('type' => 'bar', 'colors' => 0, 'axes' => true, 'bar' => 'bar'),
- 'column' => array('type' => 'bar', 'colors' => 0, 'axes' => true, 'bar' => 'col'),
- 'line' => array('type' => 'line', 'colors' => 0, 'axes' => true),
- 'area' => array('type' => 'area', 'colors' => 0, 'axes' => true),
- 'radar' => array('type' => 'radar', 'colors' => 0, 'axes' => true, 'radar' => 'standard', 'no3d' => true),
- 'scatter' => array('type' => 'scatter', 'colors' => 0, 'axes' => true, 'scatter' => 'marker', 'no3d' => true),
- );
-
- /**
- * Chart options
- *
- * @var array
- */
- private $options = array();
-
- /**
- * Set chart element.
- *
- * @param \PhpOffice\PhpWord\Element\Chart $element
- * @return void
- */
- public function setElement(ChartElement $element)
- {
- $this->element = $element;
- }
-
- /**
- * Write part
- *
- * @return string
- */
- public function write()
- {
- $xmlWriter = $this->getXmlWriter();
-
- $xmlWriter->startDocument('1.0', 'UTF-8', 'yes');
- $xmlWriter->startElement('c:chartSpace');
- $xmlWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart');
- $xmlWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main');
- $xmlWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
-
- $this->writeChart($xmlWriter);
- $this->writeShape($xmlWriter);
-
- $xmlWriter->endElement(); // c:chartSpace
-
- return $xmlWriter->getData();
- }
-
- /**
- * Write chart
- *
- * @link http://www.datypic.com/sc/ooxml/t-draw-chart_CT_Chart.html
- * @param \PhpOffice\PhpWord\Shared\XMLWriter $xmlWriter
- * @return void
- */
- private function writeChart(XMLWriter $xmlWriter)
- {
- $xmlWriter->startElement('c:chart');
-
- $xmlWriter->writeElementBlock('c:autoTitleDeleted', 'val', 1);
-
- $this->writePlotArea($xmlWriter);
-
- $xmlWriter->endElement(); // c:chart
- }
-
- /**
- * Write plot area.
- *
- * @link http://www.datypic.com/sc/ooxml/t-draw-chart_CT_PlotArea.html
- * @link http://www.datypic.com/sc/ooxml/t-draw-chart_CT_PieChart.html
- * @link http://www.datypic.com/sc/ooxml/t-draw-chart_CT_DoughnutChart.html
- * @link http://www.datypic.com/sc/ooxml/t-draw-chart_CT_BarChart.html
- * @link http://www.datypic.com/sc/ooxml/t-draw-chart_CT_LineChart.html
- * @link http://www.datypic.com/sc/ooxml/t-draw-chart_CT_AreaChart.html
- * @link http://www.datypic.com/sc/ooxml/t-draw-chart_CT_RadarChart.html
- * @link http://www.datypic.com/sc/ooxml/t-draw-chart_CT_ScatterChart.html
- * @param \PhpOffice\PhpWord\Shared\XMLWriter $xmlWriter
- * @return void
- */
- private function writePlotArea(XMLWriter $xmlWriter)
- {
- $type = $this->element->getType();
- $style = $this->element->getStyle();
- $this->options = $this->types[$type];
-
- $xmlWriter->startElement('c:plotArea');
- $xmlWriter->writeElement('c:layout');
-
- // Chart
- $chartType = $this->options['type'];
- $chartType .= $style->is3d() && !isset($this->options['no3d'])? '3D' : '';
- $chartType .= 'Chart';
- $xmlWriter->startElement("c:{$chartType}");
-
- $xmlWriter->writeElementBlock('c:varyColors', 'val', $this->options['colors']);
- if ($type == 'area') {
- $xmlWriter->writeElementBlock('c:grouping', 'val', 'standard');
- }
- if (isset($this->options['hole'])) {
- $xmlWriter->writeElementBlock('c:holeSize', 'val', $this->options['hole']);
- }
- if (isset($this->options['bar'])) {
- $xmlWriter->writeElementBlock('c:barDir', 'val', $this->options['bar']); // bar|col
- $xmlWriter->writeElementBlock('c:grouping', 'val', 'clustered'); // 3d; standard = percentStacked
- }
- if (isset($this->options['radar'])) {
- $xmlWriter->writeElementBlock('c:radarStyle', 'val', $this->options['radar']);
- }
- if (isset($this->options['scatter'])) {
- $xmlWriter->writeElementBlock('c:scatterStyle', 'val', $this->options['scatter']);
- }
-
- // Series
- $this->writeSeries($xmlWriter, isset($this->options['scatter']));
-
- // Axes
- if (isset($this->options['axes'])) {
- $xmlWriter->writeElementBlock('c:axId', 'val', 1);
- $xmlWriter->writeElementBlock('c:axId', 'val', 2);
- }
-
- $xmlWriter->endElement(); // chart type
-
- // Axes
- if (isset($this->options['axes'])) {
- $this->writeAxis($xmlWriter, 'cat');
- $this->writeAxis($xmlWriter, 'val');
- }
-
- $xmlWriter->endElement(); // c:plotArea
- }
-
- /**
- * Write series.
- *
- * @param \PhpOffice\PhpWord\Shared\XMLWriter $xmlWriter
- * @param bool $scatter
- * @return void
- */
- private function writeSeries(XMLWriter $xmlWriter, $scatter = false)
- {
- $series = $this->element->getSeries();
-
- $index = 0;
- foreach ($series as $seriesItem) {
- $categories = $seriesItem['categories'];
- $values = $seriesItem['values'];
-
- $xmlWriter->startElement('c:ser');
-
- $xmlWriter->writeElementBlock('c:idx', 'val', $index);
- $xmlWriter->writeElementBlock('c:order', 'val', $index);
-
- if (isset($this->options['scatter'])) {
- $this->writeShape($xmlWriter);
- }
-
- if ($scatter === true) {
- $this->writeSeriesItem($xmlWriter, 'xVal', $categories);
- $this->writeSeriesItem($xmlWriter, 'yVal', $values);
- } else {
- $this->writeSeriesItem($xmlWriter, 'cat', $categories);
- $this->writeSeriesItem($xmlWriter, 'val', $values);
- }
-
- $xmlWriter->endElement(); // c:ser
- $index++;
- }
-
- }
-
- /**
- * Write series items.
- *
- * @param \PhpOffice\PhpWord\Shared\XMLWriter $xmlWriter
- * @param string $type
- * @param array $values
- * @return void
- */
- private function writeSeriesItem(XMLWriter $xmlWriter, $type, $values)
- {
- $types = array(
- 'cat' => array('c:cat', 'c:strLit'),
- 'val' => array('c:val', 'c:numLit'),
- 'xVal' => array('c:xVal', 'c:strLit'),
- 'yVal' => array('c:yVal', 'c:numLit'),
- );
- list($itemType, $itemLit) = $types[$type];
-
- $xmlWriter->startElement($itemType);
- $xmlWriter->startElement($itemLit);
-
- $index = 0;
- foreach ($values as $value) {
- $xmlWriter->startElement('c:pt');
- $xmlWriter->writeAttribute('idx', $index);
-
- $xmlWriter->startElement('c:v');
- $xmlWriter->writeRaw($value);
- $xmlWriter->endElement(); // c:v
-
- $xmlWriter->endElement(); // c:pt
- $index++;
- }
-
- $xmlWriter->endElement(); // $itemLit
- $xmlWriter->endElement(); // $itemType
- }
-
- /**
- * Write axis
- *
- * @link http://www.datypic.com/sc/ooxml/t-draw-chart_CT_CatAx.html
- * @param \PhpOffice\PhpWord\Shared\XMLWriter $xmlWriter
- * @param string $type
- * @return void
- */
- private function writeAxis(XMLWriter $xmlWriter, $type)
- {
- $types = array(
- 'cat' => array('c:catAx', 1, 'b', 2),
- 'val' => array('c:valAx', 2, 'l', 1),
- );
- list($axisType, $axisId, $axisPos, $axisCross) = $types[$type];
-
- $xmlWriter->startElement($axisType);
-
- $xmlWriter->writeElementBlock('c:axId', 'val', $axisId);
- $xmlWriter->writeElementBlock('c:axPos', 'val', $axisPos);
- $xmlWriter->writeElementBlock('c:crossAx', 'val', $axisCross);
- $xmlWriter->writeElementBlock('c:auto', 'val', 1);
-
- if (isset($this->options['axes'])) {
- $xmlWriter->writeElementBlock('c:delete', 'val', 0);
- $xmlWriter->writeElementBlock('c:majorTickMark', 'val', 'none');
- $xmlWriter->writeElementBlock('c:minorTickMark', 'val', 'none');
- $xmlWriter->writeElementBlock('c:tickLblPos', 'val', 'none'); // nextTo
- $xmlWriter->writeElementBlock('c:crosses', 'val', 'autoZero');
- }
- if (isset($this->options['radar'])) {
- $xmlWriter->writeElement('c:majorGridlines');
- }
-
- $xmlWriter->startElement('c:scaling');
- $xmlWriter->writeElementBlock('c:orientation', 'val', 'minMax');
- $xmlWriter->endElement(); // c:scaling
-
- $this->writeShape($xmlWriter, true);
-
- $xmlWriter->endElement(); // $axisType
- }
-
- /**
- * Write shape
- *
- * @link http://www.datypic.com/sc/ooxml/t-a_CT_ShapeProperties.html
- * @param \PhpOffice\PhpWord\Shared\XMLWriter $xmlWriter
- * @param bool $line
- * @return void
- */
- private function writeShape(XMLWriter $xmlWriter, $line = false)
- {
- $xmlWriter->startElement('c:spPr');
- $xmlWriter->startElement('a:ln');
- if ($line === true) {
- $xmlWriter->writeElement('a:solidFill');
- } else {
- $xmlWriter->writeElement('a:noFill');
- }
- $xmlWriter->endElement(); // a:ln
- $xmlWriter->endElement(); // c:spPr
- }
- }
|