From 6934665c1b36195112104765f18787b16ea5459b Mon Sep 17 00:00:00 2001 From: Mark Baker Date: Wed, 7 Nov 2012 19:57:25 +0000 Subject: [PATCH] Additional work on chart functionality for HTML and PDF Writers Examples for HTML and PDF chart writing Various Docblock fixes --- .../PHPExcel/CachedObjectStorageFactory.php | 2 +- Classes/PHPExcel/Chart/Renderer/jpgraph.php | 2 +- Classes/PHPExcel/Reader/Excel2007/Chart.php | 2 +- Classes/PHPExcel/Writer/HTML.php | 56 +++++- Examples/21pdf.php | 9 +- Examples/26utf8.php | 8 +- Examples/35chartrender.php | 1 - Examples/36chartreadwriteHTML.php | 151 +++++++++++++++ Examples/36chartreadwritePDF.php | 174 ++++++++++++++++++ 9 files changed, 389 insertions(+), 16 deletions(-) create mode 100644 Examples/36chartreadwriteHTML.php create mode 100644 Examples/36chartreadwritePDF.php diff --git a/Classes/PHPExcel/CachedObjectStorageFactory.php b/Classes/PHPExcel/CachedObjectStorageFactory.php index 42d2f88f..45bae0d3 100644 --- a/Classes/PHPExcel/CachedObjectStorageFactory.php +++ b/Classes/PHPExcel/CachedObjectStorageFactory.php @@ -20,7 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * @category PHPExcel - * @package PHPExcel + * @package PHPExcel_CachedObjectStorage * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL * @version ##VERSION##, ##DATE## diff --git a/Classes/PHPExcel/Chart/Renderer/jpgraph.php b/Classes/PHPExcel/Chart/Renderer/jpgraph.php index e0b6b91d..d3d98bf5 100644 --- a/Classes/PHPExcel/Chart/Renderer/jpgraph.php +++ b/Classes/PHPExcel/Chart/Renderer/jpgraph.php @@ -20,7 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * @category PHPExcel - * @package PHPExcel_Chart + * @package PHPExcel_Chart_Renderer * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL * @version ##VERSION##, ##DATE## diff --git a/Classes/PHPExcel/Reader/Excel2007/Chart.php b/Classes/PHPExcel/Reader/Excel2007/Chart.php index c7fcdafe..c8c35701 100644 --- a/Classes/PHPExcel/Reader/Excel2007/Chart.php +++ b/Classes/PHPExcel/Reader/Excel2007/Chart.php @@ -19,7 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * @category PHPExcel - * @package PHPExcel_Reader_Excel5 + * @package PHPExcel_Reader_Excel2007 * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL * @version ##VERSION##, ##DATE## diff --git a/Classes/PHPExcel/Writer/HTML.php b/Classes/PHPExcel/Writer/HTML.php index 0c803c02..60b240bd 100644 --- a/Classes/PHPExcel/Writer/HTML.php +++ b/Classes/PHPExcel/Writer/HTML.php @@ -447,6 +447,7 @@ class PHPExcel_Writer_HTML extends PHPExcel_Writer_Abstract implements PHPExcel_ $html .= ' ' . PHP_EOL; } } + $html .= $this->_extendRowsForChartsAndImages($sheet, $row); // Write table footer $html .= $this->_generateTableFooter(); @@ -508,6 +509,52 @@ class PHPExcel_Writer_HTML extends PHPExcel_Writer_Abstract implements PHPExcel_ return $html; } + private function _extendRowsForChartsAndImages(PHPExcel_Worksheet $pSheet, $row) { + $rowMax = $row; + $colMax = 'A'; + foreach ($pSheet->getChartCollection() as $chart) { + if ($chart instanceof PHPExcel_Chart) { + $chartCoordinates = $chart->getTopLeftPosition(); + $chartTL = PHPExcel_Cell::coordinateFromString($chartCoordinates['cell']); + $chartCol = PHPExcel_Cell::columnIndexFromString($chartTL[0]); + if ($chartTL[1] > $rowMax) { + $rowMax = $chartTL[1]; + } + if ($chartCol > PHPExcel_Cell::columnIndexFromString($colMax)) { + $colMax = $chartTL[0]; + } + } + } + + foreach ($pSheet->getDrawingCollection() as $drawing) { + if ($drawing instanceof PHPExcel_Worksheet_Drawing) { + $imageTL = PHPExcel_Cell::coordinateFromString($drawing->getCoordinates()); + $imageCol = PHPExcel_Cell::columnIndexFromString($imageTL[0]); + if ($imageTL[1] > $rowMax) { + $rowMax = $imageTL[1]; + } + if ($imageCol > PHPExcel_Cell::columnIndexFromString($colMax)) { + $colMax = $imageTL[0]; + } + } + } + $html = ''; + $colMax++; + while ($row <= $rowMax) { + $html .= ''; + for ($col = 'A'; $col != $colMax; ++$col) { + $html .= ''; + $html .= $this->_writeImageInCell($pSheet, $col.$row); + $html .= $this->_writeChartInCell($pSheet, $col.$row); + $html .= ''; + } + ++$row; + $html .= ''; + } + return $html; + } + + /** * Generate image tag in cell * @@ -584,7 +631,8 @@ class PHPExcel_Writer_HTML extends PHPExcel_Writer_Abstract implements PHPExcel_ if ($chart instanceof PHPExcel_Chart) { $chartCoordinates = $chart->getTopLeftPosition(); if ($chartCoordinates['cell'] == $coordinates) { - $chartFileName = tempnam(PHPExcel_Shared_File::sys_get_temp_dir()); +// $chartFileName = tempnam(PHPExcel_Shared_File::sys_get_temp_dir(),'xlc'); + $chartFileName = './'.uniqid().'.png'; if (!$chart->render($chartFileName)) { return; } @@ -599,7 +647,7 @@ class PHPExcel_Writer_HTML extends PHPExcel_Writer_Abstract implements PHPExcel_ $base64 = chunk_split(base64_encode($picture)); $imageData = 'data:'.$imageDetails['mime'].';base64,' . $base64; - $html .= '' . PHP_EOL; + $html .= '' . PHP_EOL; unlink($chartFileName); } @@ -969,9 +1017,9 @@ class PHPExcel_Writer_HTML extends PHPExcel_Writer_Abstract implements PHPExcel_ $this->_assembleCSS($this->_cssStyles['table']) : ''; if ($this->_isPdf && $pSheet->getShowGridLines()) { - $html .= ' ' . PHP_EOL; + $html .= '
' . PHP_EOL; } else { - $html .= '
' . PHP_EOL; + $html .= '
' . PHP_EOL; } } diff --git a/Examples/21pdf.php b/Examples/21pdf.php index 2271f5ba..01a6e2c4 100644 --- a/Examples/21pdf.php +++ b/Examples/21pdf.php @@ -43,11 +43,12 @@ require_once '../Classes/PHPExcel/IOFactory.php'; // Change these values to select the Rendering library that you wish to use // and its directory location on your server -$rendererName = PHPExcel_Settings::PDF_RENDERER_MPDF; -//$rendererName = PHPExcel_Settings::PDF_RENDERER_DOMPDF; +//$rendererName = PHPExcel_Settings::PDF_RENDERER_TCPDF; +//$rendererName = PHPExcel_Settings::PDF_RENDERER_MPDF; +$rendererName = PHPExcel_Settings::PDF_RENDERER_DOMPDF; //$rendererLibrary = 'tcPDF5.9'; -$rendererLibrary = 'mPDF5.4'; -//$rendererLibrary = 'domPDF0.6.0beta3'; +//$rendererLibrary = 'mPDF5.4'; +$rendererLibrary = 'domPDF0.6.0beta3'; $rendererLibraryPath = '/php/libraries/PDF/' . $rendererLibrary; diff --git a/Examples/26utf8.php b/Examples/26utf8.php index adf7e4f1..a760d27f 100644 --- a/Examples/26utf8.php +++ b/Examples/26utf8.php @@ -41,11 +41,11 @@ require_once '../Classes/PHPExcel.php'; // Change these values to select the PDF Rendering library that you wish to use // and its directory location on your server //$rendererName = PHPExcel_Settings::PDF_RENDERER_TCPDF; -$rendererName = PHPExcel_Settings::PDF_RENDERER_MPDF; -//$rendererName = PHPExcel_Settings::PDF_RENDERER_DOMPDF; +//$rendererName = PHPExcel_Settings::PDF_RENDERER_MPDF; +$rendererName = PHPExcel_Settings::PDF_RENDERER_DOMPDF; //$rendererLibrary = 'tcPDF5.9'; -$rendererLibrary = 'mPDF5.4'; -//$rendererLibrary = 'domPDF0.6.0beta3'; +//$rendererLibrary = 'mPDF5.4'; +$rendererLibrary = 'domPDF0.6.0beta3'; $rendererLibraryPath = '/php/libraries/PDF/' . $rendererLibrary; diff --git a/Examples/35chartrender.php b/Examples/35chartrender.php index 6783a232..bb3ec5f2 100644 --- a/Examples/35chartrender.php +++ b/Examples/35chartrender.php @@ -45,7 +45,6 @@ include 'PHPExcel/IOFactory.php'; // Change these values to select the Rendering library that you wish to use // and its directory location on your server -//$rendererName = PHPExcel_Settings::PDF_RENDERER_MPDF; $rendererName = PHPExcel_Settings::CHART_RENDERER_JPGRAPH; $rendererLibrary = 'jpgraph3.5.0b1/src'; $rendererLibraryPath = '/php/libraries/Charts/' . $rendererLibrary; diff --git a/Examples/36chartreadwriteHTML.php b/Examples/36chartreadwriteHTML.php new file mode 100644 index 00000000..d2c0a703 --- /dev/null +++ b/Examples/36chartreadwriteHTML.php @@ -0,0 +1,151 @@ +'); + +date_default_timezone_set('Europe/London'); + +/** + * PHPExcel + * + * Copyright (C) 2006 - 2012 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ + +/** Include path **/ +set_include_path(get_include_path() . PATH_SEPARATOR . '../Classes/'); + +/** PHPExcel_IOFactory */ +include 'PHPExcel/IOFactory.php'; + + +// Change these values to select the Rendering library that you wish to use +// and its directory location on your server +$rendererName = PHPExcel_Settings::CHART_RENDERER_JPGRAPH; +$rendererLibrary = 'jpgraph3.5.0b1/src'; +$rendererLibraryPath = '/php/libraries/Charts/' . $rendererLibrary; + + +if (!PHPExcel_Settings::setChartRenderer( + $rendererName, + $rendererLibraryPath + )) { + die( + 'NOTICE: Please set the $rendererName and $rendererLibraryPath values' . + EOL . + 'at the top of this script as appropriate for your directory structure' + ); +} + + +$inputFileType = 'Excel2007'; +$inputFileNames = 'templates/36write*.xlsx'; + +if ((isset($argc)) && ($argc > 1)) { + $inputFileNames = array(); + for($i = 1; $i < $argc; ++$i) { + $inputFileNames[] = __DIR__ . '/templates/' . $argv[$i]; + } +} else { + $inputFileNames = glob($inputFileNames); +} +foreach($inputFileNames as $inputFileName) { + $inputFileNameShort = basename($inputFileName); + + if (!file_exists($inputFileName)) { + echo date('H:i:s') , " File " , $inputFileNameShort , ' does not exist' , EOL; + continue; + } + + echo date('H:i:s') , " Load Test from $inputFileType file " , $inputFileNameShort , EOL; + + $objReader = PHPExcel_IOFactory::createReader($inputFileType); + $objReader->setIncludeCharts(TRUE); + $objPHPExcel = $objReader->load($inputFileName); + + + echo date('H:i:s') , " Iterate worksheets looking at the charts" , EOL; + foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) { + $sheetName = $worksheet->getTitle(); + echo 'Worksheet: ' , $sheetName , EOL; + + $chartNames = $worksheet->getChartNames(); + if(empty($chartNames)) { + echo ' There are no charts in this worksheet' , EOL; + } else { + natsort($chartNames); + foreach($chartNames as $i => $chartName) { + $chart = $worksheet->getChartByName($chartName); + if (!is_null($chart->getTitle())) { + $caption = '"' . implode(' ',$chart->getTitle()->getCaption()) . '"'; + } else { + $caption = 'Untitled'; + } + echo ' ' , $chartName , ' - ' , $caption , EOL; + echo str_repeat(' ',strlen($chartName)+3); + $groupCount = $chart->getPlotArea()->getPlotGroupCount(); + if ($groupCount == 1) { + $chartType = $chart->getPlotArea()->getPlotGroupByIndex(0)->getPlotType(); + echo ' ' , $chartType , EOL; + } else { + $chartTypes = array(); + for($i = 0; $i < $groupCount; ++$i) { + $chartTypes[] = $chart->getPlotArea()->getPlotGroupByIndex($i)->getPlotType(); + } + $chartTypes = array_unique($chartTypes); + if (count($chartTypes) == 1) { + $chartType = 'Multiple Plot ' . array_pop($chartTypes); + echo ' ' , $chartType , EOL; + } elseif (count($chartTypes) == 0) { + echo ' *** Type not yet implemented' , EOL; + } else { + echo ' Combination Chart' , EOL; + } + } + } + } + } + + + $outputFileName = str_replace('.xlsx', '.html', basename($inputFileName)); + + echo date('H:i:s') , " Write Tests to HTML file " , EOL; + $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'HTML'); + $objWriter->setIncludeCharts(TRUE); + $objWriter->save($outputFileName); + echo date('H:i:s') , " File written to " , $outputFileName , EOL; + + $objPHPExcel->disconnectWorksheets(); + unset($objPHPExcel); +} + +// Echo memory peak usage +echo date('H:i:s') , ' Peak memory usage: ' , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; + +// Echo done +echo date('H:i:s') , " Done writing files" , EOL; +echo 'Files have been created in ' , getcwd() , EOL; diff --git a/Examples/36chartreadwritePDF.php b/Examples/36chartreadwritePDF.php new file mode 100644 index 00000000..f1b41302 --- /dev/null +++ b/Examples/36chartreadwritePDF.php @@ -0,0 +1,174 @@ +'); + +date_default_timezone_set('Europe/London'); + +/** + * PHPExcel + * + * Copyright (C) 2006 - 2012 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel + * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ + +/** Include path **/ +set_include_path(get_include_path() . PATH_SEPARATOR . '../Classes/'); + +/** PHPExcel_IOFactory */ +include 'PHPExcel/IOFactory.php'; + + +// Change these values to select the Rendering library that you wish to use +// for PDF files, and its directory location on your server +//$rendererName = PHPExcel_Settings::PDF_RENDERER_TCPDF; +$rendererName = PHPExcel_Settings::PDF_RENDERER_MPDF; +//$rendererName = PHPExcel_Settings::PDF_RENDERER_DOMPDF; +//$rendererLibrary = 'tcPDF5.9'; +$rendererLibrary = 'mPDF5.4'; +//$rendererLibrary = 'domPDF0.6.0beta3'; +$rendererLibraryPath = '/php/libraries/PDF/' . $rendererLibrary; + + +if (!PHPExcel_Settings::setPdfRenderer( + $rendererName, + $rendererLibraryPath + )) { + die( + 'NOTICE: Please set the $rendererName and $rendererLibraryPath values' . + EOL . + 'at the top of this script as appropriate for your directory structure' + ); +} + + +// Change these values to select the Rendering library that you wish to use +// for Chart images, and its directory location on your server +$rendererName = PHPExcel_Settings::CHART_RENDERER_JPGRAPH; +$rendererLibrary = 'jpgraph3.5.0b1/src'; +$rendererLibraryPath = '/php/libraries/Charts/' . $rendererLibrary; + + +if (!PHPExcel_Settings::setChartRenderer( + $rendererName, + $rendererLibraryPath + )) { + die( + 'NOTICE: Please set the $rendererName and $rendererLibraryPath values' . + EOL . + 'at the top of this script as appropriate for your directory structure' + ); +} + + +$inputFileType = 'Excel2007'; +$inputFileNames = 'templates/36write*.xlsx'; + +if ((isset($argc)) && ($argc > 1)) { + $inputFileNames = array(); + for($i = 1; $i < $argc; ++$i) { + $inputFileNames[] = __DIR__ . '/templates/' . $argv[$i]; + } +} else { + $inputFileNames = glob($inputFileNames); +} +foreach($inputFileNames as $inputFileName) { + $inputFileNameShort = basename($inputFileName); + + if (!file_exists($inputFileName)) { + echo date('H:i:s') , " File " , $inputFileNameShort , ' does not exist' , EOL; + continue; + } + + echo date('H:i:s') , " Load Test from $inputFileType file " , $inputFileNameShort , EOL; + + $objReader = PHPExcel_IOFactory::createReader($inputFileType); + $objReader->setIncludeCharts(TRUE); + $objPHPExcel = $objReader->load($inputFileName); + + + echo date('H:i:s') , " Iterate worksheets looking at the charts" , EOL; + foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) { + $sheetName = $worksheet->getTitle(); + echo 'Worksheet: ' , $sheetName , EOL; + + $chartNames = $worksheet->getChartNames(); + if(empty($chartNames)) { + echo ' There are no charts in this worksheet' , EOL; + } else { + natsort($chartNames); + foreach($chartNames as $i => $chartName) { + $chart = $worksheet->getChartByName($chartName); + if (!is_null($chart->getTitle())) { + $caption = '"' . implode(' ',$chart->getTitle()->getCaption()) . '"'; + } else { + $caption = 'Untitled'; + } + echo ' ' , $chartName , ' - ' , $caption , EOL; + echo str_repeat(' ',strlen($chartName)+3); + $groupCount = $chart->getPlotArea()->getPlotGroupCount(); + if ($groupCount == 1) { + $chartType = $chart->getPlotArea()->getPlotGroupByIndex(0)->getPlotType(); + echo ' ' , $chartType , EOL; + } else { + $chartTypes = array(); + for($i = 0; $i < $groupCount; ++$i) { + $chartTypes[] = $chart->getPlotArea()->getPlotGroupByIndex($i)->getPlotType(); + } + $chartTypes = array_unique($chartTypes); + if (count($chartTypes) == 1) { + $chartType = 'Multiple Plot ' . array_pop($chartTypes); + echo ' ' , $chartType , EOL; + } elseif (count($chartTypes) == 0) { + echo ' *** Type not yet implemented' , EOL; + } else { + echo ' Combination Chart' , EOL; + } + } + } + } + } + + + $outputFileName = str_replace('.xlsx', '.pdf', basename($inputFileName)); + + echo date('H:i:s') , " Write Tests to HTML file " , EOL; + $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'PDF'); + $objWriter->setIncludeCharts(TRUE); + $objWriter->save($outputFileName); + echo date('H:i:s') , " File written to " , $outputFileName , EOL; + + $objPHPExcel->disconnectWorksheets(); + unset($objPHPExcel); +} + +// Echo memory peak usage +echo date('H:i:s') , ' Peak memory usage: ' , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; + +// Echo done +echo date('H:i:s') , " Done writing files" , EOL; +echo 'Files have been created in ' , getcwd() , EOL;