1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
27:
28:
29: 30: 31: 32: 33: 34: 35:
36: class PHPExcel_Writer_Excel2007_ContentTypes extends PHPExcel_Writer_Excel2007_WriterPart
37: {
38: 39: 40: 41: 42: 43: 44: 45:
46: public function writeContentTypes(PHPExcel $pPHPExcel = null, $includeCharts = FALSE)
47: {
48:
49: $objWriter = null;
50: if ($this->getParentWriter()->getUseDiskCaching()) {
51: $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
52: } else {
53: $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);
54: }
55:
56:
57: $objWriter->startDocument('1.0','UTF-8','yes');
58:
59:
60: $objWriter->startElement('Types');
61: $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/content-types');
62:
63:
64: $this->_writeOverrideContentType(
65: $objWriter, '/xl/theme/theme1.xml', 'application/vnd.openxmlformats-officedocument.theme+xml'
66: );
67:
68:
69: $this->_writeOverrideContentType(
70: $objWriter, '/xl/styles.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml'
71: );
72:
73:
74: $this->_writeDefaultContentType(
75: $objWriter, 'rels', 'application/vnd.openxmlformats-package.relationships+xml'
76: );
77:
78:
79: $this->_writeDefaultContentType(
80: $objWriter, 'xml', 'application/xml'
81: );
82:
83:
84: $this->_writeDefaultContentType(
85: $objWriter, 'vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'
86: );
87:
88:
89: if($pPHPExcel->hasMacros()){
90:
91: $this->_writeOverrideContentType(
92: $objWriter, '/xl/workbook.xml', 'application/vnd.ms-excel.sheet.macroEnabled.main+xml'
93: );
94:
95: $this->_writeDefaultContentType(
96: $objWriter, 'bin', 'application/vnd.ms-office.vbaProject'
97: );
98: if($pPHPExcel->hasMacrosCertificate()){
99:
100: $this->_writeOverrideContentType(
101: $objWriter, '/xl/vbaProjectSignature.bin', 'application/vnd.ms-office.vbaProjectSignature'
102: );
103: }
104: }else{
105: $this->_writeOverrideContentType(
106: $objWriter, '/xl/workbook.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml'
107: );
108: }
109:
110:
111: $this->_writeOverrideContentType(
112: $objWriter, '/docProps/app.xml', 'application/vnd.openxmlformats-officedocument.extended-properties+xml'
113: );
114:
115: $this->_writeOverrideContentType(
116: $objWriter, '/docProps/core.xml', 'application/vnd.openxmlformats-package.core-properties+xml'
117: );
118:
119: $customPropertyList = $pPHPExcel->getProperties()->getCustomProperties();
120: if (!empty($customPropertyList)) {
121: $this->_writeOverrideContentType(
122: $objWriter, '/docProps/custom.xml', 'application/vnd.openxmlformats-officedocument.custom-properties+xml'
123: );
124: }
125:
126:
127: $sheetCount = $pPHPExcel->getSheetCount();
128: for ($i = 0; $i < $sheetCount; ++$i) {
129: $this->_writeOverrideContentType(
130: $objWriter, '/xl/worksheets/sheet' . ($i + 1) . '.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml'
131: );
132: }
133:
134:
135: $this->_writeOverrideContentType(
136: $objWriter, '/xl/sharedStrings.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml'
137: );
138:
139:
140: $chart = 1;
141: for ($i = 0; $i < $sheetCount; ++$i) {
142: $drawings = $pPHPExcel->getSheet($i)->getDrawingCollection();
143: $drawingCount = count($drawings);
144: $chartCount = ($includeCharts) ? $pPHPExcel->getSheet($i)->getChartCount() : 0;
145:
146:
147: if (($drawingCount > 0) || ($chartCount > 0)) {
148: $this->_writeOverrideContentType(
149: $objWriter, '/xl/drawings/drawing' . ($i + 1) . '.xml', 'application/vnd.openxmlformats-officedocument.drawing+xml'
150: );
151: }
152:
153:
154: if ($chartCount > 0) {
155: for ($c = 0; $c < $chartCount; ++$c) {
156: $this->_writeOverrideContentType(
157: $objWriter, '/xl/charts/chart' . $chart++ . '.xml', 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml'
158: );
159: }
160: }
161: }
162:
163:
164: for ($i = 0; $i < $sheetCount; ++$i) {
165: if (count($pPHPExcel->getSheet($i)->getComments()) > 0) {
166: $this->_writeOverrideContentType(
167: $objWriter, '/xl/comments' . ($i + 1) . '.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml'
168: );
169: }
170: }
171:
172:
173: $aMediaContentTypes = array();
174: $mediaCount = $this->getParentWriter()->getDrawingHashTable()->count();
175: for ($i = 0; $i < $mediaCount; ++$i) {
176: $extension = '';
177: $mimeType = '';
178:
179: if ($this->getParentWriter()->getDrawingHashTable()->getByIndex($i) instanceof PHPExcel_Worksheet_Drawing) {
180: $extension = strtolower($this->getParentWriter()->getDrawingHashTable()->getByIndex($i)->getExtension());
181: $mimeType = $this->_getImageMimeType( $this->getParentWriter()->getDrawingHashTable()->getByIndex($i)->getPath() );
182: } else if ($this->getParentWriter()->getDrawingHashTable()->getByIndex($i) instanceof PHPExcel_Worksheet_MemoryDrawing) {
183: $extension = strtolower($this->getParentWriter()->getDrawingHashTable()->getByIndex($i)->getMimeType());
184: $extension = explode('/', $extension);
185: $extension = $extension[1];
186:
187: $mimeType = $this->getParentWriter()->getDrawingHashTable()->getByIndex($i)->getMimeType();
188: }
189:
190: if (!isset( $aMediaContentTypes[$extension]) ) {
191: $aMediaContentTypes[$extension] = $mimeType;
192:
193: $this->_writeDefaultContentType(
194: $objWriter, $extension, $mimeType
195: );
196: }
197: }
198: if($pPHPExcel->hasRibbonBinObjects()){
199:
200: $tabRibbonTypes=array_diff($pPHPExcel->getRibbonBinObjects('types'), array_keys($aMediaContentTypes));
201: foreach($tabRibbonTypes as $aRibbonType){
202: $mimeType='image/.'.$aRibbonType;
203: $this->_writeDefaultContentType(
204: $objWriter, $aRibbonType, $mimeType
205: );
206: }
207: }
208: $sheetCount = $pPHPExcel->getSheetCount();
209: for ($i = 0; $i < $sheetCount; ++$i) {
210: if (count($pPHPExcel->getSheet()->getHeaderFooter()->getImages()) > 0) {
211: foreach ($pPHPExcel->getSheet()->getHeaderFooter()->getImages() as $image) {
212: if (!isset( $aMediaContentTypes[strtolower($image->getExtension())]) ) {
213: $aMediaContentTypes[strtolower($image->getExtension())] = $this->_getImageMimeType( $image->getPath() );
214:
215: $this->_writeDefaultContentType(
216: $objWriter, strtolower($image->getExtension()), $aMediaContentTypes[strtolower($image->getExtension())]
217: );
218: }
219: }
220: }
221: }
222:
223: $objWriter->endElement();
224:
225:
226: return $objWriter->getData();
227: }
228:
229: 230: 231: 232: 233: 234: 235:
236: private function _getImageMimeType($pFile = '')
237: {
238: if (PHPExcel_Shared_File::file_exists($pFile)) {
239: $image = getimagesize($pFile);
240: return image_type_to_mime_type($image[2]);
241: } else {
242: throw new PHPExcel_Writer_Exception("File $pFile does not exist");
243: }
244: }
245:
246: 247: 248: 249: 250: 251: 252: 253:
254: private function _writeDefaultContentType(PHPExcel_Shared_XMLWriter $objWriter = null, $pPartname = '', $pContentType = '')
255: {
256: if ($pPartname != '' && $pContentType != '') {
257:
258: $objWriter->startElement('Default');
259: $objWriter->writeAttribute('Extension', $pPartname);
260: $objWriter->writeAttribute('ContentType', $pContentType);
261: $objWriter->endElement();
262: } else {
263: throw new PHPExcel_Writer_Exception("Invalid parameters passed.");
264: }
265: }
266:
267: 268: 269: 270: 271: 272: 273: 274:
275: private function _writeOverrideContentType(PHPExcel_Shared_XMLWriter $objWriter = null, $pPartname = '', $pContentType = '')
276: {
277: if ($pPartname != '' && $pContentType != '') {
278:
279: $objWriter->startElement('Override');
280: $objWriter->writeAttribute('PartName', $pPartname);
281: $objWriter->writeAttribute('ContentType', $pContentType);
282: $objWriter->endElement();
283: } else {
284: throw new PHPExcel_Writer_Exception("Invalid parameters passed.");
285: }
286: }
287: }
288: