1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace PhpOffice\PhpSpreadsheet\Writer\Xlsx; |
4
|
|
|
|
5
|
|
|
use PhpOffice\PhpSpreadsheet\Cell\Coordinate; |
6
|
|
|
use PhpOffice\PhpSpreadsheet\Reader\Xlsx\Namespaces; |
7
|
|
|
use PhpOffice\PhpSpreadsheet\Shared\XMLWriter; |
8
|
|
|
use PhpOffice\PhpSpreadsheet\Worksheet\Table as WorksheetTable; |
9
|
|
|
|
10
|
|
|
class Table extends WriterPart |
11
|
|
|
{ |
12
|
|
|
/** |
13
|
|
|
* Write Table to XML format. |
14
|
|
|
* |
15
|
|
|
* @param int $tableRef Table ID |
16
|
|
|
* |
17
|
|
|
* @return string XML Output |
18
|
|
|
*/ |
19
|
9 |
|
public function writeTable(WorksheetTable $table, int $tableRef): string |
20
|
|
|
{ |
21
|
|
|
// Create XML writer |
22
|
9 |
|
$objWriter = null; |
23
|
9 |
|
if ($this->getParentWriter()->getUseDiskCaching()) { |
24
|
|
|
$objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); |
25
|
|
|
} else { |
26
|
9 |
|
$objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); |
27
|
|
|
} |
28
|
|
|
|
29
|
|
|
// XML header |
30
|
9 |
|
$objWriter->startDocument('1.0', 'UTF-8', 'yes'); |
31
|
|
|
|
32
|
|
|
// Table |
33
|
9 |
|
$name = 'Table' . $tableRef; |
34
|
9 |
|
$range = $table->getRange(); |
35
|
|
|
|
36
|
9 |
|
$objWriter->startElement('table'); |
37
|
9 |
|
$objWriter->writeAttribute('xmlns', Namespaces::MAIN); |
38
|
9 |
|
$objWriter->writeAttribute('id', (string) $tableRef); |
39
|
9 |
|
$objWriter->writeAttribute('name', $name); |
40
|
9 |
|
$objWriter->writeAttribute('displayName', $table->getName() ?: $name); |
41
|
9 |
|
$objWriter->writeAttribute('ref', $range); |
42
|
9 |
|
$objWriter->writeAttribute('headerRowCount', $table->getShowHeaderRow() ? '1' : '0'); |
43
|
9 |
|
$objWriter->writeAttribute('totalsRowCount', $table->getShowTotalsRow() ? '1' : '0'); |
44
|
|
|
|
45
|
|
|
// Table Boundaries |
46
|
9 |
|
[$rangeStart, $rangeEnd] = Coordinate::rangeBoundaries($table->getRange()); |
47
|
|
|
|
48
|
|
|
// Table Auto Filter |
49
|
9 |
|
if ($table->getShowHeaderRow() && $table->getAllowFilter() === true) { |
50
|
8 |
|
$objWriter->startElement('autoFilter'); |
51
|
8 |
|
$objWriter->writeAttribute('ref', $range); |
52
|
8 |
|
foreach (range($rangeStart[0], $rangeEnd[0]) as $offset => $columnIndex) { |
53
|
8 |
|
$column = $table->getColumnByOffset($offset); |
54
|
|
|
|
55
|
8 |
|
if (!$column->getShowFilterButton()) { |
56
|
2 |
|
$objWriter->startElement('filterColumn'); |
57
|
2 |
|
$objWriter->writeAttribute('colId', (string) $offset); |
58
|
2 |
|
$objWriter->writeAttribute('hiddenButton', '1'); |
59
|
2 |
|
$objWriter->endElement(); |
60
|
|
|
} else { |
61
|
8 |
|
$column = $table->getAutoFilter()->getColumnByOffset($offset); |
62
|
8 |
|
AutoFilter::writeAutoFilterColumn($objWriter, $column, $offset); |
63
|
|
|
} |
64
|
|
|
} |
65
|
8 |
|
$objWriter->endElement(); // autoFilter |
66
|
|
|
} |
67
|
|
|
|
68
|
|
|
// Table Columns |
69
|
9 |
|
$objWriter->startElement('tableColumns'); |
70
|
9 |
|
$objWriter->writeAttribute('count', (string) ($rangeEnd[0] - $rangeStart[0] + 1)); |
71
|
9 |
|
foreach (range($rangeStart[0], $rangeEnd[0]) as $offset => $columnIndex) { |
72
|
9 |
|
$worksheet = $table->getWorksheet(); |
73
|
9 |
|
if (!$worksheet) { |
74
|
|
|
continue; |
75
|
|
|
} |
76
|
|
|
|
77
|
9 |
|
$column = $table->getColumnByOffset($offset); |
78
|
9 |
|
$cell = $worksheet->getCell([$columnIndex, $rangeStart[1]]); |
79
|
|
|
|
80
|
9 |
|
$objWriter->startElement('tableColumn'); |
81
|
9 |
|
$objWriter->writeAttribute('id', (string) ($offset + 1)); |
82
|
9 |
|
$objWriter->writeAttribute('name', $table->getShowHeaderRow() ? $cell->getValueString() : ('Column' . ($offset + 1))); |
83
|
|
|
|
84
|
9 |
|
if ($table->getShowTotalsRow()) { |
85
|
2 |
|
if ($column->getTotalsRowLabel()) { |
86
|
2 |
|
$objWriter->writeAttribute('totalsRowLabel', $column->getTotalsRowLabel()); |
87
|
|
|
} |
88
|
2 |
|
if ($column->getTotalsRowFunction()) { |
89
|
2 |
|
$objWriter->writeAttribute('totalsRowFunction', $column->getTotalsRowFunction()); |
90
|
|
|
} |
91
|
|
|
} |
92
|
9 |
|
if ($column->getColumnFormula()) { |
93
|
4 |
|
$objWriter->writeElement('calculatedColumnFormula', $column->getColumnFormula()); |
94
|
|
|
} |
95
|
|
|
|
96
|
9 |
|
$objWriter->endElement(); |
97
|
|
|
} |
98
|
9 |
|
$objWriter->endElement(); |
99
|
|
|
|
100
|
|
|
// Table Styles |
101
|
9 |
|
$objWriter->startElement('tableStyleInfo'); |
102
|
9 |
|
$objWriter->writeAttribute('name', $table->getStyle()->getTheme()); |
103
|
9 |
|
$objWriter->writeAttribute('showFirstColumn', $table->getStyle()->getShowFirstColumn() ? '1' : '0'); |
104
|
9 |
|
$objWriter->writeAttribute('showLastColumn', $table->getStyle()->getShowLastColumn() ? '1' : '0'); |
105
|
9 |
|
$objWriter->writeAttribute('showRowStripes', $table->getStyle()->getShowRowStripes() ? '1' : '0'); |
106
|
9 |
|
$objWriter->writeAttribute('showColumnStripes', $table->getStyle()->getShowColumnStripes() ? '1' : '0'); |
107
|
9 |
|
$objWriter->endElement(); |
108
|
|
|
|
109
|
9 |
|
$objWriter->endElement(); |
110
|
|
|
|
111
|
|
|
// Return |
112
|
9 |
|
return $objWriter->getData(); |
113
|
|
|
} |
114
|
|
|
} |
115
|
|
|
|