1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace PhpOffice\PhpSpreadsheet\Writer\Xlsx; |
4
|
|
|
|
5
|
|
|
use PhpOffice\PhpSpreadsheet\Shared\XMLWriter; |
6
|
|
|
use PhpOffice\PhpSpreadsheet\Spreadsheet; |
7
|
|
|
|
8
|
|
|
class DocProps extends WriterPart |
9
|
|
|
{ |
10
|
|
|
/** |
11
|
|
|
* Write docProps/app.xml to XML format. |
12
|
|
|
* |
13
|
|
|
* @param Spreadsheet $spreadsheet |
14
|
|
|
* |
15
|
|
|
* @throws \PhpOffice\PhpSpreadsheet\Writer\Exception |
16
|
|
|
* |
17
|
|
|
* @return string XML Output |
18
|
|
|
*/ |
19
|
82 |
|
public function writeDocPropsApp(Spreadsheet $spreadsheet) |
20
|
|
|
{ |
21
|
|
|
// Create XML writer |
22
|
82 |
|
$objWriter = null; |
23
|
82 |
|
if ($this->getParentWriter()->getUseDiskCaching()) { |
24
|
|
|
$objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); |
25
|
|
|
} else { |
26
|
82 |
|
$objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); |
27
|
|
|
} |
28
|
|
|
|
29
|
|
|
// XML header |
30
|
82 |
|
$objWriter->startDocument('1.0', 'UTF-8', 'yes'); |
31
|
|
|
|
32
|
|
|
// Properties |
33
|
82 |
|
$objWriter->startElement('Properties'); |
34
|
82 |
|
$objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/officeDocument/2006/extended-properties'); |
35
|
82 |
|
$objWriter->writeAttribute('xmlns:vt', 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes'); |
36
|
|
|
|
37
|
|
|
// Application |
38
|
82 |
|
$objWriter->writeElement('Application', 'Microsoft Excel'); |
39
|
|
|
|
40
|
|
|
// DocSecurity |
41
|
82 |
|
$objWriter->writeElement('DocSecurity', '0'); |
42
|
|
|
|
43
|
|
|
// ScaleCrop |
44
|
82 |
|
$objWriter->writeElement('ScaleCrop', 'false'); |
45
|
|
|
|
46
|
|
|
// HeadingPairs |
47
|
82 |
|
$objWriter->startElement('HeadingPairs'); |
48
|
|
|
|
49
|
|
|
// Vector |
50
|
82 |
|
$objWriter->startElement('vt:vector'); |
51
|
82 |
|
$objWriter->writeAttribute('size', '2'); |
52
|
82 |
|
$objWriter->writeAttribute('baseType', 'variant'); |
53
|
|
|
|
54
|
|
|
// Variant |
55
|
82 |
|
$objWriter->startElement('vt:variant'); |
56
|
82 |
|
$objWriter->writeElement('vt:lpstr', 'Worksheets'); |
57
|
82 |
|
$objWriter->endElement(); |
58
|
|
|
|
59
|
|
|
// Variant |
60
|
82 |
|
$objWriter->startElement('vt:variant'); |
61
|
82 |
|
$objWriter->writeElement('vt:i4', $spreadsheet->getSheetCount()); |
62
|
82 |
|
$objWriter->endElement(); |
63
|
|
|
|
64
|
82 |
|
$objWriter->endElement(); |
65
|
|
|
|
66
|
82 |
|
$objWriter->endElement(); |
67
|
|
|
|
68
|
|
|
// TitlesOfParts |
69
|
82 |
|
$objWriter->startElement('TitlesOfParts'); |
70
|
|
|
|
71
|
|
|
// Vector |
72
|
82 |
|
$objWriter->startElement('vt:vector'); |
73
|
82 |
|
$objWriter->writeAttribute('size', $spreadsheet->getSheetCount()); |
74
|
82 |
|
$objWriter->writeAttribute('baseType', 'lpstr'); |
75
|
|
|
|
76
|
82 |
|
$sheetCount = $spreadsheet->getSheetCount(); |
77
|
82 |
|
for ($i = 0; $i < $sheetCount; ++$i) { |
78
|
82 |
|
$objWriter->writeElement('vt:lpstr', $spreadsheet->getSheet($i)->getTitle()); |
79
|
|
|
} |
80
|
|
|
|
81
|
82 |
|
$objWriter->endElement(); |
82
|
|
|
|
83
|
82 |
|
$objWriter->endElement(); |
84
|
|
|
|
85
|
|
|
// Company |
86
|
82 |
|
$objWriter->writeElement('Company', $spreadsheet->getProperties()->getCompany()); |
87
|
|
|
|
88
|
|
|
// Company |
89
|
82 |
|
$objWriter->writeElement('Manager', $spreadsheet->getProperties()->getManager()); |
90
|
|
|
|
91
|
|
|
// LinksUpToDate |
92
|
82 |
|
$objWriter->writeElement('LinksUpToDate', 'false'); |
93
|
|
|
|
94
|
|
|
// SharedDoc |
95
|
82 |
|
$objWriter->writeElement('SharedDoc', 'false'); |
96
|
|
|
|
97
|
|
|
// HyperlinksChanged |
98
|
82 |
|
$objWriter->writeElement('HyperlinksChanged', 'false'); |
99
|
|
|
|
100
|
|
|
// AppVersion |
101
|
82 |
|
$objWriter->writeElement('AppVersion', '12.0000'); |
102
|
|
|
|
103
|
82 |
|
$objWriter->endElement(); |
104
|
|
|
|
105
|
|
|
// Return |
106
|
82 |
|
return $objWriter->getData(); |
107
|
|
|
} |
108
|
|
|
|
109
|
|
|
/** |
110
|
|
|
* Write docProps/core.xml to XML format. |
111
|
|
|
* |
112
|
|
|
* @param Spreadsheet $spreadsheet |
113
|
|
|
* |
114
|
|
|
* @throws \PhpOffice\PhpSpreadsheet\Writer\Exception |
115
|
|
|
* |
116
|
|
|
* @return string XML Output |
117
|
|
|
*/ |
118
|
82 |
|
public function writeDocPropsCore(Spreadsheet $spreadsheet) |
119
|
|
|
{ |
120
|
|
|
// Create XML writer |
121
|
82 |
|
$objWriter = null; |
122
|
82 |
|
if ($this->getParentWriter()->getUseDiskCaching()) { |
123
|
|
|
$objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); |
124
|
|
|
} else { |
125
|
82 |
|
$objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); |
126
|
|
|
} |
127
|
|
|
|
128
|
|
|
// XML header |
129
|
82 |
|
$objWriter->startDocument('1.0', 'UTF-8', 'yes'); |
130
|
|
|
|
131
|
|
|
// cp:coreProperties |
132
|
82 |
|
$objWriter->startElement('cp:coreProperties'); |
133
|
82 |
|
$objWriter->writeAttribute('xmlns:cp', 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties'); |
134
|
82 |
|
$objWriter->writeAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1/'); |
135
|
82 |
|
$objWriter->writeAttribute('xmlns:dcterms', 'http://purl.org/dc/terms/'); |
136
|
82 |
|
$objWriter->writeAttribute('xmlns:dcmitype', 'http://purl.org/dc/dcmitype/'); |
137
|
82 |
|
$objWriter->writeAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); |
138
|
|
|
|
139
|
|
|
// dc:creator |
140
|
82 |
|
$objWriter->writeElement('dc:creator', $spreadsheet->getProperties()->getCreator()); |
141
|
|
|
|
142
|
|
|
// cp:lastModifiedBy |
143
|
82 |
|
$objWriter->writeElement('cp:lastModifiedBy', $spreadsheet->getProperties()->getLastModifiedBy()); |
144
|
|
|
|
145
|
|
|
// dcterms:created |
146
|
82 |
|
$objWriter->startElement('dcterms:created'); |
147
|
82 |
|
$objWriter->writeAttribute('xsi:type', 'dcterms:W3CDTF'); |
148
|
82 |
|
$objWriter->writeRawData(date(DATE_W3C, $spreadsheet->getProperties()->getCreated())); |
149
|
82 |
|
$objWriter->endElement(); |
150
|
|
|
|
151
|
|
|
// dcterms:modified |
152
|
82 |
|
$objWriter->startElement('dcterms:modified'); |
153
|
82 |
|
$objWriter->writeAttribute('xsi:type', 'dcterms:W3CDTF'); |
154
|
82 |
|
$objWriter->writeRawData(date(DATE_W3C, $spreadsheet->getProperties()->getModified())); |
155
|
82 |
|
$objWriter->endElement(); |
156
|
|
|
|
157
|
|
|
// dc:title |
158
|
82 |
|
$objWriter->writeElement('dc:title', $spreadsheet->getProperties()->getTitle()); |
159
|
|
|
|
160
|
|
|
// dc:description |
161
|
82 |
|
$objWriter->writeElement('dc:description', $spreadsheet->getProperties()->getDescription()); |
162
|
|
|
|
163
|
|
|
// dc:subject |
164
|
82 |
|
$objWriter->writeElement('dc:subject', $spreadsheet->getProperties()->getSubject()); |
165
|
|
|
|
166
|
|
|
// cp:keywords |
167
|
82 |
|
$objWriter->writeElement('cp:keywords', $spreadsheet->getProperties()->getKeywords()); |
168
|
|
|
|
169
|
|
|
// cp:category |
170
|
82 |
|
$objWriter->writeElement('cp:category', $spreadsheet->getProperties()->getCategory()); |
171
|
|
|
|
172
|
82 |
|
$objWriter->endElement(); |
173
|
|
|
|
174
|
|
|
// Return |
175
|
82 |
|
return $objWriter->getData(); |
176
|
|
|
} |
177
|
|
|
|
178
|
|
|
/** |
179
|
|
|
* Write docProps/custom.xml to XML format. |
180
|
|
|
* |
181
|
|
|
* @param Spreadsheet $spreadsheet |
182
|
|
|
* |
183
|
|
|
* @throws \PhpOffice\PhpSpreadsheet\Writer\Exception |
184
|
|
|
* |
185
|
|
|
* @return string XML Output |
186
|
|
|
*/ |
187
|
82 |
|
public function writeDocPropsCustom(Spreadsheet $spreadsheet) |
188
|
|
|
{ |
189
|
82 |
|
$customPropertyList = $spreadsheet->getProperties()->getCustomProperties(); |
190
|
82 |
|
if (empty($customPropertyList)) { |
191
|
80 |
|
return; |
192
|
|
|
} |
193
|
|
|
|
194
|
|
|
// Create XML writer |
195
|
2 |
|
$objWriter = null; |
196
|
2 |
|
if ($this->getParentWriter()->getUseDiskCaching()) { |
197
|
|
|
$objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); |
198
|
|
|
} else { |
199
|
2 |
|
$objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); |
200
|
|
|
} |
201
|
|
|
|
202
|
|
|
// XML header |
203
|
2 |
|
$objWriter->startDocument('1.0', 'UTF-8', 'yes'); |
204
|
|
|
|
205
|
|
|
// cp:coreProperties |
206
|
2 |
|
$objWriter->startElement('Properties'); |
207
|
2 |
|
$objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/officeDocument/2006/custom-properties'); |
208
|
2 |
|
$objWriter->writeAttribute('xmlns:vt', 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes'); |
209
|
|
|
|
210
|
2 |
|
foreach ($customPropertyList as $key => $customProperty) { |
211
|
2 |
|
$propertyValue = $spreadsheet->getProperties()->getCustomPropertyValue($customProperty); |
212
|
2 |
|
$propertyType = $spreadsheet->getProperties()->getCustomPropertyType($customProperty); |
213
|
|
|
|
214
|
2 |
|
$objWriter->startElement('property'); |
215
|
2 |
|
$objWriter->writeAttribute('fmtid', '{D5CDD505-2E9C-101B-9397-08002B2CF9AE}'); |
216
|
2 |
|
$objWriter->writeAttribute('pid', $key + 2); |
217
|
2 |
|
$objWriter->writeAttribute('name', $customProperty); |
218
|
|
|
|
219
|
2 |
|
switch ($propertyType) { |
220
|
2 |
|
case 'i': |
221
|
|
|
$objWriter->writeElement('vt:i4', $propertyValue); |
222
|
|
|
|
223
|
|
|
break; |
224
|
2 |
|
case 'f': |
225
|
1 |
|
$objWriter->writeElement('vt:r8', $propertyValue); |
226
|
|
|
|
227
|
1 |
|
break; |
228
|
2 |
|
case 'b': |
229
|
1 |
|
$objWriter->writeElement('vt:bool', ($propertyValue) ? 'true' : 'false'); |
230
|
|
|
|
231
|
1 |
|
break; |
232
|
2 |
|
case 'd': |
233
|
1 |
|
$objWriter->startElement('vt:filetime'); |
234
|
1 |
|
$objWriter->writeRawData(date(DATE_W3C, $propertyValue)); |
|
|
|
|
235
|
1 |
|
$objWriter->endElement(); |
236
|
|
|
|
237
|
1 |
|
break; |
238
|
|
|
default: |
239
|
2 |
|
$objWriter->writeElement('vt:lpwstr', $propertyValue); |
240
|
|
|
|
241
|
2 |
|
break; |
242
|
|
|
} |
243
|
|
|
|
244
|
2 |
|
$objWriter->endElement(); |
245
|
|
|
} |
246
|
|
|
|
247
|
2 |
|
$objWriter->endElement(); |
248
|
|
|
|
249
|
2 |
|
return $objWriter->getData(); |
250
|
|
|
} |
251
|
|
|
} |
252
|
|
|
|