[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
1 <?php 2 3 /** 4 * PHPExcel_Writer_Excel2007_ContentTypes 5 * 6 * Copyright (c) 2006 - 2015 PHPExcel 7 * 8 * This library is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU Lesser General Public 10 * License as published by the Free Software Foundation; either 11 * version 2.1 of the License, or (at your option) any later version. 12 * 13 * This library is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * Lesser General Public License for more details. 17 * 18 * You should have received a copy of the GNU Lesser General Public 19 * License along with this library; if not, write to the Free Software 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21 * 22 * @category PHPExcel 23 * @package PHPExcel_Writer_Excel2007 24 * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) 25 * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL 26 * @version ##VERSION##, ##DATE## 27 */ 28 class PHPExcel_Writer_Excel2007_ContentTypes extends PHPExcel_Writer_Excel2007_WriterPart 29 { 30 /** 31 * Write content types to XML format 32 * 33 * @param PHPExcel $pPHPExcel 34 * @param boolean $includeCharts Flag indicating if we should include drawing details for charts 35 * @return string XML Output 36 * @throws PHPExcel_Writer_Exception 37 */ 38 public function writeContentTypes(PHPExcel $pPHPExcel = null, $includeCharts = false) 39 { 40 // Create XML writer 41 $objWriter = null; 42 if ($this->getParentWriter()->getUseDiskCaching()) { 43 $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); 44 } else { 45 $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); 46 } 47 48 // XML header 49 $objWriter->startDocument('1.0', 'UTF-8', 'yes'); 50 51 // Types 52 $objWriter->startElement('Types'); 53 $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/content-types'); 54 55 // Theme 56 $this->writeOverrideContentType($objWriter, '/xl/theme/theme1.xml', 'application/vnd.openxmlformats-officedocument.theme+xml'); 57 58 // Styles 59 $this->writeOverrideContentType($objWriter, '/xl/styles.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml'); 60 61 // Rels 62 $this->writeDefaultContentType($objWriter, 'rels', 'application/vnd.openxmlformats-package.relationships+xml'); 63 64 // XML 65 $this->writeDefaultContentType($objWriter, 'xml', 'application/xml'); 66 67 // VML 68 $this->writeDefaultContentType($objWriter, 'vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'); 69 70 // Workbook 71 if ($pPHPExcel->hasMacros()) { //Macros in workbook ? 72 // Yes : not standard content but "macroEnabled" 73 $this->writeOverrideContentType($objWriter, '/xl/workbook.xml', 'application/vnd.ms-excel.sheet.macroEnabled.main+xml'); 74 //... and define a new type for the VBA project 75 $this->writeDefaultContentType($objWriter, 'bin', 'application/vnd.ms-office.vbaProject'); 76 if ($pPHPExcel->hasMacrosCertificate()) {// signed macros ? 77 // Yes : add needed information 78 $this->writeOverrideContentType($objWriter, '/xl/vbaProjectSignature.bin', 'application/vnd.ms-office.vbaProjectSignature'); 79 } 80 } else {// no macros in workbook, so standard type 81 $this->writeOverrideContentType($objWriter, '/xl/workbook.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml'); 82 } 83 84 // DocProps 85 $this->writeOverrideContentType($objWriter, '/docProps/app.xml', 'application/vnd.openxmlformats-officedocument.extended-properties+xml'); 86 87 $this->writeOverrideContentType($objWriter, '/docProps/core.xml', 'application/vnd.openxmlformats-package.core-properties+xml'); 88 89 $customPropertyList = $pPHPExcel->getProperties()->getCustomProperties(); 90 if (!empty($customPropertyList)) { 91 $this->writeOverrideContentType($objWriter, '/docProps/custom.xml', 'application/vnd.openxmlformats-officedocument.custom-properties+xml'); 92 } 93 94 // Worksheets 95 $sheetCount = $pPHPExcel->getSheetCount(); 96 for ($i = 0; $i < $sheetCount; ++$i) { 97 $this->writeOverrideContentType($objWriter, '/xl/worksheets/sheet' . ($i + 1) . '.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml'); 98 } 99 100 // Shared strings 101 $this->writeOverrideContentType($objWriter, '/xl/sharedStrings.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml'); 102 103 // Add worksheet relationship content types 104 $chart = 1; 105 for ($i = 0; $i < $sheetCount; ++$i) { 106 $drawings = $pPHPExcel->getSheet($i)->getDrawingCollection(); 107 $drawingCount = count($drawings); 108 $chartCount = ($includeCharts) ? $pPHPExcel->getSheet($i)->getChartCount() : 0; 109 110 // We need a drawing relationship for the worksheet if we have either drawings or charts 111 if (($drawingCount > 0) || ($chartCount > 0)) { 112 $this->writeOverrideContentType($objWriter, '/xl/drawings/drawing' . ($i + 1) . '.xml', 'application/vnd.openxmlformats-officedocument.drawing+xml'); 113 } 114 115 // If we have charts, then we need a chart relationship for every individual chart 116 if ($chartCount > 0) { 117 for ($c = 0; $c < $chartCount; ++$c) { 118 $this->writeOverrideContentType($objWriter, '/xl/charts/chart' . $chart++ . '.xml', 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml'); 119 } 120 } 121 } 122 123 // Comments 124 for ($i = 0; $i < $sheetCount; ++$i) { 125 if (count($pPHPExcel->getSheet($i)->getComments()) > 0) { 126 $this->writeOverrideContentType($objWriter, '/xl/comments' . ($i + 1) . '.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml'); 127 } 128 } 129 130 // Add media content-types 131 $aMediaContentTypes = array(); 132 $mediaCount = $this->getParentWriter()->getDrawingHashTable()->count(); 133 for ($i = 0; $i < $mediaCount; ++$i) { 134 $extension = ''; 135 $mimeType = ''; 136 137 if ($this->getParentWriter()->getDrawingHashTable()->getByIndex($i) instanceof PHPExcel_Worksheet_Drawing) { 138 $extension = strtolower($this->getParentWriter()->getDrawingHashTable()->getByIndex($i)->getExtension()); 139 $mimeType = $this->getImageMimeType($this->getParentWriter()->getDrawingHashTable()->getByIndex($i)->getPath()); 140 } elseif ($this->getParentWriter()->getDrawingHashTable()->getByIndex($i) instanceof PHPExcel_Worksheet_MemoryDrawing) { 141 $extension = strtolower($this->getParentWriter()->getDrawingHashTable()->getByIndex($i)->getMimeType()); 142 $extension = explode('/', $extension); 143 $extension = $extension[1]; 144 145 $mimeType = $this->getParentWriter()->getDrawingHashTable()->getByIndex($i)->getMimeType(); 146 } 147 148 if (!isset( $aMediaContentTypes[$extension])) { 149 $aMediaContentTypes[$extension] = $mimeType; 150 151 $this->writeDefaultContentType($objWriter, $extension, $mimeType); 152 } 153 } 154 if ($pPHPExcel->hasRibbonBinObjects()) { 155 // Some additional objects in the ribbon ? 156 // we need to write "Extension" but not already write for media content 157 $tabRibbonTypes=array_diff($pPHPExcel->getRibbonBinObjects('types'), array_keys($aMediaContentTypes)); 158 foreach ($tabRibbonTypes as $aRibbonType) { 159 $mimeType='image/.'.$aRibbonType;//we wrote $mimeType like customUI Editor 160 $this->writeDefaultContentType($objWriter, $aRibbonType, $mimeType); 161 } 162 } 163 $sheetCount = $pPHPExcel->getSheetCount(); 164 for ($i = 0; $i < $sheetCount; ++$i) { 165 if (count($pPHPExcel->getSheet()->getHeaderFooter()->getImages()) > 0) { 166 foreach ($pPHPExcel->getSheet()->getHeaderFooter()->getImages() as $image) { 167 if (!isset( $aMediaContentTypes[strtolower($image->getExtension())])) { 168 $aMediaContentTypes[strtolower($image->getExtension())] = $this->getImageMimeType($image->getPath()); 169 170 $this->writeDefaultContentType($objWriter, strtolower($image->getExtension()), $aMediaContentTypes[strtolower($image->getExtension())]); 171 } 172 } 173 } 174 } 175 176 $objWriter->endElement(); 177 178 // Return 179 return $objWriter->getData(); 180 } 181 182 /** 183 * Get image mime type 184 * 185 * @param string $pFile Filename 186 * @return string Mime Type 187 * @throws PHPExcel_Writer_Exception 188 */ 189 private function getImageMimeType($pFile = '') 190 { 191 if (PHPExcel_Shared_File::file_exists($pFile)) { 192 $image = getimagesize($pFile); 193 return image_type_to_mime_type($image[2]); 194 } else { 195 throw new PHPExcel_Writer_Exception("File $pFile does not exist"); 196 } 197 } 198 199 /** 200 * Write Default content type 201 * 202 * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer 203 * @param string $pPartname Part name 204 * @param string $pContentType Content type 205 * @throws PHPExcel_Writer_Exception 206 */ 207 private function writeDefaultContentType(PHPExcel_Shared_XMLWriter $objWriter = null, $pPartname = '', $pContentType = '') 208 { 209 if ($pPartname != '' && $pContentType != '') { 210 // Write content type 211 $objWriter->startElement('Default'); 212 $objWriter->writeAttribute('Extension', $pPartname); 213 $objWriter->writeAttribute('ContentType', $pContentType); 214 $objWriter->endElement(); 215 } else { 216 throw new PHPExcel_Writer_Exception("Invalid parameters passed."); 217 } 218 } 219 220 /** 221 * Write Override content type 222 * 223 * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer 224 * @param string $pPartname Part name 225 * @param string $pContentType Content type 226 * @throws PHPExcel_Writer_Exception 227 */ 228 private function writeOverrideContentType(PHPExcel_Shared_XMLWriter $objWriter = null, $pPartname = '', $pContentType = '') 229 { 230 if ($pPartname != '' && $pContentType != '') { 231 // Write content type 232 $objWriter->startElement('Override'); 233 $objWriter->writeAttribute('PartName', $pPartname); 234 $objWriter->writeAttribute('ContentType', $pContentType); 235 $objWriter->endElement(); 236 } else { 237 throw new PHPExcel_Writer_Exception("Invalid parameters passed."); 238 } 239 } 240 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Thu Aug 11 10:00:09 2016 | Cross-referenced by PHPXref 0.7.1 |