private function buildTable(\DOMDocument $dom, array $data): \DOMElement
{
$rows = $data['rows'] ?? $data;
$first = reset($rows);
$headers = $data['headers'] ?? array_combine(array_keys($first), array_keys($first));
$el = function (string $name, array $attrs = [], array $children = []) use ($dom) {
$e = $dom->createElement($name);
foreach ($attrs as $k => $v) {
$e->setAttribute($k, $v);
}
foreach ($children as $c) {
$e->appendChild($c);
}
return $e;
};
$cell = function ($text, bool $bold = false) use ($dom, $el) {
$t = $el('w:t', ['xml:space' => 'preserve'], [$dom->createTextNode((string) $text)]);
$r = $el('w:r', [], $bold ? [$el('w:rPr', [], [$el('w:b')]), $t] : [$t]);
return $el('w:tc', [], [$el('w:p', [], [$r])]);
};
$borders = $el('w:tblBorders');
foreach (['top', 'left', 'bottom', 'right', 'insideH', 'insideV'] as $side) {
$borders->appendChild($el("w:$side", [
'w:val' => 'single', 'w:sz' => '4', 'w:space' => '0', 'w:color' => '000000',
]));
}
$grid = $el('w:tblGrid');
foreach ($headers as $_) {
$grid->appendChild($el('w:gridCol'));
}
$tbl = $el('w:tbl', [], [
$el('w:tblPr', [], [$el('w:tblW', ['w:w' => '5000', 'w:type' => 'pct']), $borders]),
$grid,
]);
// Header row (repeats on every page)
$head = $el('w:tr', [], [$el('w:trPr', [], [$el('w:tblHeader')])]);
foreach ($headers as $label) {
$head->appendChild($cell($label, true));
}
$tbl->appendChild($head);
foreach ($rows as $row) {
$tr = $el('w:tr');
foreach (array_keys($headers) as $k) {
$tr->appendChild($cell($row[$k] ?? ''));
}
$tbl->appendChild($tr);
}
return $tbl;
}3 views