From 2e24130d8161c1528a922e6dbbbaa2450da780c1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=A9bastien=20CHAZALLET?= Date: Tue, 27 Nov 2012 21:43:05 +0100 Subject: [PATCH] Rajout du support d'Excel --- vendor/zf2biz/Custom/Export/AbstractWorkbook.php | 368 ++++++++++++++++++++++ 1 file changed, 368 insertions(+) create mode 100644 vendor/zf2biz/Custom/Export/AbstractWorkbook.php diff --git a/vendor/zf2biz/Custom/Export/AbstractWorkbook.php b/vendor/zf2biz/Custom/Export/AbstractWorkbook.php new file mode 100644 index 0000000..ec95a6a --- /dev/null +++ b/vendor/zf2biz/Custom/Export/AbstractWorkbook.php @@ -0,0 +1,368 @@ + + * @copyright 2011 InsPyration + * @license GNU GPL http://www.gnu.org/licenses/gpl.html + * @link http://zf2.biz + * @since 0.0.1 + * + */ + +namespace Custom\Export; + +/** + * @see Spreadsheet_Excel_Writer + */ + +require_once 'Spreadsheet/Excel/Writer.php'; + +/** + * Cette classe permet de renvoyer un fichier Excel. + * + * Elle rajoute des facilités telles que : + * > la gestion de la ligne courante + * > la gestion de la case courante + * > le passage automatisé à la case suivante (celle de droite) + * > le passage automatisé à la ligne suivante (celle du dessous) + * > la gestion des formats + * + * + * Elle permet d'aider à générer facilement des exports Excel, + * mais ne contient PAS de logique de présentation, + * conformément aux principes de séparation du code + * + * @category Components + * @package Custom\Export + * @author Sébastien Chazallet + * @copyright 2011 InsPyration + * @license GNU GPL http://www.gnu.org/licenses/gpl.html + * @link http://zf2.biz + * @since 0.0.1 + * + */ + +abstract class AbstractWorkbook +{ + + /** + * Document D'export + * @var Spreadsheet_Excel_Writer + */ + protected $workbook; + + /** + * Feuille courante + * @var Spreadsheet_Excel_Worksheet + */ + protected $current_worksheet; + + /** + * Ligne courante + * @var int + */ + protected $current_line = 0; + /** + * Colonne courante + * @var int + */ + protected $current_column = 0; + + /** + * Données à exporter + * @var array + */ + protected $datas; + + + /** + * Formats disponibles. + * @var array + */ + protected $formats = array(); + + + /** + * Liste des styles utilisés pour les chiffres + * constante de type tableau + * @var array + */ + protected $suffixes_entier = array( + 'chiffre', + ); + + + /** + * Créateur de l'export + * + * @param array $datas données à écrire + * + * @return null + */ + public function build ($datas) + { + $this->datas = $datas; + //Initialisation de la feuille Excel. + $this->initWorkbook(); + // Initialisation de la feuille courante + $this->initCurrentWorksheet(); + // Initialisation des formats + $this->initFormats(); + + //On ecrit les données + $this->writeData(); + + // Finalisation du formatage + $this->postFormats(); + + // Fermeture de la feuille Excel + $this->closeWorkbook(); + + } + + /** + * Initialisation de l'export Excel. + * Mise en place du nom du fichier et de l'UTF-8. + * + * @return null + */ + protected function initWorkbook() + { + $this->workbook = new \Spreadsheet_Excel_Writer(); + $this->workbook->setVersion(8); + $this->workbook->send($this->nomFichier()); + } + + /** + * Nom du fichier utilisé pour l'export. + * + * @return string + */ + abstract protected function nomFichier(); + + /** + * Initialisation d'une feuille qui devient la feuille courante. + * + * @return null + */ + protected function initCurrentWorksheet() + { + $this->current_worksheet = $this->workbook->addWorksheet(); + $this->current_worksheet->setInputEncoding('utf-8'); + } + + /** + * Permet de composer les formats à utiliser. + * + * @return null + */ + protected function initFormats() + { + $this->initFormatTitreString(); + $this->initFormatCaseString(); + $this->initFormatCaseChiffre(); + } + + + /** + * Initialisation d'un format pour un classeur + * + * @return null + */ + protected function initFormatTitreString() + { + $format = &$this->workbook->addFormat(); + $format->setSize(10); + $format->setBold(); + $format->setAlign('center'); + $format->setAlign('vcenter'); + $format->setBottom(1); + $format->setTop(1); + $format->setLeft(1); + $format->setRight(1); + $format->setTextWrap(); + $format->setFgColor(30); + $this->formats['titre_string'] = $format; + } + + /** + * Initialisation d'un format pour un classeur + * + * @return null + */ + protected function initFormatCaseString() + { + $format = &$this->workbook->addFormat(); + $format->setSize(10); + $format->setAlign('left'); + $format->setAlign('vcenter'); + $format->setTop(1); + $format->setBottom(1); + $format->setRight(1); + $format->setLeft(1); + $this->formats['case_string'] = $format; + } + + /** + * Initialisation d'un format pour un classeur + * + * @return null + */ + protected function initFormatCaseChiffre() + { + $format = &$this->workbook->addFormat(); + $format->setSize(10); + $format->setAlign('center'); + $format->setAlign('vcenter'); + $format->setTop(1); + $format->setBottom(1); + $format->setRight(1); + $format->setLeft(1); + $format->setNumFormat('0.00'); + $this->formats['case_chiffre'] = $format; + } + + /** + * Méthode d'écriture des données dans la feuille courante. + * + * @return null + */ + abstract protected function writeData(); + + /** + * Mise en forme après écriture. + * + * @return null + */ + abstract protected function postFormats(); + + /** + * Fermeture propre de l'export Excel. + * Clot son écriture et renvoie l'objet au client. + * + * @return null + */ + protected function closeWorkbook() + { + $this->workbook->close(); + } + + + + + /** + * Méthode permettant d'écrire quelque chose dans une case. + * + * @param string $line numero de la ligne, commence par 0. + * @param string $column numero de la colonne, commence par 0. + * @param string $value valeur à inscrire dans la casae + * @param string $format format à utiliser pour la case + * + * @return null + */ + protected function ecrireCase($line, $column, $value, $format) + { + $details = explode('_', $format); + if (in_array($details[1], $this->suffixes_entier)) { + $int = true; + } else { + $int = false; + } + if (!$value) { + $this->current_worksheet->writeBlank( + $line, + $column, + $this->formats[$format] + ); + } else { + if ($int === false) { + $this->current_worksheet->writeString( + $line, + $column, + $value, + $this->formats[$format] + ); + } else { + $this->current_worksheet->writeNumber( + $line, + $column, + $value, + $this->formats[$format] + ); + } + } + } + + /** + * Méthode permettant d'écrire quelque chose dans la case courante + * + * @param string $value valeur à mettre dans la case courante + * @param string $format format à utiliser pour la case courante + * + * @return null + */ + protected function ecrireCaseCourante($value, $format) + { + $line = $this->current_line; + $column = $this->current_column; + $this->ecrireCase( + $this->current_line, + $this->current_column, + $value, + $format + ); + $this->next(); + } + + /** + * Méthode permettant de merger avec la case précédente. + * + * @param string $line numero de la ligne, commence par 0. + * @param string $column numero de la colonne, commence par 0. + * + * @return null + */ + protected function mergerAvecCasePrecedente($line=null, $column=null) + { + if ($line === null ) { + $line = $this->current_line; + } + if ($column === null) { + $column = $this->current_column; + } + $this->current_worksheet->mergeCells( + $line, + $column-1, + $line, + $column + ); + } + + /** + * Passage à la case suivante. + * + * @return null + */ + protected function next() + { + $this->current_column++; + } + + /** + * Passage à la ligne suivante. + * + * @return null + */ + protected function nextLine() + { + $this->current_column=0; + $this->current_line++; + } + +} -- 1.7.10.4