Page 1 sur 1

Aide pour une class csv(Excel)

Posté : 09 févr. 2006, 15:33
par Maitrepylos
Bonjour, je viens de faire une petite class en php5.1, qui me permet de générer mes fichier .csv
<?php

class FicheExcel 	{

private 
$fp = null;

	
public 
	/**
	 * Ouvre le fichier en écriture seul et place le pointeur au début du fichier
	 */
	function Ouvrir() 	{
		
		$this ->fp = fopen('gg.csv', 'w');
		return $this->fp;		
								}
	/**
	 * Function permettant d'écrire dans le fichier
	 *
	 * $list est le paramètre qui doit recevoir un array
	 * ex $fichier->Insertion(array("1,2,3","4,5,6")).
	 * Chaque fois qu'il rencontre une virgule en dehors de la chaine de caractère il passe a la ligne.
	 * Chaque fois qu'il rencontre une virgule dans la chaine de caractère il passe a la cellule suivante.
	 */
	function Insertion($list)	{
		
		foreach ($list as $line) 	{
   		fputcsv($this->fp, split(',', $line));
									}

								}
	
	/**
	 * Ferme le fichier
	 *
	 */
	function fermer()	{
		
		fclose($this->fp);
						}
			
		
					}
?>
j'obtient bien le fichier comme ceci
<?php
include('../Class/ClassFicheExcel.php');

$fichier = new FicheExcel();
$fichier->Ouvrir();
$fichier->Insertion(array("un,deux,trois","5,3,4"));
$fichier->Insertion(array("quatre,cinq,six"));
$fichier->fermer();
?>
Pourriez-vous me dire comment ouvrir automatiquement ce fichier avec Excel.

Merci

Posté : 09 févr. 2006, 15:38
par zeus
Qu'est ce que tu entend par "ouvrir automatiquement ce fichier" ?
Ne pas avoir besoin de faire appel à la méthode "Ouvrir()" ?
Si c'est ça, il faut que tu créé un constructeur __FicheExcel qui va se charger d'ouvrir ton fichier.

Mais ne risque tu pas de trop spécialiser ta fonction en ne proposant pas l'url du fichier à ouvrir ?

Posté : 09 févr. 2006, 15:48
par Maitrepylos
En fait, je voudrais ne pas l'enregistrer ce fichier, mais le créer à la volé, et une fois généré, qu'il me propose soit de l'ouvrir, soit de l'enregistrer, un peu comme si je mettais un Header
header("content-type: application/vnd.ms-excel");
Mais cela ne fonctionne pas

ps : c'est une de mes premières class,(2 max à mon actif)

Posté : 09 févr. 2006, 16:08
par pascaltje
quelques liens:
- une méthode hyper simple, avec des entetes + tableaux html (voir dans les commentaires)
http://www.estvideo.com/dew/index/2004/ ... s-avec-php
- formats de cellules Excel en html
http://www.agoric.com/sources/software/htmltoExcel

Bon codage!

A+

Pascal

Posté : 09 févr. 2006, 16:10
par jeff
tu veut l'envoyé vers un client ou sur le serveur, si c'est un client de toute facon ca se fera avec un header

maintenat au niveau de ta class tu peut faire methode Output
public function output($choix,$name=null)
{
swicth($choix)
{
case 'send':break;//ici on envoi les bonnes entetes
case 'save':break://ici on enregiste le fichier
default:break;
}
}

Posté : 09 févr. 2006, 16:20
par Maitrepylos
Bonjour Jeff, peux tu être plus explicite svp

Posté : 09 févr. 2006, 16:29
par jeff
Pourriez-vous me dire comment ouvrir automatiquement ce fichier avec Excel.
peut eclaisir ce point (client/serveur)

Posté : 09 févr. 2006, 16:48
par Maitrepylos
Quand le client génére le fichier pour qu'il s'ouvre automatiquement sur ça machine.

Merci

Posté : 10 févr. 2006, 11:46
par Maitrepylos
j'ai rajouté cette fonction, mais cela ne fonctionne pas
function output(){
	header("content-type: application/vnd.ms-excel");
	$this->fp;
		
	}
$fichier->output();
merci de votre aide

Posté : 10 févr. 2006, 11:55
par zeus
j'ai rajouté cette fonction, mais cela ne fonctionne pas
C'est à dire ? J'ai cassé ma boule de cristal hier soir et je ne devine pas les erreurs ;)
Tu as une erreur ou rien ne s'affiche ?

Posté : 10 févr. 2006, 13:12
par Maitrepylos
Désolé

j'ai ceci

Code : Tout sélectionner

Warning: fopen(/Dossier/gg.csv) [function.fopen]: failed to open stream: Permission denied in /var/www/Ekoke/Class/ClassFicheExcel.php on line 15
et quand bien même si je fais un chmod a la main j'obtient

Code : Tout sélectionner

Warning: Cannot modify header information - headers already sent by (output started at /var/www/Ekoke/Tools/HtmlInc.php:5) in /var/www/Ekoke/Class/ClassFicheExcel.php on line 44
du coup je rajoute a la fonction ceci
function output(){
	ob_start();
	header("content-type: application/vnd.ms-excel");
	$this->fp;
	ob_end_clean();
		
	}
et là rien ne se produit, le fichier est généré, mais il ne l'envoie pas vers Excel.

Merci de votre aide

Posté : 10 févr. 2006, 15:10
par zeus
1ere erreur :
A mon avis, l'erreur vient d'ici. Tu essaye d'ouvrir un fichier qui n'existe pas
Il va surement falloir que tu passes par un objet DOM pour ouvrir un objet Excel inexistant

2eme erreur :
Ce doti être l'utilisation du header avec un caractère HTML avant

Posté : 13 févr. 2006, 15:42
par Maitrepylos

2eme erreur :
Ce doit être l'utilisation du header avec un caractère HTML avant
L'erreur viens de là, il ne faut pas mettre le ob_start(); dans la Class, mais dans le fichier ausquel je fais appel à la Class(logique).

De plus j'ai fais une nouvelle Class qui répond plus à mes besoins.


class FichierExcel {
	
private 
	$csv = Null;
	/**
	 * Cette ligne permet de créer les colonnes du fichers Excel
	 * Cette fonction est totalement faculative, on peut faire la même chose avec la
	 * fonction insertion, c'est juste une clarté pour moi
	 */
	function Colonne($file) {
		
		$this->csv.=$file."\n";
		return $this->csv;
		
	}
	
	/**
	 * Insertion des lignes dans le fichiers Excel, il faut introduire les données sous formes de chaines
	 * de caractaire.
	 * Attention a séparé avec une virgule.
	 */
	function Insertion($file){
		
		$this->csv.=$file."\n";
		return $this->csv;
	}
	
	/**
	 * fonction de sortie du fichier avec un nom spécifique.
	 *
	 */
	function output($NomFichier){
	
		//header("Content-type: application/vnd.ms-excel");
		header("Content-disposition: attachment; filename=$NomFichier.csv");
		print $this->csv;
		exit;
		
	}
}
J'ai mis le header("Content-type: application/vnd.ms-excel"); en commentaire par ce que sous windows il ajoute automatiquement xls.

merci de votre aide

Posté : 13 févr. 2006, 16:05
par zeus
juste une petite précision, à part, pour tagger un sujet [RESOLU], il ne faut pas éditer le 1er message pour changer le titre mais cliquer sur le bouton [RESOLU] qui se trouve en haut à gauche des messages que tu as ouvert ;)

J'ai modifié ce message pour toi mais pense y la prochaine fois :pouce: