/** * Write table Shape * @param XMLWriter $objWriter * @param Table $shape */ public function writeShapeTable(XMLWriter $objWriter, Table $shape) { // draw:frame $objWriter->startElement('draw:frame'); $objWriter->writeAttribute('svg:x', Text::numberFormat(CommonDrawing::pixelsToCentimeters($shape->getOffsetX()), 3) . 'cm'); $objWriter->writeAttribute('svg:y', Text::numberFormat(CommonDrawing::pixelsToCentimeters($shape->getOffsetY()), 3) . 'cm'); $objWriter->writeAttribute('svg:height', Text::numberFormat(CommonDrawing::pixelsToCentimeters($shape->getHeight()), 3) . 'cm'); $objWriter->writeAttribute('svg:width', Text::numberFormat(CommonDrawing::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' . $this->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' . $this->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) { if ($shapeRichText instanceof TextElement || $shapeRichText instanceof Run) { // text:span $objWriter->startElement('text:span'); if ($shapeRichText instanceof Run) { $objWriter->writeAttribute('text:style-name', 'T_' . $shapeRichText->getFont()->getHashCode()); } if ($shapeRichText->hasHyperlink() === true && $shapeRichText->getHyperlink()->getUrl() != '') { // text:a $objWriter->startElement('text:a'); $objWriter->writeAttribute('xlink:href', $shapeRichText->getHyperlink()->getUrl()); $objWriter->text($shapeRichText->getText()); $objWriter->endElement(); } else { $objWriter->text($shapeRichText->getText()); } $objWriter->endElement(); } elseif ($shapeRichText instanceof BreakElement) { // text:span $objWriter->startElement('text:span'); // text:line-break $objWriter->startElement('text:line-break'); $objWriter->endElement(); $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(); }
/** * Write table * * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer * @param \PhpOffice\PhpPresentation\Shape\Table $shape * @param int $shapeId * @throws \Exception */ private function writeShapeTable(XMLWriter $objWriter, ShapeTable $shape, $shapeId) { // p:graphicFrame $objWriter->startElement('p:graphicFrame'); // p:nvGraphicFramePr $objWriter->startElement('p:nvGraphicFramePr'); // p:cNvPr $objWriter->startElement('p:cNvPr'); $objWriter->writeAttribute('id', $shapeId); $objWriter->writeAttribute('name', $shape->getName()); $objWriter->writeAttribute('descr', $shape->getDescription()); $objWriter->endElement(); // p:cNvGraphicFramePr $objWriter->startElement('p:cNvGraphicFramePr'); // a:graphicFrameLocks $objWriter->startElement('a:graphicFrameLocks'); $objWriter->writeAttribute('noGrp', '1'); $objWriter->endElement(); $objWriter->endElement(); // p:nvPr $objWriter->writeElement('p:nvPr', null); $objWriter->endElement(); // p:xfrm $objWriter->startElement('p:xfrm'); // a:off $objWriter->startElement('a:off'); $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX())); $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY())); $objWriter->endElement(); // a:ext $objWriter->startElement('a:ext'); $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth())); $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight())); $objWriter->endElement(); $objWriter->endElement(); // a:graphic $objWriter->startElement('a:graphic'); // a:graphicData $objWriter->startElement('a:graphicData'); $objWriter->writeAttribute('uri', 'http://schemas.openxmlformats.org/drawingml/2006/table'); // a:tbl $objWriter->startElement('a:tbl'); // a:tblPr $objWriter->startElement('a:tblPr'); $objWriter->writeAttribute('firstRow', '1'); $objWriter->writeAttribute('bandRow', '1'); $objWriter->endElement(); // a:tblGrid $objWriter->startElement('a:tblGrid'); // Write cell widths $countCells = count($shape->getRow(0)->getCells()); for ($cell = 0; $cell < $countCells; $cell++) { // a:gridCol $objWriter->startElement('a:gridCol'); // Calculate column width $width = $shape->getRow(0)->getCell($cell)->getWidth(); if ($width == 0) { $colCount = count($shape->getRow(0)->getCells()); $totalWidth = $shape->getWidth(); $width = $totalWidth / $colCount; } $objWriter->writeAttribute('w', CommonDrawing::pixelsToEmu($width)); $objWriter->endElement(); } $objWriter->endElement(); // Colspan / rowspan containers $colSpan = array(); $rowSpan = array(); // Default border style $defaultBorder = new Border(); // Write rows $countRows = count($shape->getRows()); for ($row = 0; $row < $countRows; $row++) { // a:tr $objWriter->startElement('a:tr'); $objWriter->writeAttribute('h', CommonDrawing::pixelsToEmu($shape->getRow($row)->getHeight())); // Write cells $countCells = count($shape->getRow($row)->getCells()); for ($cell = 0; $cell < $countCells; $cell++) { // Current cell $currentCell = $shape->getRow($row)->getCell($cell); // Next cell right $nextCellRight = $shape->getRow($row)->getCell($cell + 1, true); // Next cell below $nextRowBelow = $shape->getRow($row + 1, true); $nextCellBelow = null; if ($nextRowBelow != null) { $nextCellBelow = $nextRowBelow->getCell($cell, true); } // a:tc $objWriter->startElement('a:tc'); // Colspan if ($currentCell->getColSpan() > 1) { $objWriter->writeAttribute('gridSpan', $currentCell->getColSpan()); $colSpan[$row] = $currentCell->getColSpan() - 1; } elseif (isset($colSpan[$row]) && $colSpan[$row] > 0) { $colSpan[$row]--; $objWriter->writeAttribute('hMerge', '1'); } // Rowspan if ($currentCell->getRowSpan() > 1) { $objWriter->writeAttribute('rowSpan', $currentCell->getRowSpan()); $rowSpan[$cell] = $currentCell->getRowSpan() - 1; } elseif (isset($rowSpan[$cell]) && $rowSpan[$cell] > 0) { $rowSpan[$cell]--; $objWriter->writeAttribute('vMerge', '1'); } // a:txBody $objWriter->startElement('a:txBody'); // a:bodyPr $objWriter->startElement('a:bodyPr'); $objWriter->writeAttribute('wrap', 'square'); $objWriter->writeAttribute('rtlCol', '0'); // a:spAutoFit $objWriter->writeElement('a:spAutoFit', null); $objWriter->endElement(); // a:lstStyle $objWriter->writeElement('a:lstStyle', null); // Write paragraphs $this->writeParagraphs($objWriter, $currentCell->getParagraphs()); $objWriter->endElement(); // a:tcPr $objWriter->startElement('a:tcPr'); // Alignment (horizontal) $firstParagraph = $currentCell->getParagraph(0); $verticalAlign = $firstParagraph->getAlignment()->getVertical(); if ($verticalAlign != Alignment::VERTICAL_BASE && $verticalAlign != Alignment::VERTICAL_AUTO) { $objWriter->writeAttribute('anchor', $verticalAlign); } // Determine borders $borderLeft = $currentCell->getBorders()->getLeft(); $borderRight = $currentCell->getBorders()->getRight(); $borderTop = $currentCell->getBorders()->getTop(); $borderBottom = $currentCell->getBorders()->getBottom(); $borderDiagonalDown = $currentCell->getBorders()->getDiagonalDown(); $borderDiagonalUp = $currentCell->getBorders()->getDiagonalUp(); // Fix PowerPoint implementation if (!is_null($nextCellRight) && $nextCellRight->getBorders()->getRight()->getHashCode() != $defaultBorder->getHashCode()) { $borderRight = $nextCellRight->getBorders()->getLeft(); } if (!is_null($nextCellBelow) && $nextCellBelow->getBorders()->getBottom()->getHashCode() != $defaultBorder->getHashCode()) { $borderBottom = $nextCellBelow->getBorders()->getTop(); } // Write borders $this->writeBorder($objWriter, $borderLeft, 'L'); $this->writeBorder($objWriter, $borderRight, 'R'); $this->writeBorder($objWriter, $borderTop, 'T'); $this->writeBorder($objWriter, $borderBottom, 'B'); $this->writeBorder($objWriter, $borderDiagonalDown, 'TlToBr'); $this->writeBorder($objWriter, $borderDiagonalUp, 'BlToTr'); // Fill $this->writeFill($objWriter, $currentCell->getFill()); $objWriter->endElement(); $objWriter->endElement(); } $objWriter->endElement(); } $objWriter->endElement(); $objWriter->endElement(); $objWriter->endElement(); $objWriter->endElement(); }