PHPExcel_Writer_Excel2007
[ class tree: PHPExcel_Writer_Excel2007 ] [ index: PHPExcel_Writer_Excel2007 ] [ all elements ]

Source for file Drawing.php

Documentation is available at Drawing.php

  1. <?php
  2. /**
  3.  * PHPExcel
  4.  *
  5.  * Copyright (c) 2006 - 2009 PHPExcel
  6.  *
  7.  * This library is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU Lesser General Public
  9.  * License as published by the Free Software Foundation; either
  10.  * version 2.1 of the License, or (at your option) any later version.
  11.  *
  12.  * This library is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * Lesser General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU Lesser General Public
  18.  * License along with this library; if not, write to the Free Software
  19.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  20.  *
  21.  * @category   PHPExcel
  22.  * @package    PHPExcel_Writer_Excel2007
  23.  * @copyright  Copyright (c) 2006 - 2009 PHPExcel (http://www.codeplex.com/PHPExcel)
  24.  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL
  25.  * @version    1.6.5, 2009-01-05
  26.  */
  27.  
  28.  
  29. /** PHPExcel */
  30. require_once 'PHPExcel.php';
  31.  
  32. /** PHPExcel_Writer_Excel2007 */
  33. require_once 'PHPExcel/Writer/Excel2007.php';
  34.  
  35. /** PHPExcel_Writer_Excel2007_WriterPart */
  36. require_once 'PHPExcel/Writer/Excel2007/WriterPart.php';
  37.  
  38. /** PHPExcel_Worksheet_BaseDrawing */
  39. require_once 'PHPExcel/Worksheet/BaseDrawing.php';
  40.  
  41. /** PHPExcel_Worksheet_Drawing */
  42. require_once 'PHPExcel/Worksheet/Drawing.php';
  43.  
  44. /** PHPExcel_Worksheet_MemoryDrawing */
  45. require_once 'PHPExcel/Worksheet/MemoryDrawing.php';
  46.  
  47. /** PHPExcel_Worksheet */
  48. require_once 'PHPExcel/Worksheet.php';
  49.  
  50. /** PHPExcel_Cell */
  51. require_once 'PHPExcel/Cell.php';
  52.  
  53. /** PHPExcel_Shared_Drawing */
  54. require_once 'PHPExcel/Shared/Drawing.php';
  55.  
  56. /** PHPExcel_Shared_XMLWriter */
  57. require_once 'PHPExcel/Shared/XMLWriter.php';
  58.  
  59.  
  60. /**
  61.  * PHPExcel_Writer_Excel2007_Drawing
  62.  *
  63.  * @category   PHPExcel
  64.  * @package    PHPExcel_Writer_Excel2007
  65.  * @copyright  Copyright (c) 2006 - 2009 PHPExcel (http://www.codeplex.com/PHPExcel)
  66.  */
  67. {
  68.     /**
  69.      * Write drawings to XML format
  70.      *
  71.      * @param     PHPExcel_Worksheet                $pWorksheet 
  72.      * @return     string                                 XML Output
  73.      * @throws     Exception
  74.      */
  75.     public function writeDrawings(PHPExcel_Worksheet $pWorksheet null)
  76.     {
  77.         // Create XML writer
  78.         $objWriter null;
  79.         if ($this->getParentWriter()->getUseDiskCaching()) {
  80.             $objWriter new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK);
  81.         else {
  82.             $objWriter new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);
  83.         }
  84.  
  85.         // XML header
  86.         $objWriter->startDocument('1.0','UTF-8','yes');
  87.  
  88.         // xdr:wsDr
  89.         $objWriter->startElement('xdr:wsDr');
  90.         $objWriter->writeAttribute('xmlns:xdr''http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing');
  91.         $objWriter->writeAttribute('xmlns:a''http://schemas.openxmlformats.org/drawingml/2006/main');
  92.  
  93.             // Loop trough images and write drawings
  94.             $i 1;
  95.             $iterator $pWorksheet->getDrawingCollection()->getIterator();
  96.             while ($iterator->valid()) {
  97.                 $this->_writeDrawing($objWriter$iterator->current()$i);
  98.  
  99.                 $iterator->next();
  100.                 ++$i;
  101.             }
  102.  
  103.         $objWriter->endElement();
  104.  
  105.         // Return
  106.         return $objWriter->getData();
  107.     }
  108.  
  109.     /**
  110.      * Write drawings to XML format
  111.      *
  112.      * @param     PHPExcel_Shared_XMLWriter            $objWriter         XML Writer
  113.      * @param     PHPExcel_Worksheet_BaseDrawing        $pDrawing 
  114.      * @param     int                                    $pRelationId 
  115.      * @throws     Exception
  116.      */
  117.     public function _writeDrawing(PHPExcel_Shared_XMLWriter $objWriter nullPHPExcel_Worksheet_BaseDrawing $pDrawing null$pRelationId = -1)
  118.     {
  119.         if ($pRelationId >= 0{
  120.             // xdr:oneCellAnchor
  121.             $objWriter->startElement('xdr:oneCellAnchor');
  122.                 // Image location
  123.                 $aCoordinates         PHPExcel_Cell::coordinateFromString($pDrawing->getCoordinates());
  124.                 $aCoordinates[0]     PHPExcel_Cell::columnIndexFromString($aCoordinates[0]);
  125.  
  126.                 // xdr:from
  127.                 $objWriter->startElement('xdr:from');
  128.                     $objWriter->writeElement('xdr:col'$aCoordinates[01);
  129.                     $objWriter->writeElement('xdr:colOff'PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getOffsetX()));
  130.                     $objWriter->writeElement('xdr:row'$aCoordinates[11);
  131.                     $objWriter->writeElement('xdr:rowOff'PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getOffsetY()));
  132.                 $objWriter->endElement();
  133.  
  134.                 // xdr:ext
  135.                 $objWriter->startElement('xdr:ext');
  136.                     $objWriter->writeAttribute('cx'PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getWidth()));
  137.                     $objWriter->writeAttribute('cy'PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getHeight()));
  138.                 $objWriter->endElement();
  139.  
  140.                 // xdr:pic
  141.                 $objWriter->startElement('xdr:pic');
  142.  
  143.                     // xdr:nvPicPr
  144.                     $objWriter->startElement('xdr:nvPicPr');
  145.  
  146.                         // xdr:cNvPr
  147.                         $objWriter->startElement('xdr:cNvPr');
  148.                         $objWriter->writeAttribute('id'$pRelationId);
  149.                         $objWriter->writeAttribute('name'$pDrawing->getName());
  150.                         $objWriter->writeAttribute('descr'$pDrawing->getDescription());
  151.                         $objWriter->endElement();
  152.  
  153.                         // xdr:cNvPicPr
  154.                         $objWriter->startElement('xdr:cNvPicPr');
  155.  
  156.                             // a:picLocks
  157.                             $objWriter->startElement('a:picLocks');
  158.                             $objWriter->writeAttribute('noChangeAspect''1');
  159.                             $objWriter->endElement();
  160.  
  161.                         $objWriter->endElement();
  162.  
  163.                     $objWriter->endElement();
  164.  
  165.                     // xdr:blipFill
  166.                     $objWriter->startElement('xdr:blipFill');
  167.  
  168.                         // a:blip
  169.                         $objWriter->startElement('a:blip');
  170.                         $objWriter->writeAttribute('xmlns:r''http://schemas.openxmlformats.org/officeDocument/2006/relationships');
  171.                         $objWriter->writeAttribute('r:embed''rId' $pRelationId);
  172.                         $objWriter->endElement();
  173.  
  174.                         // a:stretch
  175.                         $objWriter->startElement('a:stretch');
  176.                             $objWriter->writeElement('a:fillRect'null);
  177.                         $objWriter->endElement();
  178.  
  179.                     $objWriter->endElement();
  180.  
  181.                     // xdr:spPr
  182.                     $objWriter->startElement('xdr:spPr');
  183.  
  184.                         // a:xfrm
  185.                         $objWriter->startElement('a:xfrm');
  186.                         $objWriter->writeAttribute('rot'PHPExcel_Shared_Drawing::degreesToAngle($pDrawing->getRotation()));
  187.                         $objWriter->endElement();
  188.  
  189.                         // a:prstGeom
  190.                         $objWriter->startElement('a:prstGeom');
  191.                         $objWriter->writeAttribute('prst''rect');
  192.  
  193.                             // a:avLst
  194.                             $objWriter->writeElement('a:avLst'null);
  195.  
  196.                         $objWriter->endElement();
  197.  
  198.                         // a:solidFill
  199.                         $objWriter->startElement('a:solidFill');
  200.  
  201.                             // a:srgbClr
  202.                             $objWriter->startElement('a:srgbClr');
  203.                             $objWriter->writeAttribute('val''FFFFFF');
  204.  
  205. /* SHADE
  206.                                 // a:shade
  207.                                 $objWriter->startElement('a:shade');
  208.                                 $objWriter->writeAttribute('val', '85000');
  209.                                 $objWriter->endElement();
  210. */
  211.  
  212.                             $objWriter->endElement();
  213.  
  214.                         $objWriter->endElement();
  215. /*
  216.                         // a:ln
  217.                         $objWriter->startElement('a:ln');
  218.                         $objWriter->writeAttribute('w', '88900');
  219.                         $objWriter->writeAttribute('cap', 'sq');
  220.  
  221.                             // a:solidFill
  222.                             $objWriter->startElement('a:solidFill');
  223.  
  224.                                 // a:srgbClr
  225.                                 $objWriter->startElement('a:srgbClr');
  226.                                 $objWriter->writeAttribute('val', 'FFFFFF');
  227.                                 $objWriter->endElement();
  228.  
  229.                             $objWriter->endElement();
  230.  
  231.                             // a:miter
  232.                             $objWriter->startElement('a:miter');
  233.                             $objWriter->writeAttribute('lim', '800000');
  234.                             $objWriter->endElement();
  235.  
  236.                         $objWriter->endElement();
  237. */
  238.  
  239.                         if ($pDrawing->getShadow()->getVisible()) {
  240.                             // a:effectLst
  241.                             $objWriter->startElement('a:effectLst');
  242.  
  243.                                 // a:outerShdw
  244.                                 $objWriter->startElement('a:outerShdw');
  245.                                 $objWriter->writeAttribute('blurRad',         PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getShadow()->getBlurRadius()));
  246.                                 $objWriter->writeAttribute('dist',            PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getShadow()->getDistance()));
  247.                                 $objWriter->writeAttribute('dir',            PHPExcel_Shared_Drawing::degreesToAngle($pDrawing->getShadow()->getDirection()));
  248.                                 $objWriter->writeAttribute('algn',            $pDrawing->getShadow()->getAlignment());
  249.                                 $objWriter->writeAttribute('rotWithShape',     '0');
  250.  
  251.                                     // a:srgbClr
  252.                                     $objWriter->startElement('a:srgbClr');
  253.                                     $objWriter->writeAttribute('val',        $pDrawing->getShadow()->getColor()->getRGB());
  254.  
  255.                                         // a:alpha
  256.                                         $objWriter->startElement('a:alpha');
  257.                                         $objWriter->writeAttribute('val',     $pDrawing->getShadow()->getAlpha(1000);
  258.                                         $objWriter->endElement();
  259.  
  260.                                     $objWriter->endElement();
  261.  
  262.                                 $objWriter->endElement();
  263.  
  264.                             $objWriter->endElement();
  265.                         }
  266. /*
  267.  
  268.                         // a:scene3d
  269.                         $objWriter->startElement('a:scene3d');
  270.  
  271.                             // a:camera
  272.                             $objWriter->startElement('a:camera');
  273.                             $objWriter->writeAttribute('prst', 'orthographicFront');
  274.                             $objWriter->endElement();
  275.  
  276.                             // a:lightRig
  277.                             $objWriter->startElement('a:lightRig');
  278.                             $objWriter->writeAttribute('rig', 'twoPt');
  279.                             $objWriter->writeAttribute('dir', 't');
  280.  
  281.                                 // a:rot
  282.                                 $objWriter->startElement('a:rot');
  283.                                 $objWriter->writeAttribute('lat', '0');
  284.                                 $objWriter->writeAttribute('lon', '0');
  285.                                 $objWriter->writeAttribute('rev', '0');
  286.                                 $objWriter->endElement();
  287.  
  288.                             $objWriter->endElement();
  289.  
  290.                         $objWriter->endElement();
  291. */
  292. /*
  293.                         // a:sp3d
  294.                         $objWriter->startElement('a:sp3d');
  295.  
  296.                             // a:bevelT
  297.                             $objWriter->startElement('a:bevelT');
  298.                             $objWriter->writeAttribute('w', '25400');
  299.                             $objWriter->writeAttribute('h', '19050');
  300.                             $objWriter->endElement();
  301.  
  302.                             // a:contourClr
  303.                             $objWriter->startElement('a:contourClr');
  304.  
  305.                                 // a:srgbClr
  306.                                 $objWriter->startElement('a:srgbClr');
  307.                                 $objWriter->writeAttribute('val', 'FFFFFF');
  308.                                 $objWriter->endElement();
  309.  
  310.                             $objWriter->endElement();
  311.  
  312.                         $objWriter->endElement();
  313. */
  314.                     $objWriter->endElement();
  315.  
  316.                 $objWriter->endElement();
  317.  
  318.                 // xdr:clientData
  319.                 $objWriter->writeElement('xdr:clientData'null);
  320.  
  321.             $objWriter->endElement();
  322.         else {
  323.             throw new Exception("Invalid parameters passed.");
  324.         }
  325.     }
  326.  
  327.     /**
  328.      * Write VML header/footer images to XML format
  329.      *
  330.      * @param     PHPExcel_Worksheet                $pWorksheet 
  331.      * @return     string                                 XML Output
  332.      * @throws     Exception
  333.      */
  334.     public function writeVMLHeaderFooterImages(PHPExcel_Worksheet $pWorksheet null)
  335.     {
  336.         // Create XML writer
  337.         $objWriter null;
  338.         if ($this->getParentWriter()->getUseDiskCaching()) {
  339.             $objWriter new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK);
  340.         else {
  341.             $objWriter new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);
  342.         }
  343.  
  344.         // XML header
  345.         $objWriter->startDocument('1.0','UTF-8','yes');
  346.  
  347.           // Header/footer images
  348.           $images $pWorksheet->getHeaderFooter()->getImages();
  349.  
  350.         // xml
  351.         $objWriter->startElement('xml');
  352.         $objWriter->writeAttribute('xmlns:v''urn:schemas-microsoft-com:vml');
  353.         $objWriter->writeAttribute('xmlns:o''urn:schemas-microsoft-com:office:office');
  354.         $objWriter->writeAttribute('xmlns:x''urn:schemas-microsoft-com:office:excel');
  355.  
  356.             // o:shapelayout
  357.             $objWriter->startElement('o:shapelayout');
  358.             $objWriter->writeAttribute('v:ext',         'edit');
  359.  
  360.                 // o:idmap
  361.                 $objWriter->startElement('o:idmap');
  362.                 $objWriter->writeAttribute('v:ext',     'edit');
  363.                 $objWriter->writeAttribute('data',         '1');
  364.                 $objWriter->endElement();
  365.  
  366.             $objWriter->endElement();
  367.  
  368.             // v:shapetype
  369.             $objWriter->startElement('v:shapetype');
  370.             $objWriter->writeAttribute('id',                     '_x0000_t75');
  371.             $objWriter->writeAttribute('coordsize',             '21600,21600');
  372.             $objWriter->writeAttribute('o:spt',                 '75');
  373.             $objWriter->writeAttribute('o:preferrelative',         't');
  374.             $objWriter->writeAttribute('path',                     'm@4@5l@4@11@9@11@9@5xe');
  375.             $objWriter->writeAttribute('filled',                 'f');
  376.             $objWriter->writeAttribute('stroked',                 'f');
  377.  
  378.                 // v:stroke
  379.                 $objWriter->startElement('v:stroke');
  380.                 $objWriter->writeAttribute('joinstyle',         'miter');
  381.                 $objWriter->endElement();
  382.  
  383.                 // v:formulas
  384.                 $objWriter->startElement('v:formulas');
  385.  
  386.                     // v:f
  387.                     $objWriter->startElement('v:f');
  388.                     $objWriter->writeAttribute('eqn',         'if lineDrawn pixelLineWidth 0');
  389.                     $objWriter->endElement();
  390.  
  391.                     // v:f
  392.                     $objWriter->startElement('v:f');
  393.                     $objWriter->writeAttribute('eqn',         'sum @0 1 0');
  394.                     $objWriter->endElement();
  395.  
  396.                     // v:f
  397.                     $objWriter->startElement('v:f');
  398.                     $objWriter->writeAttribute('eqn',         'sum 0 0 @1');
  399.                     $objWriter->endElement();
  400.  
  401.                     // v:f
  402.                     $objWriter->startElement('v:f');
  403.                     $objWriter->writeAttribute('eqn',         'prod @2 1 2');
  404.                     $objWriter->endElement();
  405.  
  406.                     // v:f
  407.                     $objWriter->startElement('v:f');
  408.                     $objWriter->writeAttribute('eqn',         'prod @3 21600 pixelWidth');
  409.                     $objWriter->endElement();
  410.  
  411.                     // v:f
  412.                     $objWriter->startElement('v:f');
  413.                     $objWriter->writeAttribute('eqn',         'prod @3 21600 pixelHeight');
  414.                     $objWriter->endElement();
  415.  
  416.                     // v:f
  417.                     $objWriter->startElement('v:f');
  418.                     $objWriter->writeAttribute('eqn',         'sum @0 0 1');
  419.                     $objWriter->endElement();
  420.  
  421.                     // v:f
  422.                     $objWriter->startElement('v:f');
  423.                     $objWriter->writeAttribute('eqn',         'prod @6 1 2');
  424.                     $objWriter->endElement();
  425.  
  426.                     // v:f
  427.                     $objWriter->startElement('v:f');
  428.                     $objWriter->writeAttribute('eqn',         'prod @7 21600 pixelWidth');
  429.                     $objWriter->endElement();
  430.  
  431.                     // v:f
  432.                     $objWriter->startElement('v:f');
  433.                     $objWriter->writeAttribute('eqn',         'sum @8 21600 0');
  434.                     $objWriter->endElement();
  435.  
  436.                     // v:f
  437.                     $objWriter->startElement('v:f');
  438.                     $objWriter->writeAttribute('eqn',         'prod @7 21600 pixelHeight');
  439.                     $objWriter->endElement();
  440.  
  441.                     // v:f
  442.                     $objWriter->startElement('v:f');
  443.                     $objWriter->writeAttribute('eqn',         'sum @10 21600 0');
  444.                     $objWriter->endElement();
  445.  
  446.                 $objWriter->endElement();
  447.  
  448.                 // v:path
  449.                 $objWriter->startElement('v:path');
  450.                 $objWriter->writeAttribute('o:extrusionok',     'f');
  451.                 $objWriter->writeAttribute('gradientshapeok',     't');
  452.                 $objWriter->writeAttribute('o:connecttype',     'rect');
  453.                 $objWriter->endElement();
  454.  
  455.                 // o:lock
  456.                 $objWriter->startElement('o:lock');
  457.                 $objWriter->writeAttribute('v:ext',             'edit');
  458.                 $objWriter->writeAttribute('aspectratio',         't');
  459.                 $objWriter->endElement();
  460.  
  461.             $objWriter->endElement();
  462.  
  463.             // Loop trough images
  464.             foreach ($images as $key => $value{
  465.                 $this->_writeVMLHeaderFooterImage($objWriter$key$value);
  466.             }
  467.  
  468.         $objWriter->endElement();
  469.  
  470.         // Return
  471.         return $objWriter->getData();
  472.     }
  473.  
  474.     /**
  475.      * Write VML comment to XML format
  476.      *
  477.      * @param     PHPExcel_Shared_XMLWriter        $objWriter             XML Writer
  478.      * @param    string                            $pReference            Reference
  479.      * @param     PHPExcel_Worksheet_HeaderFooterDrawing    $pImage        Image
  480.      * @throws     Exception
  481.      */
  482.     public function _writeVMLHeaderFooterImage(PHPExcel_Shared_XMLWriter $objWriter null$pReference ''PHPExcel_Worksheet_HeaderFooterDrawing $pImage null)
  483.     {
  484.         // Calculate object id
  485.         preg_match('{(\d+)}'md5($pReference)$m);
  486.         $id 1500 (substr($m[1]021);
  487.  
  488.         // Calculate offset
  489.         $width $pImage->getWidth();
  490.         $height $pImage->getHeight();
  491.         $marginLeft $pImage->getOffsetX();
  492.         $marginTop $pImage->getOffsetY();
  493.  
  494.         // v:shape
  495.         $objWriter->startElement('v:shape');
  496.         $objWriter->writeAttribute('id',             $pReference);
  497.         $objWriter->writeAttribute('o:spid',         '_x0000_s' $id);
  498.         $objWriter->writeAttribute('type',             '#_x0000_t75');
  499.         $objWriter->writeAttribute('style',         "position:absolute;margin-left:{$marginLeft}px;margin-top:{$marginTop}px;width:{$width}px;height:{$height}px;z-index:1");
  500.  
  501.             // v:imagedata
  502.             $objWriter->startElement('v:imagedata');
  503.             $objWriter->writeAttribute('o:relid',         'rId' $pReference);
  504.             $objWriter->writeAttribute('o:title',         $pImage->getName());
  505.             $objWriter->endElement();
  506.  
  507.             // o:lock
  508.             $objWriter->startElement('o:lock');
  509.             $objWriter->writeAttribute('v:ext',         'edit');
  510.             $objWriter->writeAttribute('rotation',         't');
  511.             $objWriter->endElement();
  512.  
  513.         $objWriter->endElement();
  514.     }
  515.  
  516.  
  517.     /**
  518.      * Get an array of all drawings
  519.      *
  520.      * @param     PHPExcel                            $pPHPExcel 
  521.      * @return     PHPExcel_Worksheet_Drawing[]        All drawings in PHPExcel
  522.      * @throws     Exception
  523.      */
  524.     public function allDrawings(PHPExcel $pPHPExcel null)
  525.     {
  526.         // Get an array of all drawings
  527.         $aDrawings    array();
  528.  
  529.         // Loop trough PHPExcel
  530.         $sheetCount $pPHPExcel->getSheetCount();
  531.         for ($i 0$i $sheetCount++$i{
  532.             // Loop trough images and add to array
  533.             $iterator $pPHPExcel->getSheet($i)->getDrawingCollection()->getIterator();
  534.             while ($iterator->valid()) {
  535.                 $aDrawings[$iterator->current();
  536.  
  537.                   $iterator->next();
  538.             }
  539.         }
  540.  
  541.         return $aDrawings;
  542.     }
  543. }

Documentation generated on Mon, 05 Jan 2009 20:36:50 +0100 by phpDocumentor 1.4.1