Location: PHPKode > scripts > OpenOffice Spreadsheet Generation > calc/classes/OpenOfficeSpreadsheet.class.php
<?php

// Définition du chemin absolu du dossier openoffice. Comme ce fichier se trouve dans calc/classes, on
// fait 2x le array_pop
$_openoffice_path = str_replace('\\', '/', dirname(__FILE__));
$_openoffice_path = explode('/', $_openoffice_path);
array_pop($_openoffice_path);
array_pop($_openoffice_path);
$_openoffice_path = implode('/', $_openoffice_path);

/**
 * Définition du chemin du dossier principal où se situent les documents générés et les scripts et tout, en fait
 *
 * @var 	string		PATH_ROOT					Le chemin depuis la racine vers le dossier openoffice
 */
define ('PATH_ROOT',							$_openoffice_path.'/');

/**
 * Les chemins par défaut basés sur le PATH_ROOT
 *
 * @var 	string		PATH_CALC					Le chemin depuis la racine vers le dossier calc
 * @var 	string		SAVE_FILE_PATH_CALC			Le chemin depuis la racine vers le dossier des zip générés
 * @var 	string		TEMPLATE_FILE_PATH_CALC		Le chemin depuis la racine vers le dossier de template (pour la création des zip)
 */
define ('PATH_CALC',							PATH_ROOT.'calc/');
define ('SAVE_FILE_PATH_CALC',					PATH_CALC.'generated/');
define ('TEMPLATE_FILE_PATH_CALC',				PATH_CALC.'templates/');



















/**
 * Insertion des classes requises
 */
require_once ('EasyZIP.class.php');
require_once ('Fonction.class.php');
require_once ('Manifest.class.php');
require_once ('Meta.class.php');
require_once ('Settings.class.php');
require_once ('Styles.class.php');
require_once ('Content.class.php');

/**
 * OpenOfficeSpreadsheet est un ensemble de classes permettant de générer un document OpenOffice
 * Spreadsheet (feuille de calcul ou tableur). Ces classes contiennent un certain nombre de
 * fonctions permettant la mise en page et le remplissage de cellules. Euh, sinon c'est tout.
 * Mais il y a de quoi faire, notamment au niveau des classes Settings et Styles, mais ça
 * viendra (peut-être) plus tard.
 *
 * Sinon, c'est gratuit, c'est sympa, et même si ça ne sert pas à grand chose, ça sert quand
 * même à quelque chose. Donc finalement, c'est cool. Alors enjoy!
 *
 * @package		OpenOfficeGeneration
 * @version		0.1
 * @copyright	(C) 2006 Tafel. All rights reserved
 * @license		http://www.gnu.org/copyleft/lesser.html LGPL License
 * @author		Tafel <hide@address.com>
 *
 * Programme sous licence GPL. Toute reproduction, même patielle, est autorisée, avec ou sans le
 * consentement du programmeur principal (avec, c'est mieux, quand même ;) ...)
 */
class OpenOfficeSpreadsheet {
	
	/**
	 *-------------------------------------------------------------------------------
	 * Propriétés
	 *-------------------------------------------------------------------------------
	 */	
	
	/**
	 * @access	public
	 * @var 	object			$manifest				L'objet DOMDocument du Manifest
	 */
	public $manifest;
	
	/**
	 * @access	public
	 * @var 	object			$meta					L'objet DOMDocument du Meta
	 */
	public $meta;
	
	/**
	 * @access	public
	 * @var 	object			$settings				L'objet DOMDocument des Settings
	 */
	public $settings;
	
	/**
	 * @access	public
	 * @var 	object			$styles					L'objet DOMDocument des Styles
	 */
	public $styles;
	
	/**
	 * @access	public
	 * @var 	object			$content				L'objet DOMDocument du Content
	 */
	public $content;
	
	/**
	 * @access	protected
	 * @var 	string			$pathTemplates			Le chemin vers les templates
	 */
	protected $pathTemplates;
	
	/**
	 * @access	protected
	 * @var 	string			$pathSave				Le chemin vers le dossier de sauvegarde
	 */
	protected $pathSave;
	
	/**
	 * @access	protected
	 * @var 	string			$documentName			Le nom du document OpenOffice créé
	 */
	protected $documentName;
	
	/**
	 * @access	protected
	 * @var 	string			$extension				L'extension du fichier
	 */
	protected $extension;
	
	/**
	 * @access	protected
	 * @var 	string			$contentType			Le type de fichier
	 */
	protected $contentType;
	
	/**
	 * @access	protected
	 * @var 	boolean			$keepGeneratedRep		False pour effacer le dossier généré, True pour le conserver
	 */
	protected $keepGeneratedRep;
	
	
	/**
	 *-------------------------------------------------------------------------------
	 * Constructeur
	 *-------------------------------------------------------------------------------
	 */	
	
	/**
	 * Constructeur de classe
	 *
	 * @access 	public
	 * @param 	string			$document_name			Le nom du document à créer
	 * @param 	string			$path_save				Le chemin vers le dossier de sauvegarde
	 * @param 	string			$path_templates			Le chemin vers les templates
	 * @return 	object									L'objet de classe
	 */
	public function __construct($document_name, $path_save = '', $path_templates = '') {
		$docSave                = $this->_setTempDirName();
		$path_templates         = ($path_templates == '') ? TEMPLATE_FILE_PATH_CALC : $path_templates;
		$path_save              = ($path_save == '') ? SAVE_FILE_PATH_CALC : $path_save;
		$this->extension        = 'ods';
		$this->contentType      = 'application/vnd.oasis.opendocument.spreadsheet';
		$this->keepGeneratedRep = false;
		
		$this->pathTemplates    = Fonction::removeLastSlash($path_templates);
		$this->pathSave         = Fonction::removeLastSlash($path_save).'/'.$docSave;
		$this->documentName     = Fonction::checkFileName($document_name, $this->extension);
		
		try {
			$this->manifest = new Manifest($this->pathSave.'/META-INF', $this->pathTemplates.'/META-INF', true, false);
			$this->meta     = new Meta($this->pathSave, $this->pathTemplates, true, false);
			$this->settings = new Settings($this->pathSave, $this->pathTemplates, true, false);
			$this->styles   = new Styles($this->pathSave, $this->pathTemplates, true, false);
			$this->content  = new Content($this->pathSave, $this->pathTemplates, true, false);
		} catch (Exception $e) {
			echo '<br><b>Notice : </b>'.$e->getMessage().'<br>';
		}
	}
	
	
	/**
	 *-------------------------------------------------------------------------------
	 * Méthodes publiques de gestion de contenu
	 *-------------------------------------------------------------------------------
	 */
	
	/**
	 * Fonction qui créé une nouvelle feuille
	 *
	 * @access 	public
	 * @param 	string			$sheet					Le nom de la feuille
	 * @return 	object									L'objet Sheet
	 */
	public function addSheet($sheet) {
		return $this->content->addSheet($sheet);
	}
	
	
	/**
	 *-------------------------------------------------------------------------------
	 * Méthodes publiques de sauvegarde et affichage
	 *-------------------------------------------------------------------------------
	 */
	
	/**
	 * Fonction qui créé un ZIP avec tous les fichiers nécessaires
	 *
	 * @access 	public
	 * @param 	boolean			$in_file				True pour créer un fichier, false pour renvoyer un flux
	 * @return 	object|boolean							True ou le pack des fichiers EasyZIP
	 */
	public function save($in_file = true) {
		$this->_saveFile();
		$zip = new EasyZIP();
		// On ajoute tous les fichiers au ZIP
		if ($handle = opendir($this->pathSave)) { 
			while (false !== ($filename = readdir($handle))) {
				if ($filename != '.' && $filename != '..'){
					if (is_dir($this->pathSave.'/'.$filename))
						$zip->addDir($this->pathSave, $filename);
					else
						$zip->addFile($filename, $this->pathSave.'/');
				}
			}
			closedir($handle);
		}
		$fileName = ($in_file) ? $this->documentName : '';
		$result = $zip->zipFile($fileName);
		// On supprime le répertoire généré
		if (!$this->keepGeneratedRep)
			Fonction::delDir($this->pathSave);
		// On retourne le fichier ZIP
		return $result;
	}
	
	/**
	 * Fonction qui créé l'output du fichier avec headers et tutti quanti
	 *
	 * @access 	public
	 * @return 	void
	 */
	public function output() {
		header('Content-type: '.$this->contentType);
		header('Content-Disposition: attachment; filename='.$this->documentName);
		header('Cache-control: no-store, no-cache, must-revalidate');
		header('Pragma: no-cache');
		header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
		header('Expires: 0');
		
		echo $this->save(false);
	}
	
	/**
	 * Fonction qui retourne le flux XML du ou des fichiers composant le document
	 *
	 * @access 	public
	 * @param 	string			$file					Le fichier dont on veut voir le flux
	 * @param 	boolean			$xmp					True pour afficher le flux entre des balises <xmp>
	 * @return 	string									Le flux XML du fichier
	 */
	public function saveXML($file = '', $xmp = false) {
		$xml = (!$xmp) ? '' : '<xmp>';
		switch ($file) {
			case 'manifest': $xml .= $this->manifest->saveXML(); break;
			case 'meta':     $xml .= $this->meta->saveXML();     break;
			case 'settings': $xml .= $this->settings->saveXML(); break;
			case 'styles':   $xml .= $this->styles->saveXML();   break;
			case 'content':  $xml .= $this->content->saveXML();  break;
			default:
				$xml .= $this->manifest->saveXML();	
				$xml .= $this->meta->saveXML();
				$xml .= $this->settings->saveXML();
				$xml .= $this->styles->saveXML();
				$xml .= $this->content->saveXML();
		}
		$xml .= (!$xmp) ? '' : '</xmp>';
		return $xml;
	}
	
	
	/**
	 *-------------------------------------------------------------------------------
	 * Méthodes getters et setters
	 *-------------------------------------------------------------------------------
	 */
	
	/**
	 * Fonction qui détermine si on veut garder le dossier généré ou non
	 *
	 * @access 	public
	 * @param 	boolean			$choix					True pour le garder, false pour l'effacer
	 * @return 	void
	 */
	public function keepGeneratedDir($choix) {
		if ($choix)
			$this->keepGeneratedRep = true;
		else 
			$this->keepGeneratedRep = false;	
	}
	
	/**
	 * Fonction qui retourne le nom du dossier généré pour la sauvegarde
	 *
	 * @access 	public
	 * @return 	string									Le nom du dossier généré
	 */
	public function getGeneratedDirName() {
		return $this->pathSave;	
	}
	
	/**
	 * Fonction qui retourne le nom du dossier de templates
	 *
	 * @access 	public
	 * @return 	string									Le nom du dossier de templates
	 */
	public function getTemplatesDirName() {
		return $this->pathTemplates;	
	}
	
	/**
	 * Fonction qui retourne l'extension du document généré
	 *
	 * @access 	public
	 * @return 	string									L'extension du document généré
	 */
	public function getExtensionFile() {
		return $this->extension;	
	}
	
	/**
	 * Fonction qui retourne le type de contenu du document généré (content-type)
	 *
	 * @access 	public
	 * @return 	string									Le type de contenu (content-type)
	 */
	public function getContentTypeFile() {
		return $this->contentType;	
	}
	
	
	/**
	 *-------------------------------------------------------------------------------
	 * Méthodes privées
	 *-------------------------------------------------------------------------------
	 */
	
	/**
	 * Fonction qui sauvegarde les fichiers dans le dossier de sauvegarde
	 *
	 * @access 	protected
	 * @return 	void
	 */
	protected function _saveFile() {
		if (!is_dir($this->pathSave))
			mkdir($this->pathSave, 0777);
		if (!is_dir($this->pathSave.'/Configurations2'))
			mkdir($this->pathSave.'/Configurations2', 0777);
		if (!is_dir($this->pathSave.'/Pictures'))
			mkdir($this->pathSave.'/Pictures', 0777);
		if (!is_dir($this->pathSave.'/Thumbnails'))
			mkdir($this->pathSave.'/Thumbnails', 0777);
		copy($this->pathTemplates.'/Thumbnails/thumbnail.png', $this->pathSave.'/Thumbnails/thumbnail.png');
		copy($this->pathTemplates.'/Configurations2/EMPTY.log', $this->pathSave.'/Configurations2/EMPTY.log');
		copy($this->pathTemplates.'/Pictures/EMPTY.log', $this->pathSave.'/Pictures/EMPTY.log');
		$this->manifest->saveFile();
		$this->meta->saveFile();
		$this->settings->saveFile();
		$this->styles->saveFile();
		$this->content->saveFile();
	}
	
	/**
	 * Fonction qui créé un nom de répertoire temporaire
	 *
	 * @access 	protected
	 * @return 	string									Le nom du répertoire temporaire
	 */
	protected function _setTempDirName() {
		// Création du dossier temporaire pour la sauvegarde
		if (function_exists('microtime'))
			// Format du nom : temp_{timestamp Unix}{2 digit microsecondes}
			$docSave = 'temp_'.str_replace('.', '', microtime(true));
		else
			// Format du nom : temp_{timestamp Unix}
			$docSave = 'temp_'.date('U');
		return $docSave;
	}
	
}

?>
Return current item: OpenOffice Spreadsheet Generation