Skip to content

Commit

Permalink
#31 : Support for tables in ODPresentation
Browse files Browse the repository at this point in the history
  • Loading branch information
Progi1984 committed Jul 3, 2014
1 parent 924a765 commit 627da39
Show file tree
Hide file tree
Showing 3 changed files with 217 additions and 11 deletions.
4 changes: 2 additions & 2 deletions src/PhpPowerpoint/Style/Border.php
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ public function __construct()
}

/**
* Get line width
* Get line width (in points)
*
* @return int
*/
Expand All @@ -103,7 +103,7 @@ public function getLineWidth()
}

/**
* Set line width
* Set line width (in points)
*
* @param int $pValue
* @return \PhpOffice\PhpPowerpoint\Style\Border
Expand Down
189 changes: 181 additions & 8 deletions src/PhpPowerpoint/Writer/ODPresentation/Content.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,13 @@
use PhpOffice\PhpPowerpoint\Shape\RichText\TextElement;
use PhpOffice\PhpPowerpoint\Shape\RichText;
use PhpOffice\PhpPowerpoint\Shape\Table;
use PhpOffice\PhpPowerpoint\Shape\Table\Cell;
use PhpOffice\PhpPowerpoint\Shape\Table\Row;
use PhpOffice\PhpPowerpoint\Shared\Drawing as SharedDrawing;
use PhpOffice\PhpPowerpoint\Shared\XMLWriter;
use PhpOffice\PhpPowerpoint\Style\Alignment;
use PhpOffice\PhpPowerpoint\Style\Border;
use PhpOffice\PhpPowerpoint\Style\Fill;

/**
* \PhpOffice\PhpPowerpoint\Writer\ODPresentation\Content
Expand Down Expand Up @@ -97,10 +100,8 @@ public function writeContent(PHPPowerPoint $pPHPPowerPoint = null)
// office:automatic-styles
$objWriter->startElement('office:automatic-styles');

$slideCount = $pPHPPowerPoint->getSlideCount();
$shapeId = 0;
for ($i = 0; $i < $slideCount; ++$i) {
$pSlide = $pPHPPowerPoint->getSlide($i);
foreach ($pPHPPowerPoint->getAllSlides() as $pSlide){
// Images
$shapes = $pSlide->getShapeCollection();
foreach ($shapes as $shape) {
Expand Down Expand Up @@ -227,6 +228,106 @@ public function writeContent(PHPPowerPoint $pPHPPowerPoint = null)

$objWriter->endElement();
}
if ($shape instanceof Table) {
foreach ($shape->getRows() as $keyRow => $shapeRow) {
// style:style
$objWriter->startElement('style:style');
$objWriter->writeAttribute('style:name', 'gr' . $shapeId.'r'.$keyRow);
$objWriter->writeAttribute('style:family', 'table-row');

// style:table-row-properties
$objWriter->startElement('style:table-row-properties');
$objWriter->writeAttribute('style:row-height', number_format(SharedDrawing::pixelsToCentimeters(SharedDrawing::pointsToPixels($shapeRow->getHeight())), 3).'cm');
$objWriter->endElement();

$objWriter->endElement();

foreach ($shapeRow->getCells() as $keyCell => $shapeCell) {
// style:style
$objWriter->startElement('style:style');
$objWriter->writeAttribute('style:name', 'gr' . $shapeId.'r'.$keyRow.'c'.$keyCell);
$objWriter->writeAttribute('style:family', 'table-cell');

// style:graphic-properties
$objWriter->startElement('style:graphic-properties');
if($shapeCell->getFill()->getFillType() == Fill::FILL_SOLID){
$objWriter->writeAttribute('draw:fill', 'solid');
$objWriter->writeAttribute('draw:fill-color', '#'.$shapeCell->getFill()->getStartColor()->getRGB());;
}
if($shapeCell->getFill()->getFillType() == Fill::FILL_GRADIENT_LINEAR){
$objWriter->writeAttribute('draw:fill', 'gradient');
$objWriter->writeAttribute('draw:fill-gradient-name', 'gradient_'.$shapeCell->getFill()->getHashCode());
}
$objWriter->endElement();
// <style:graphic-properties

// style:paragraph-properties
$objWriter->startElement('style:paragraph-properties');
if($shapeCell->getBorders()->getBottom()->getHashCode() == $shapeCell->getBorders()->getTop()->getHashCode()
&& $shapeCell->getBorders()->getBottom()->getHashCode() == $shapeCell->getBorders()->getLeft()->getHashCode()
&& $shapeCell->getBorders()->getBottom()->getHashCode() == $shapeCell->getBorders()->getRight()->getHashCode()){
$lineStyle = 'none';
$lineWidth = number_format($shapeCell->getBorders()->getBottom()->getLineWidth() / 1.75, 2);
$lineColor = $shapeCell->getBorders()->getBottom()->getColor()->getRGB();
switch ($shapeCell->getBorders()->getBottom()->getLineStyle()){
case Border::LINE_SINGLE:
$lineStyle = 'solid';
}
$objWriter->writeAttribute('fo:border', $lineWidth.'pt '.$lineStyle.' #'.$lineColor);
} else {
$lineStyle = 'none';
$lineWidth = number_format($shapeCell->getBorders()->getBottom()->getLineWidth() / 1.75, 2);
$lineColor = $shapeCell->getBorders()->getBottom()->getColor()->getRGB();
switch ($shapeCell->getBorders()->getBottom()->getLineStyle()){
case Border::LINE_SINGLE:
$lineStyle = 'solid';
}
$objWriter->writeAttribute('fo:border-bottom', $lineWidth.'pt '.$lineStyle.' #'.$lineColor);
// TOP
$lineStyle = 'none';
$lineWidth = number_format($shapeCell->getBorders()->getTop()->getLineWidth() / 1.75, 2);
$lineColor = $shapeCell->getBorders()->getTop()->getColor()->getRGB();
switch ($shapeCell->getBorders()->getTop()->getLineStyle()){
case Border::LINE_SINGLE:
$lineStyle = 'solid';
}
$objWriter->writeAttribute('fo:border-top', $lineWidth.'pt '.$lineStyle.' #'.$lineColor);
// RIGHT
$lineStyle = 'none';
$lineWidth = number_format($shapeCell->getBorders()->getRight()->getLineWidth() / 1.75, 2);
$lineColor = $shapeCell->getBorders()->getRight()->getColor()->getRGB();
switch ($shapeCell->getBorders()->getRight()->getLineStyle()){
case Border::LINE_SINGLE:
$lineStyle = 'solid';
}
$objWriter->writeAttribute('fo:border-right', $lineWidth.'pt '.$lineStyle.' #'.$lineColor);
// LEFT
$lineStyle = 'none';
$lineWidth = number_format($shapeCell->getBorders()->getLeft()->getLineWidth() / 1.75, 2);
$lineColor = $shapeCell->getBorders()->getLeft()->getColor()->getRGB();
switch ($shapeCell->getBorders()->getLeft()->getLineStyle()){
case Border::LINE_SINGLE:
$lineStyle = 'solid';
}
$objWriter->writeAttribute('fo:border-left', $lineWidth.'pt '.$lineStyle.' #'.$lineColor);
}
$objWriter->endElement();

$objWriter->endElement();

foreach ($shapeCell->getParagraphs() as $shapeParagraph){
foreach ($shapeParagraph->getRichTextElements() as $shapeRichText){
if ($shapeRichText instanceof Run) {
// Style des font text
if (!isset($arrStyleTextFont[$shapeRichText->getFont()->getHashCode()])) {
$arrStyleTextFont[$shapeRichText->getFont()->getHashCode()] = $shapeRichText->getFont();
}
}
}
}
}
}
}
}
}
// Style : Bullet
Expand Down Expand Up @@ -349,15 +450,13 @@ public function writeContent(PHPPowerPoint $pPHPPowerPoint = null)
// Check type
if ($shape instanceof RichText) {
$this->writeTxt($objWriter, $shape, $shapeId);
/*
elseif ($shape instanceof Table) {
$this->_writeTable($objWriter, $shape, $shapeId);*/
} elseif ($shape instanceof Table) {
$this->writeShapeTable($objWriter, $shape, $shapeId);
} elseif ($shape instanceof Line) {
$this->writeShapeLine($objWriter, $shape, $shapeId);
/*} elseif ($shape instanceof Chart) {
$this->_writeChart($objWriter, $shape, $shapeId);
}
*/
}*/
} elseif ($shape instanceof AbstractDrawing) {
$this->writePic($objWriter, $shape, $shapeId);
}
Expand Down Expand Up @@ -563,6 +662,12 @@ public function writeTxt(XMLWriter $objWriter, RichText $shape, $shapeId)
$objWriter->endElement();
}

/**
*
* @param XMLWriter $objWriter
* @param Line $shape
* @param integer $shapeId
*/
public function writeShapeLine(XMLWriter $objWriter, Line $shape, $shapeId)
{
// draw:line
Expand All @@ -578,4 +683,72 @@ public function writeShapeLine(XMLWriter $objWriter, Line $shape, $shapeId)

$objWriter->endElement();
}

/**
* Write table Shape
* @param XMLWriter $objWriter
* @param Table $shape
* @param integer $shapeId
*/
public function writeShapeTable(XMLWriter $objWriter, Table $shape, $shapeId)
{
// draw:frame
$objWriter->startElement('draw:frame');
$objWriter->writeAttribute('svg:x', number_format(SharedDrawing::pixelsToCentimeters($shape->getOffsetX()), 3) . 'cm');
$objWriter->writeAttribute('svg:y', number_format(SharedDrawing::pixelsToCentimeters($shape->getOffsetY()), 3) . 'cm');
$objWriter->writeAttribute('svg:height', number_format(SharedDrawing::pixelsToCentimeters($shape->getHeight()), 3) . 'cm');
$objWriter->writeAttribute('svg:width', number_format(SharedDrawing::pixelsToCentimeters($shape->getWidth()), 3) . 'cm');

// table:table
$objWriter->startElement('table:table');

foreach ($shape->getRows() as $keyRow => $shapeRow) {
// table:table-row
$objWriter->startElement('table:table-row');
$objWriter->writeAttribute('table:style-name', 'gr'.$shapeId.'r'.$keyRow);
//@todo getFill

$numColspan = 0;
foreach ($shapeRow->getCells() as $keyCell => $shapeCell){
if ($numColspan == 0) {
// table:table-cell
$objWriter->startElement('table:table-cell');
$objWriter->writeAttribute('table:style-name', 'gr' . $shapeId.'r'.$keyRow.'c'.$keyCell);
if ($shapeCell->getColspan() > 1) {
$objWriter->writeAttribute('table:number-columns-spanned', $shapeCell->getColspan());
$numColspan = $shapeCell->getColspan() - 1;
}

// text:p
$objWriter->startElement('text:p');

// text:span
foreach ($shapeCell->getParagraphs() as $shapeParagraph){
foreach ($shapeParagraph->getRichTextElements() as $shapeRichText){
$objWriter->startElement('text:span');
$objWriter->writeAttribute('text:style-name', 'T_' . $shapeRichText->getFont()->getHashCode());
$objWriter->text($shapeRichText->getText());
$objWriter->endElement();
}
}

// > text:p
$objWriter->endElement();

// > table:table-cell
$objWriter->endElement();
} else {
// table:covered-table-cell
$objWriter->writeElement('table:covered-table-cell');
$numColspan--;
}
}
// > table:table-row
$objWriter->endElement();
}
// > table:table
$objWriter->endElement();
// > draw:frame
$objWriter->endElement();
}
}
35 changes: 34 additions & 1 deletion src/PhpPowerpoint/Writer/ODPresentation/Styles.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@
namespace PhpOffice\PhpPowerpoint\Writer\ODPresentation;

use PhpOffice\PhpPowerpoint\PhpPowerpoint;
use PhpOffice\PhpPowerpoint\Shape\Table;
use PhpOffice\PhpPowerpoint\Shared\Drawing;
use PhpOffice\PhpPowerpoint\Style\Fill;

/**
* \PhpOffice\PhpPowerpoint\Writer\ODPresentation\Styles
Expand Down Expand Up @@ -88,8 +90,39 @@ public function writeStyles(PHPPowerPoint $pPHPPowerPoint = null)
// style:graphic-properties
$objWriter->startElement('style:graphic-properties');
$objWriter->writeAttribute('draw:fill-color', '#ffffff');
// > style:graphic-properties
$objWriter->endElement();
// > style:style
$objWriter->endElement();
// draw:gradient
$arrayGradient = array();
foreach ($pPHPPowerPoint->getAllSlides() as $slide){
foreach ($slide->getShapeCollection() as $shape){
if($shape instanceof Table){
foreach ($shape->getRows() as $row){
foreach ($row->getCells() as $cell){
if($cell->getFill()->getFillType() == Fill::FILL_GRADIENT_LINEAR){
if(!in_array($cell->getFill()->getHashCode(), $arrayGradient)){
$objWriter->startElement('draw:gradient');
$objWriter->writeAttribute('draw:name', 'gradient_'.$cell->getFill()->getHashCode());
$objWriter->writeAttribute('draw:display-name', 'gradient_'.$cell->getFill()->getHashCode());
$objWriter->writeAttribute('draw:style', 'linear');
$objWriter->writeAttribute('draw:start-intensity', '100%');
$objWriter->writeAttribute('draw:end-intensity', '100%');
$objWriter->writeAttribute('draw:start-color', '#'.$cell->getFill()->getStartColor()->getRGB());
$objWriter->writeAttribute('draw:end-color', '#'.$cell->getFill()->getEndColor()->getRGB());
$objWriter->writeAttribute('draw:border', '0%');
$objWriter->writeAttribute('draw:angle', $cell->getFill()->getRotation() - 90);
$objWriter->endElement();
$arrayGradient[] = $cell->getFill()->getHashCode();
}
}
}
}
}
}
}
// > office:styles
$objWriter->endElement();

// office:automatic-styles
Expand Down Expand Up @@ -132,7 +165,7 @@ public function writeStyles(PHPPowerPoint $pPHPPowerPoint = null)
$objWriter->writeAttribute('draw:style-name', 'sPres0');
$objWriter->endElement();
$objWriter->endElement();

$objWriter->endElement();

// Return
Expand Down

0 comments on commit 627da39

Please sign in to comment.