generer un fichier csv avec mise en forme

Eléphanteau du PHP | 10 Messages

30 oct. 2011, 21:06

Bonjour,
Je suis en train de modifier un fichier php qui genere un csv :D
Jusque l'a, je n'ai pas eu trop de mal , l'export se passe bien comme je le veu sauf concernant la mise en forme.
Toute les données sont sur une ligne hors cela concerne des ecritures devant etre importer en compta et j'aimerai que la mise en forme manuel que l'on fait depuis excel soit déja faite lors de l'export csv :D

Voici l'exemple que je cherche à faire :
journal ; compte ; libelé ; debit ; credit ; date ; numero de facture ; ref. lettrage
vt 411 nom client 119.60 01
vt 707 nom client 100 01
vt 445714 nom client 19.6 01

On a le titre pour chaques colonnes et comme cela est des ecritures compta, chaque ligne correspond à un compte par ordre de numero de facture

Voici mon fichier php pour mieux comprendre sur quoi je part :mrgreen:

Code : Tout sélectionner

<?php class Compta extends Module { public $fieldlist=array( 0=>'"VT"', 1=>'O.`id_order`', 2=>'CONCAT(AD.`id_customer`, " . ", AD.`lastname`, " ", AD.`firstname`, " ", "commande"," ", O.`id_order`)', 3=>'O.`payment`', 4=>'O.`total_discounts`', 5=>'O.`total_paid`', 6=>'O.`total_paid_real`', 7=>'O.`total_products`', 8=>'CONCAT(O.`total_products_wt` - O.`total_products`)', 9=>'O.`total_products_wt`', 10=>'O.`total_shipping`', 11=>'O.`carrier_tax_rate`', 12=>'O.`total_shipping`/ (O.`carrier_tax_rate`+ 100) * O.`carrier_tax_rate`', 13=>'O.`total_shipping` - O.`total_shipping`/ (O.`carrier_tax_rate`+ 100) * O.`carrier_tax_rate`', 14=>'O.`total_wrapping`', 15=>'O.`invoice_number`', 16=>'O.`invoice_date`', 17=>'O.`id_cart`', 18=>'O.`valid`', 19=>'O.date_add' ); public $fieldnames=array( 0=>'journal', 1=>'Order No', 2=>'Client', 3=>'Payment', 4=>'Total Discounts', 5=>'Total Paid', 6=>'Total Paid Real', 7=>'Total Produit HT', 8=>'TVA produit', 9=>'Total product TTC', 10=>'frais de port net', 11=>'Taux TVA transporteur', 12=>'valeur TVA f.port', 13=>'port ht', 14=>'Total Wrapping', 15=>'numero de facture', 16=>'date de facture', 17=>'Numero de panier', 18=>'valide', 19=>'Date Added' ); function __construct() { $this->name = 'compta'; $this->tab = 'billing_invoicing'; $this->version = '1.0'; /* The parent construct is required for translations */ parent::__construct(); $this->page = basename(__FILE__, '.php'); $this->displayName = $this->l('Export factures'); $this->description = $this->l('module pour exporter les factures en compta.'); } function install() { if (!parent::install()) return false; // Trunk file if already exists with contents /* if (!$fd = @fopen(dirname(__FILE__).'/editorial.xml', 'w')) return false; @fclose($fd); */ } function getContent() { /* display the module name */ $this->_html = '<h2>'.$this->displayName.'</h2>'; /* update the editorial xml */ if (isset($_POST['submitFilter'])) { $fields=array(); $titles=array(); foreach($_POST['eofields'] AS $fieldno){ $fields[]=$this->fieldlist[$fieldno]; $titles[]=$this->fieldnames[$fieldno]; } $premiere_fact='0'; $sql='SELECT '.implode(', ', $fields).' FROM '._DB_PREFIX_.'orders AS O, '._DB_PREFIX_.'customer AS C, '._DB_PREFIX_.'address AS AD, '._DB_PREFIX_.'address AS AI WHERE AI.id_address=id_address_invoice AND AD.id_address=id_address_delivery AND C.id_customer=O.id_customer AND valid = 1 AND invoice_number > '.$premiere_fact.' order by invoice_number'; $orderlist = Db::getInstance()->ExecuteS($sql); $f=fopen(dirname(__FILE__).'/ecritures.csv', 'w'); fwrite($f, implode('; ', $titles)."\r\n"); foreach($orderlist AS $order){ fwrite($f, implode('; ', $order)."\r\n"); } Tools::redirect('modules/compta/ecritures.csv'); }else{ /* display the editorial's form */ $this->_html.=$this->_displayForm(); if (file_exists(dirname(__FILE__).'/ecritures.csv')){ $this->_html.='<p><a href="../modules/compta/ecritures.csv">'.$this->l('Download Last Report').'</a></p>'; } $this->_html.='<p> Telecharger <a href="../modules/compta/exportcompta.php" target="_blank" style="text-decoration:underline; color:blue;">ecriture</a>. </p>'; return $this->_html; } } private function _displayForm() { $form='<form method="post">'; $form.='<table>'; $form.=' <tr> <td height="30">'.$this->l('Check the fields you would like to export.').'</td> </tr>'; $form.=' <tr> <td height="30"><input type="button" onClick="checkDelBoxes(this.form, \'eofields[]\', true)" value="'.$this->l('Check All').'" /> <input type="button" onClick="checkDelBoxes(this.form, \'eofields[]\', false)" value="'.$this->l('Uncheck All').'" /></td> </tr>'; foreach($this->fieldnames as $key=>$name){ $selected=''; if(isset($_POST['eofields'])){ if(in_array($key, $_POST['eofields'])){ $selected=' checked'; } } $form.=' <tr> <td style="height:30px;" valign="top"> <label for="field'.$key.'">'.$this->l($name).'</label> &nbsp; <input type="checkbox" name="eofields[]" id="field'.$key.'" value="'.$key.'"'.$selected.' /> </td> </tr>'; } $form.=' <tr> <td height="30"><input type="submit" name="submitFilter" value="'.$this->l('Generate Report').'" /></td> </tr>'; $form.='</table>'; $form.='</form>'; return $form; } }
merci beaucoup pour votre aide :D

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

30 oct. 2011, 22:33

Que contient ton fichier csv ? que devrait-il contenir ?

A première vue, les "\r\n" des retours à la ligne sont bien intégrés dans ton csv...

Le problème vient-il du fichier généré ou bien de l'affichage de celui-ci dans un navigateur (qui n'affichera effectivement pas les retours à la ligne)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 10 Messages

31 oct. 2011, 00:12

Bonjour,
Voici en piece jointe ce que j'obtient actuellement :D
Ce que j'aimerai, c'est réaliser la mise en forme comme je l'a présente au debut de ce fil :)
Avec ce format souhaité (celui du début de debut de ce fil ), le fichier csv serait parfait pour une importation en compta sans devoir le retoucher :D
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

31 oct. 2011, 12:45

salut,

je ne comprend pas ton problème tu voudrais que les colonnes aient déjà la bonne taille dans excel ?

quand tu ouvre le fichier avec notepad tu a tout sur une ligne ?
A tu essayé a part le code de génération du fichier pour voir ce que ça donne ?

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 10 Messages

31 oct. 2011, 18:30

Bonjour,
voici une capture d'ecran de ce que je cherche à faire :D
Sur la capture , on voi que les informations qui sont en general sur une ligne, sont en place sur plusieurs ligne.

ce fichier csv a été généré tel que avec les titres en tete de chaques colonnes(journal, compte, n° facture, etc... On les voit pas sur la capture à cause de l'ascenceur) avec un script en php.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

31 oct. 2011, 20:14

fait voir un exemple du fichier généré parce que bon la c'est pas clair, a la limite excel on s'en fou. ce qui compte c'est le fichier texte et ce qu'il y a dedans :)

il faut vraiment juste tester le code qui génére le fichier et comparer ce que tu veux et ce que tu a (avec notepad ou notepad ++ pas avec excel :)))

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 10 Messages

01 nov. 2011, 11:57

bonjour,
voici ce que donne le fichier actuellement au format txt :
journal; compte; Order No; Client; Payment; Total Discounts; Total Paid; Total Paid Real; Total Produit HT; TVA produit; Total product TTC; frais de port net; Taux TVA transporteur; valeur TVA f.port; port ht; Total Wrapping; numero de facture; date de facture; Numero de panier; valide; Date Added
VT; ; 3; 2 . do john commande 3; SIPS/ATOS; 0.00; 38.32; 38.32; 25.04; 4.91; 29.95; 8.37; 19.600; 1.371672241; 6.998327759; 0.00; 2; 2011-04-17 11:41:21; 22; 1; 2011-04-17 11:41:20
VT; ; 4; 2 . do john commande 4; Carte bancaire; 0.00; 38.32; 38.32; 25.04; 4.91; 29.95; 8.37; 19.600; 1.371672241; 6.998327759; 0.00; 3; 2011-04-17 11:57:42; 24; 1; 2011-04-17 11:57:42

et voici le format que je veux obtenir :
Journal;Commande;Facture;ID Transaction;Date;Libele;Compte;Debit;Credit;Informations diverses
VTI;11928;11265;;01/04/2010;5904 , john doe;707INTERNET;;28.09;HT Total HT: 28.09
VTI;11928;11265;;01/04/2010;5904 , john doe;445714;;5.51;FR TVA 19.6%: 33.6
VTI;11928;11265;;01/04/2010;5904 , john doe;411INTERNET;33.6;;Total: 0

dans l'actuel, chaque données d'une commande tien sur une ligne et dans le format souhaité, elle tien sur 3 lignes ainsi, On a le titre pour chaques colonnes et comme cela est des ecritures compta, chaque ligne correspond à un compte de comptabilité par ordre de numero de facture :D

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

01 nov. 2011, 12:40

oula ce n'est plus du csv que tu souhaite la !
il faut que pour chaque ligne tu reconstruise les trois que tu indique.

Ce n'est pas plus compliqué, simplement au lieu de faire un implode tu va devoir reprendre les champs que tu souhaite pour recréer 3 lignes et ensuite les mettres dans le fichier.

la dedans
foreach($orderlist AS $order){
fwrite($f, implode('; ', $order)."\r\n");
}

tu reconstruit les 3 lignes à partir de $order et ensuite fwrite pour insérer dans le fichier !


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 10 Messages

01 nov. 2011, 13:29

Bonjour,
Tu veux dire sous cette forme ?

Code : Tout sélectionner

foreach($orderlist AS $order){ //fwrite($f, implode('; ', $order)."\r\n"); fwrite($f, 'O.id_order','O.payment'('; ', $order)."\r\n");

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

01 nov. 2011, 14:39

sur le principe oui, après je ne connais pas la structure de ta table ni des champs que tu veux mettre dans le ficher.

fwrite($f, 'O.id_order','O.payment'('; ', $order)."\r\n");

après ce que tu viens de mettre n'a pas de sens vu que la tu essai de passer 4 argument à fwrite alors c'est 3 max
http://php.net/fwrite

il faut que tu passe une chaine de caractère dans ce style : $champ1.';'.$champ2.';'.$champ3.';'.$champ4 etc etc
sans oublier les "\r\n" pour les retours chariot + saut de ligne

@+
Il en faut peu pour être heureux ......