Skip to content

Commit

Permalink
PowerPoint2007 Writer : Support for Area Chart - @Progi1984 GH-82
Browse files Browse the repository at this point in the history
  • Loading branch information
Progi1984 committed Jun 12, 2015
1 parent 921c405 commit be4de54
Show file tree
Hide file tree
Showing 6 changed files with 259 additions and 6 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,4 @@ vendor
/samples/#47
/samples/#70
/samples/#71
/samples/Github_*.*
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
- ODPresentation Writer : Support for fill in RichText - @Progi1984 GH-79
- ODPresentation Writer : Support for border style in RichText - @Progi1984 GH-79
- ODPresentation Writer : Support for Area Chart - @Progi1984 GH-82
- PowerPoint2007 Writer : Support for Area Chart - @Progi1984 GH-82

### Bugfix
- PSR-0 via composer broken - @Progi1984 GH-51
Expand Down
4 changes: 0 additions & 4 deletions samples/.gitignore

This file was deleted.

2 changes: 1 addition & 1 deletion samples/Sample_Header.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
/**
* Write documents
*
* @param \PhpOffice\PhpWord\PhpWord $phpWord
* @param \PhpOffice\PhpPowerPoint\PhpPowerPoint $phpPowerPoint
* @param string $filename
* @param array $writers
*/
Expand Down
180 changes: 179 additions & 1 deletion src/PhpPowerpoint/Writer/PowerPoint2007/Chart.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
use PhpOffice\PhpPowerpoint\Shape\Chart\Legend;
use PhpOffice\PhpPowerpoint\Shape\Chart\PlotArea;
use PhpOffice\PhpPowerpoint\Shape\Chart\Title;
use PhpOffice\PhpPowerpoint\Shape\Chart\Type\Area;
use PhpOffice\PhpPowerpoint\Shape\Chart\Type\Bar3D;
use PhpOffice\PhpPowerpoint\Shape\Chart\Type\Line;
use PhpOffice\PhpPowerpoint\Shape\Chart\Type\Pie3D;
Expand Down Expand Up @@ -498,7 +499,9 @@ protected function writePlotArea(XMLWriter $objWriter, PlotArea $subject, ShapeC

// Write chart
$chartType = $subject->getType();
if ($chartType instanceof Bar3D) {
if ($chartType instanceof Area) {
$this->writeTypeArea($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
} elseif ($chartType instanceof Bar3D) {
$this->writeTypeBar3D($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
} elseif ($chartType instanceof Pie3D) {
$this->writeTypePie3D($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
Expand Down Expand Up @@ -893,6 +896,181 @@ protected function writeLayout(XMLWriter $objWriter, $subject)
$objWriter->endElement();
}

/**
* Write Type Line
*
* @param \PhpOffice\PhpPowerpoint\Shared\XMLWriter $objWriter XML Writer
* @param \PhpOffice\PhpPowerpoint\Shape\Chart\Type\Area $subject
* @param boolean $includeSheet
* @throws \Exception
*/
protected function writeTypeArea(XMLWriter $objWriter, Area $subject, $includeSheet = false)
{
// c:lineChart
$objWriter->startElement('c:areaChart');

// c:grouping
$objWriter->startElement('c:grouping');
$objWriter->writeAttribute('val', 'standard');
$objWriter->endElement();

// Write series
$seriesIndex = 0;
foreach ($subject->getData() 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!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
$this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
$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());

if ($series->getFont()->isSuperScript() || $series->getFont()->isSubScript()) {
if ($series->getFont()->isSuperScript()) {
$objWriter->writeAttribute('baseline', '30000');
} elseif ($series->getFont()->isSubScript()) {
$objWriter->writeAttribute('baseline', '-25000');
}
}

// Font - a:solidFill
$objWriter->startElement('a:solidFill');

// a:srgbClr
$objWriter->startElement('a:srgbClr');
$objWriter->writeAttribute('val', $series->getFont()->getColor()->getRGB());
$objWriter->endElement();

$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();

if ($series->getFill()->getFillType() != Fill::FILL_NONE) {
// 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!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
$this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
$objWriter->endElement();

$objWriter->endElement();

++$seriesIndex;
}

// c:marker
$objWriter->startElement('c:marker');
$objWriter->writeAttribute('val', '1');
$objWriter->endElement();

// c:smooth
$objWriter->startElement('c:smooth');
$objWriter->writeAttribute('val', '0');
$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 Bar3D
*
Expand Down
77 changes: 77 additions & 0 deletions tests/PhpPowerpoint/Tests/Writer/PowerPoint2007/ChartAreaTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
<?php
/**
* This file is part of PHPPowerPoint - A pure PHP library for reading and writing
* presentations documents.
*
* PHPPowerPoint 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/PHPPowerPoint/contributors.
*
* @copyright 2009-2014 PHPPowerPoint contributors
* @license http://www.gnu.org/licenses/lgpl.txt LGPL version 3
* @link https://github.com/PHPOffice/PHPPowerPoint
*/

namespace PhpOffice\PhpPowerpoint\Tests\Writer\PowerPoint2007;

use PhpOffice\PhpPowerpoint\PhpPowerpoint;
use PhpOffice\PhpPowerpoint\Shape\Chart\Series;
use PhpOffice\PhpPowerpoint\Shape\Chart\Type\Area;
use PhpOffice\PhpPowerpoint\Style\Color;
use PhpOffice\PhpPowerpoint\Style\Fill;
use PhpOffice\PhpPowerpoint\Tests\TestHelperDOCX;
use PhpOffice\PhpPowerpoint\Writer\PowerPoint2007;
use PhpOffice\PhpPowerpoint\Writer\PowerPoint2007\Chart;

/**
* Test class for PowerPoint2007
*
* @coversDefaultClass PowerPoint2007
*/
class ChartAreaTest extends \PHPUnit_Framework_TestCase
{
/**
* Executed before each method of the class
*/
public function tearDown()
{
TestHelperDOCX::clear();
}

public function testTypeArea()
{
$seriesData = array(
'A' => 1,
'B' => 2,
'C' => 4,
'D' => 3,
'E' => 2,
);

$oPHPPowerPoint = new PhpPowerpoint();
$oSlide = $oPHPPowerPoint->getActiveSlide();
$oShape = $oSlide->createChartShape();
$oShape->setResizeProportional(false)->setHeight(550)->setWidth(700)->setOffsetX(120)->setOffsetY(80);
$oArea = new Area();
$oSeries = new Series('Downloads', $seriesData);
$oSeries->getFill()->setStartColor(new Color('FFAABBCC'));
$oArea->addSeries($oSeries);
$oShape->getPlotArea()->setType($oArea);

$oXMLDoc = TestHelperDOCX::getDocument($oPHPPowerPoint, 'PowerPoint2007');

$element = '/p:sld/p:cSld/p:spTree/p:graphicFrame/a:graphic/a:graphicData';
$this->assertTrue($oXMLDoc->elementExists($element, 'ppt/slides/slide1.xml'));
$element = '/c:chartSpace/c:chart/c:plotArea/c:areaChart';
$this->assertTrue($oXMLDoc->elementExists($element, 'ppt/charts/'.$oShape->getIndexedFilename()));
$element = '/c:chartSpace/c:chart/c:plotArea/c:areaChart/c:ser';
$this->assertTrue($oXMLDoc->elementExists($element, 'ppt/charts/'.$oShape->getIndexedFilename()));
$element = '/c:chartSpace/c:chart/c:plotArea/c:areaChart/c:ser/c:dPt/c:spPr';
$this->assertTrue($oXMLDoc->elementExists($element, 'ppt/charts/'.$oShape->getIndexedFilename()));
$element = '/c:chartSpace/c:chart/c:plotArea/c:areaChart/c:ser/c:tx/c:v';
$this->assertEquals($oSeries->getTitle(), $oXMLDoc->getElement($element, 'ppt/charts/'.$oShape->getIndexedFilename())->nodeValue);
}
}

0 comments on commit be4de54

Please sign in to comment.