PluginProbe
wpDataTables – WordPress Data Table, Dynamic Tables & Table Charts Plugin / 6.5.1.7
wpDataTables – WordPress Data Table, Dynamic Tables & Table Charts Plugin v6.5.1.7
6.5.1.7 6.5.1.6 6.5.1.5 6.5.1.4 6.5.1.3 6.5.1.2 6.5.1.1 6.5.0.9 6.5.0.8 6.5.0.7 6.5.0.6 trunk 3.4.2.40 3.4.2.41 3.4.2.42 3.4.2.43 3.4.2.44 3.4.2.45 3.4.2.46 3.4.2.47 3.4.2.48 3.4.2.49 3.4.2.50 6.3.2 6.3.3.1 All 47 releases
wpdatatables / lib / phpoffice / phpspreadsheet / src / PhpSpreadsheet / Writer / Xlsx / StringTable.php

StringTable.php in wpDataTables – WordPress Data Table, Dynamic Tables & Table Charts Plugin 6.5.1.7, at lib/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/StringTable.php

347 lines 12.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace PhpOffice\PhpSpreadsheet\Writer\Xlsx;
4
5 use PhpOffice\PhpSpreadsheet\Cell\Cell;
6 use PhpOffice\PhpSpreadsheet\Cell\DataType;
7 use PhpOffice\PhpSpreadsheet\Chart\ChartColor;
8 use PhpOffice\PhpSpreadsheet\Reader\Xlsx\Namespaces;
9 use PhpOffice\PhpSpreadsheet\RichText\RichText;
10 use PhpOffice\PhpSpreadsheet\RichText\Run;
11 use PhpOffice\PhpSpreadsheet\Shared\StringHelper;
12 use PhpOffice\PhpSpreadsheet\Shared\XMLWriter;
13 use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet as ActualWorksheet;
14
15 class StringTable extends WriterPart
16 {
17 /**
18 * Create worksheet stringtable.
19 *
20 * @param string[] $existingTable Existing table to eventually merge with
21 *
22 * @return string[] String table for worksheet
23 */
24 public function createStringTable(ActualWorksheet $worksheet, $existingTable = null)
25 {
26 // Create string lookup table
27 $aStringTable = [];
28
29 // Is an existing table given?
30 if (($existingTable !== null) && is_array($existingTable)) {
31 $aStringTable = $existingTable;
32 }
33
34 // Fill index array
35 $aFlippedStringTable = $this->flipStringTable($aStringTable);
36
37 // Loop through cells
38 foreach ($worksheet->getCellCollection()->getCoordinates() as $coordinate) {
39 /** @var Cell $cell */
40 $cell = $worksheet->getCellCollection()->get($coordinate);
41 $cellValue = $cell->getValue();
42 if (
43 !is_object($cellValue) &&
44 ($cellValue !== null) &&
45 $cellValue !== '' &&
46 ($cell->getDataType() == DataType::TYPE_STRING || $cell->getDataType() == DataType::TYPE_STRING2 || $cell->getDataType() == DataType::TYPE_NULL) &&
47 !isset($aFlippedStringTable[$cellValue])
48 ) {
49 $aStringTable[] = $cellValue;
50 $aFlippedStringTable[$cellValue] = true;
51 } elseif (
52 $cellValue instanceof RichText &&
53 ($cellValue !== null) &&
54 !isset($aFlippedStringTable[$cellValue->getHashCode()])
55 ) {
56 $aStringTable[] = $cellValue;
57 $aFlippedStringTable[$cellValue->getHashCode()] = true;
58 }
59 }
60
61 return $aStringTable;
62 }
63
64 /**
65 * Write string table to XML format.
66 *
67 * @param (RichText|string)[] $stringTable
68 *
69 * @return string XML Output
70 */
71 public function writeStringTable(array $stringTable)
72 {
73 // Create XML writer
74 $objWriter = null;
75 if ($this->getParentWriter()->getUseDiskCaching()) {
76 $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
77 } else {
78 $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
79 }
80
81 // XML header
82 $objWriter->startDocument('1.0', 'UTF-8', 'yes');
83
84 // String table
85 $objWriter->startElement('sst');
86 $objWriter->writeAttribute('xmlns', Namespaces::MAIN);
87 $objWriter->writeAttribute('uniqueCount', (string) count($stringTable));
88
89 // Loop through string table
90 foreach ($stringTable as $textElement) {
91 $objWriter->startElement('si');
92
93 if (!($textElement instanceof RichText)) {
94 $textToWrite = StringHelper::controlCharacterPHP2OOXML($textElement);
95 $objWriter->startElement('t');
96 if ($textToWrite !== trim($textToWrite)) {
97 $objWriter->writeAttribute('xml:space', 'preserve');
98 }
99 $objWriter->writeRawData($textToWrite);
100 $objWriter->endElement();
101 } else {
102 $this->writeRichText($objWriter, $textElement);
103 }
104
105 $objWriter->endElement();
106 }
107
108 $objWriter->endElement();
109
110 return $objWriter->getData();
111 }
112
113 /**
114 * Write Rich Text.
115 *
116 * @param string $prefix Optional Namespace prefix
117 */
118 public function writeRichText(XMLWriter $objWriter, RichText $richText, $prefix = null): void
119 {
120 if ($prefix !== null) {
121 $prefix .= ':';
122 }
123
124 // Loop through rich text elements
125 $elements = $richText->getRichTextElements();
126 foreach ($elements as $element) {
127 // r
128 $objWriter->startElement($prefix . 'r');
129
130 // rPr
131 if ($element instanceof Run && $element->getFont() !== null) {
132 // rPr
133 $objWriter->startElement($prefix . 'rPr');
134
135 // rFont
136 if ($element->getFont()->getName() !== null) {
137 $objWriter->startElement($prefix . 'rFont');
138 $objWriter->writeAttribute('val', $element->getFont()->getName());
139 $objWriter->endElement();
140 }
141
142 // Bold
143 $objWriter->startElement($prefix . 'b');
144 $objWriter->writeAttribute('val', ($element->getFont()->getBold() ? 'true' : 'false'));
145 $objWriter->endElement();
146
147 // Italic
148 $objWriter->startElement($prefix . 'i');
149 $objWriter->writeAttribute('val', ($element->getFont()->getItalic() ? 'true' : 'false'));
150 $objWriter->endElement();
151
152 // Superscript / subscript
153 if ($element->getFont()->getSuperscript() || $element->getFont()->getSubscript()) {
154 $objWriter->startElement($prefix . 'vertAlign');
155 if ($element->getFont()->getSuperscript()) {
156 $objWriter->writeAttribute('val', 'superscript');
157 } elseif ($element->getFont()->getSubscript()) {
158 $objWriter->writeAttribute('val', 'subscript');
159 }
160 $objWriter->endElement();
161 }
162
163 // Strikethrough
164 $objWriter->startElement($prefix . 'strike');
165 $objWriter->writeAttribute('val', ($element->getFont()->getStrikethrough() ? 'true' : 'false'));
166 $objWriter->endElement();
167
168 // Color
169 if ($element->getFont()->getColor()->getARGB() !== null) {
170 $objWriter->startElement($prefix . 'color');
171 $objWriter->writeAttribute('rgb', $element->getFont()->getColor()->getARGB());
172 $objWriter->endElement();
173 }
174
175 // Size
176 if ($element->getFont()->getSize() !== null) {
177 $objWriter->startElement($prefix . 'sz');
178 $objWriter->writeAttribute('val', (string) $element->getFont()->getSize());
179 $objWriter->endElement();
180 }
181
182 // Underline
183 if ($element->getFont()->getUnderline() !== null) {
184 $objWriter->startElement($prefix . 'u');
185 $objWriter->writeAttribute('val', $element->getFont()->getUnderline());
186 $objWriter->endElement();
187 }
188
189 $objWriter->endElement();
190 }
191
192 // t
193 $objWriter->startElement($prefix . 't');
194 $objWriter->writeAttribute('xml:space', 'preserve');
195 $objWriter->writeRawData(StringHelper::controlCharacterPHP2OOXML($element->getText()));
196 $objWriter->endElement();
197
198 $objWriter->endElement();
199 }
200 }
201
202 /**
203 * Write Rich Text.
204 *
205 * @param RichText|string $richText text string or Rich text
206 * @param string $prefix Optional Namespace prefix
207 */
208 public function writeRichTextForCharts(XMLWriter $objWriter, $richText = null, $prefix = ''): void
209 {
210 if (!($richText instanceof RichText)) {
211 $textRun = $richText;
212 $richText = new RichText();
213 $run = $richText->createTextRun($textRun ?? '');
214 $run->setFont(null);
215 }
216
217 if ($prefix !== '') {
218 $prefix .= ':';
219 }
220
221 // Loop through rich text elements
222 $elements = $richText->getRichTextElements();
223 foreach ($elements as $element) {
224 // r
225 $objWriter->startElement($prefix . 'r');
226 if ($element->getFont() !== null) {
227 // rPr
228 $objWriter->startElement($prefix . 'rPr');
229 $fontSize = $element->getFont()->getSize();
230 if (is_numeric($fontSize)) {
231 $fontSize *= (($fontSize < 100) ? 100 : 1);
232 $objWriter->writeAttribute('sz', (string) $fontSize);
233 }
234
235 // Bold
236 $objWriter->writeAttribute('b', ($element->getFont()->getBold() ? '1' : '0'));
237 // Italic
238 $objWriter->writeAttribute('i', ($element->getFont()->getItalic() ? '1' : '0'));
239 // Underline
240 $underlineType = $element->getFont()->getUnderline();
241 switch ($underlineType) {
242 case 'single':
243 $underlineType = 'sng';
244
245 break;
246 case 'double':
247 $underlineType = 'dbl';
248
249 break;
250 }
251 if ($underlineType !== null) {
252 $objWriter->writeAttribute('u', $underlineType);
253 }
254 // Strikethrough
255 $objWriter->writeAttribute('strike', ($element->getFont()->getStriketype() ?: 'noStrike'));
256 // Superscript/subscript
257 if ($element->getFont()->getBaseLine()) {
258 $objWriter->writeAttribute('baseline', (string) $element->getFont()->getBaseLine());
259 }
260
261 // Color
262 $this->writeChartTextColor($objWriter, $element->getFont()->getChartColor(), $prefix);
263
264 // Underscore Color
265 $this->writeChartTextColor($objWriter, $element->getFont()->getUnderlineColor(), $prefix, 'uFill');
266
267 // fontName
268 if ($element->getFont()->getLatin()) {
269 $objWriter->startElement($prefix . 'latin');
270 $objWriter->writeAttribute('typeface', $element->getFont()->getLatin());
271 $objWriter->endElement();
272 }
273 if ($element->getFont()->getEastAsian()) {
274 $objWriter->startElement($prefix . 'ea');
275 $objWriter->writeAttribute('typeface', $element->getFont()->getEastAsian());
276 $objWriter->endElement();
277 }
278 if ($element->getFont()->getComplexScript()) {
279 $objWriter->startElement($prefix . 'cs');
280 $objWriter->writeAttribute('typeface', $element->getFont()->getComplexScript());
281 $objWriter->endElement();
282 }
283
284 $objWriter->endElement();
285 }
286
287 // t
288 $objWriter->startElement($prefix . 't');
289 $objWriter->writeRawData(StringHelper::controlCharacterPHP2OOXML($element->getText()));
290 $objWriter->endElement();
291
292 $objWriter->endElement();
293 }
294 }
295
296 private function writeChartTextColor(XMLWriter $objWriter, ?ChartColor $underlineColor, string $prefix, ?string $openTag = ''): void
297 {
298 if ($underlineColor !== null) {
299 $type = $underlineColor->getType();
300 $value = $underlineColor->getValue();
301 if (!empty($type) && !empty($value)) {
302 if ($openTag !== '') {
303 $objWriter->startElement($prefix . $openTag);
304 }
305 $objWriter->startElement($prefix . 'solidFill');
306 $objWriter->startElement($prefix . $type);
307 $objWriter->writeAttribute('val', $value);
308 $alpha = $underlineColor->getAlpha();
309 if (is_numeric($alpha)) {
310 $objWriter->startElement('a:alpha');
311 $objWriter->writeAttribute('val', ChartColor::alphaToXml((int) $alpha));
312 $objWriter->endElement();
313 }
314 $objWriter->endElement(); // srgbClr/schemeClr/prstClr
315 $objWriter->endElement(); // solidFill
316 if ($openTag !== '') {
317 $objWriter->endElement(); // uFill
318 }
319 }
320 }
321 }
322
323 /**
324 * Flip string table (for index searching).
325 *
326 * @param array $stringTable Stringtable
327 *
328 * @return array
329 */
330 public function flipStringTable(array $stringTable)
331 {
332 // Return value
333 $returnValue = [];
334
335 // Loop through stringtable and add flipped items to $returnValue
336 foreach ($stringTable as $key => $value) {
337 if (!$value instanceof RichText) {
338 $returnValue[$value] = $key;
339 } elseif ($value instanceof RichText) {
340 $returnValue[$value->getHashCode()] = $key;
341 }
342 }
343
344 return $returnValue;
345 }
346 }
347