[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/lib/phpexcel/PHPExcel/Writer/Excel2007/ -> ContentTypes.php (source)

   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  }


Generated: Thu Aug 11 10:00:09 2016 Cross-referenced by PHPXref 0.7.1