Fix colspan and rowspan for tables in HTML Writer
This commit is contained in:
parent
59de019881
commit
557af99a6d
@ -40,19 +40,60 @@ class Table extends AbstractElement
|
|||||||
$rowCount = count($rows);
|
$rowCount = count($rows);
|
||||||
if ($rowCount > 0) {
|
if ($rowCount > 0) {
|
||||||
$content .= '<table>' . PHP_EOL;
|
$content .= '<table>' . PHP_EOL;
|
||||||
foreach ($rows as $row) {
|
for ($i = 0; $i < count($rows); $i++) {
|
||||||
/** @var $row \PhpOffice\PhpWord\Element\Row Type hint */
|
/** @var $row \PhpOffice\PhpWord\Element\Row Type hint */
|
||||||
$rowStyle = $row->getStyle();
|
$rowStyle = $rows[$i]->getStyle();
|
||||||
// $height = $row->getHeight();
|
// $height = $row->getHeight();
|
||||||
$tblHeader = $rowStyle->isTblHeader();
|
$tblHeader = $rowStyle->isTblHeader();
|
||||||
$content .= '<tr>' . PHP_EOL;
|
$content .= '<tr>' . PHP_EOL;
|
||||||
foreach ($row->getCells() as $cell) {
|
$rowCells = $rows[$i]->getCells();
|
||||||
$writer = new Container($this->parentWriter, $cell);
|
for ($j = 0; $j < count($rowCells); $j++) {
|
||||||
|
$cellStyle = $rowCells[$j]->getStyle();
|
||||||
|
$cellColSpan = $cellStyle->getGridSpan();
|
||||||
|
$cellRowSpan = 1;
|
||||||
|
$cellVMerge = $cellStyle->getVMerge();
|
||||||
|
// If this is the first cell of the vertical merge, find out how man rows it spans
|
||||||
|
if ($cellVMerge === 'restart') {
|
||||||
|
for ($k = $i + 1; $k < count($rows); $k++) {
|
||||||
|
$kRowCells = $rows[$k]->getCells();
|
||||||
|
if (isset($kRowCells[$j])) {
|
||||||
|
if ($kRowCells[$j]->getStyle()->getVMerge() === 'continue') {
|
||||||
|
$cellRowSpan++;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Ignore cells that are merged vertically with previous rows
|
||||||
|
if ($cellVMerge !== 'continue') {
|
||||||
$cellTag = $tblHeader ? 'th' : 'td';
|
$cellTag = $tblHeader ? 'th' : 'td';
|
||||||
$content .= "<{$cellTag}>" . PHP_EOL;
|
$cellColSpanAttr = (is_numeric($cellColSpan) && ($cellColSpan > 1) ? " colspan=\"{$cellColSpan}\"" : "");
|
||||||
|
$cellRowSpanAttr = ($cellRowSpan > 1 ? " rowspan=\"{$cellRowSpan}\"" : "");
|
||||||
|
$content .= "<{$cellTag}{$cellColSpanAttr}{$cellRowSpanAttr}>" . PHP_EOL;
|
||||||
|
$writer = new Container($this->parentWriter, $rowCells[$j]);
|
||||||
$content .= $writer->write();
|
$content .= $writer->write();
|
||||||
|
if ($cellRowSpan > 1) {
|
||||||
|
// There shouldn't be any content in the subsequent merged cells, but lets check anyway
|
||||||
|
for ($k = $i + 1; $k < count($rows); $k++) {
|
||||||
|
$kRowCells = $rows[$k]->getCells();
|
||||||
|
if (isset($kRowCells[$j])) {
|
||||||
|
if ($kRowCells[$j]->getStyle()->getVMerge() === 'continue') {
|
||||||
|
$writer = new Container($this->parentWriter, $kRowCells[$j]);
|
||||||
|
$content .= $writer->write();
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
$content .= "</{$cellTag}>" . PHP_EOL;
|
$content .= "</{$cellTag}>" . PHP_EOL;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
$content .= '</tr>' . PHP_EOL;
|
$content .= '</tr>' . PHP_EOL;
|
||||||
}
|
}
|
||||||
$content .= '</table>' . PHP_EOL;
|
$content .= '</table>' . PHP_EOL;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user