Categories > OpenTBS with ODT >

Ou comment imprimer un tableau

The forum is closed. Please use Stack Overflow for submitting new questions. Use tags: tinybutstrong , opentbs
By: lodan
Date: 2007-01-04
Time: 16:11

Ou comment imprimer un tableau

Bonjour,

Je souhaite imprimer directement le résultat d'une requête Mysql.
Exemple :
$result=mysql_fetch_assoc......

Le résultat est un tableau à 2 dimensions, où chaque enregistrement est lui-même un tableau.

J'ai regardé dans la documentation du côté des blocks et autre serial. Alors j'ai essayé plusieurs choses mais je n'arrive qu'à avoir des erreurs.

J'ai donc repris l'exemple suivant :

$array_type1 = array('France'=>33, 'Angleterre'=>44, 'Espagne'=>34, 'Italie'=>39, 'Allemagne'=>49) ;

$array_type2[] = array('res_name'=>'Marie',  'res_score'=>300, 'res_date'=>'2003-01-10') ;
$array_type2[] = array('res_name'=>'Eric', 'res_score'=>215, 'res_date'=>'2003-01-10') ;
$array_type2[] = array('res_name'=>'Marc', 'res_score'=>180, 'res_date'=>'2003-01-10') ;
$array_type2[] = array('res_name'=>'Paul', 'res_score'=>175, 'res_date'=>'2003-01-10') ;
$array_type2[] = array('res_name'=>'Mat', 'res_score'=>120, 'res_date'=>'2003-01-10') ;
$array_type2[] = array('res_name'=>'Sophie', 'res_score'=>115, 'res_date'=>'2003-01-10') ;

$all_array['type1'] = $array_type1;
$all_array['type2'] = $array_type2;
$OOo = new clsTinyButStrongOOo;
$OOo->MergeBlock('blk1',$array_type1) ;
$OOo->MergeBlock('blk2',$array_type2) ;
$OOo->MergeBlock('blk3','array','all_array[type2]') ;
// Gestion des erreur de TBOoo
$TBS->NoErr = false; // plus aucun message d'erreur ne s'affiche.

// setting the object
$OOo->SetZipBinary($requete["chezipbinary"]);
$OOo->SetUnzipBinary($requete["cheunzipbinary"]);
$OOo->SetProcessDir($requete["cheprocessdir"]);
$OOo->SetDataCharset($requete["datacharset"]);

// créer un nouveau document openoffice avec le Template avec un id unique
$OOo->NewDocFromTpl($requete["chedocfromtpl"].$pub_doc["doc_original"]);

// merge data with OOo file content.xml
$OOo->LoadXmlFromDoc('content.xml');
$OOo->SaveXmlToDoc();

// display
header('Content-type: '.$OOo->GetMimetypeDoc());// Récupère le type de traitement à utiliser pour ouvrir un document de ce type.
header('Content-Length: '.filesize($file));
$OOo->FlushDoc($file);
$OOo->RemoveDoc($file);

Et dans mon document writer, j'ai mis :

Pays
Prefixe
[blk1.key;block=tr]
[blk1.val]
[blk1.key;block=tr]
[blk1.val]
[blk1;block=tr;nodata]Il n'y a pas de données.

ainsi que :

Position
Pseudo
Score
Date
[blk2.#]
[blk2.res_name;block=tr]
[blk2.res_score]
[blk2.res_date;frm='dd/mm/yy']
[blk2.#]
[blk2.res_name;block=tr]
[blk2.res_score]
[blk2.res_date;frm='dd/mm/yy']
[blk2;block=tr;nodata]Il n'y a pas de données.

etc...

Je n'ai aucune interprétation du résultat, j'ai sûrement oublié quelque chose, mais alors c'est soit que je suis pas sur la bonne documentation.

Merci de ma guider un peu

By: Olivier Loynet
Date: 2007-01-04
Time: 19:29

Re: Ou comment imprimer un tableau

bonjour,

Tu as mal placé les commandes de fusion des blocks dans ton PHP.
il faut le mettre entre
LoadXmlFromDoc
et
SaveXmlToDoc

voir ci-dessous
$OOo = new clsTinyButStrongOOo;

// Gestion des erreur de TBOoo
$TBS->NoErr = false; // plus aucun message d'erreur ne s'affiche.

// setting the object
$OOo->SetZipBinary($requete["chezipbinary"]);
$OOo->SetUnzipBinary($requete["cheunzipbinary"]);
$OOo->SetProcessDir($requete["cheprocessdir"]);
$OOo->SetDataCharset($requete["datacharset"]);

// créer un nouveau document openoffice avec le Template avec un id unique
$OOo->NewDocFromTpl($requete["chedocfromtpl"].$pub_doc["doc_original"]);

// merge data with OOo file content.xml
$OOo->LoadXmlFromDoc('content.xml');

$OOo->MergeBlock('blk1',$array_type1) ;
$OOo->MergeBlock('blk2',$array_type2) ;
$OOo->MergeBlock('blk3','array','all_array[type2]') ;

$OOo->SaveXmlToDoc();

// display
header('Content-type: '.$OOo->GetMimetypeDoc());// Récupère le type de traitement à utiliser pour ouvrir un document de ce type.
header('Content-Length: '.filesize($file));
$OOo->FlushDoc($file);
$OOo->RemoveDoc($file);

By: lodan
Date: 2007-01-05
Time: 10:26

Re: Ou comment imprimer un tableau

Bonjour Olivier et Merci,

J'ai même testé avec une requête Mysql et cela fonctionne.

Par contre pour l'impression du résultat sur mon document .odt, j'ai mis ceci :
Exemple avec un Array simple : [blk1.#] lignes affichées

Pays
Prefixe
[blk1.key]
[blk1.val]
[blk1.key]
[blk1.val]

Exemple avec un Array composé : [blk2.#] lignes affichées

Position
Pseudo
Score
Date
[blk2.#]
[blk2.res_name]
[blk2.res_score]
[blk2.res_date;frm='dd/mm/yy']
[blk2.#]
[blk2.res_name]
[blk2.res_score]
[blk2.res_date;frm='dd/mm/yy']

Exemple avec un Array appelé par requête : [blk3.#] lignes affichées

Position
Pseudo
Score
Date
[blk3.#]
[blk3.res_name]
[blk3.res_score]
[blk3.res_date;frm='dd/mm/yy']
[blk3.#]
[blk3.res_name]
[blk3.res_score]
[blk3.res_date;frm='dd/mm/yy']

Et il m'affiche 2 lignes pour chacun des types de tableau et à chaque fois les lignes sont identiques :

Exemple avec un Array simple : 1 lignes affichées

Pays
Prefixe
France
33
France
33

Exemple avec un Array composé : 1 lignes affichées

Position
Pseudo
Score
Date
1
Marie
300
10/01/03
1
Marie
300
10/01/03

Exemple avec un Array appelé par requête : 1 lignes affichées

Position
Pseudo
Score
Date
1
Marie
300
10/01/03
1
Marie
300
10/01/03

Ai-je une boucle à mettre quelque part ?
By: Olivier Loynet
Date: 2007-01-05
Time: 11:19

Re: Ou comment imprimer un tableau

Bonjour,

Tu as oublié de définir le début et la fin du bloc.
Il y a plusieurs méthodes. Si c'est possible le plus simple est de le faire en relatif. Exemple si ton code suivant est un tableau

[blk2.#;block=table:table-row]
[blk2.res_name]
[blk2.res_score]
[blk2.res_date;frm='dd/mm/yy']

Olivier
By: lodan
Date: 2007-01-05
Time: 11:35

Re: Ou comment imprimer un tableau

Merci encore Olivier,

Cela fonctionne très bien pour les tableaux, mais pas pour des tableaux issus d'une requête mysql.

J'ai fait ceci
$OOo->MergeBlock("blk1",$cnx_id,"$sql") ;

$sql étant ma requête et ceci sur mon .odt

[blk1.pat_bien_num;block=table:table-row] [blk1.pat_description]

J'ai l'erreur suivante :

(Block definition): [blk1.pat_bien_num</text:span>] can not be defined because tag <table:table-row<text:span text:style-name="T4">> or </table:table-row<text:span text:style-name="T4">> is not found.

J'ai regardé de ce côté de la doc "http://www.tinybutstrong.com/fr/examples.php" au chapitre "Syntaxe des blocs". Mais je n'ai pas trouvé d'explication.
By: Olivier Loynet
Date: 2007-01-05
Time: 15:53

Re: Ou comment imprimer un tableau

Bonjour,

C'est un probleme qui arrive parfois lorsqu'une balise TBS est formaté dans un style et une autre parti de la balise dans un autre style. En plus ce n'est pas visible à l'oeil.

Il faut supprimer la balise complètement et la re-écrire.
Il est interdit de faire des retours charriots dans une balise.

Aussi, il arrive qu'un document qui fonctionnait, ne marche plus.
Pour remedier à ce probleme, je récupère toutes les balises dans un fichier texte pur, je refais le document et la mise en page et je remets les balises en faisant "coller spécial, texte non formaté"

Lorsque tu fais des tests, garde le document ouvert qui sert template dans OpenOffice, cela permet en autre d'utiliser l'annulation même si tu as fais une sauvegarde

Olivier

By: lodan
Date: 2007-01-05
Time: 16:15

Re: Ou comment imprimer un tableau

La syntaxe explicite fonctionne très bien :
[blk1;block=begin]
[blk1.pat_bien_num] [blk1.pat_description]
[blk1;block=end]

La syntaxe relative, dès que je met cela :
[blk1.pat_bien_num;block=table:table-row] [blk1.pat_description]

J'ai l'erreur :

(Block definition): [blk1.pat_bien_num] can not be defined because tag <table:table-row> or </table:table-row> is not found.
By: Olivier Loynet
Date: 2007-01-05
Time: 17:58

Re: Ou comment imprimer un tableau

car il ne doit y avoir de balise XML dans le fichier "table:table-row"
Tu as choisi la bonne méthode en utilisant les blocs absolus dans ton cas.

Olivier
By: lodan
Date: 2007-01-05
Time: 18:56

Re: Ou comment imprimer un tableau

Merci Olivier,

Je n'ai plus que des problèmes de mise en page, mais je vais bien finir par trouver

Bonne soirée