IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

W4 Express Java Discussion :

Générations d'impressions Excel ou word via _printModel


Sujet :

W4 Express Java

  1. #1
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juin 2007
    Messages : 58
    Points : 59
    Points
    59
    Par défaut Générations d'impressions Excel ou word via _printModel
    Objectif : comment générer un doc Word ou Excel à partir d'un LyObject leonardi ?
    On suppose dans ce cas l'existence d'un modèle de document (comme une facture, un bon de commandes ... edité sous Word ou Excel) mais il faut que Leonardi complete les contenus.

  2. #2
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juin 2007
    Messages : 58
    Points : 59
    Points
    59
    Par défaut Exemple 1 : cas de la génération d'un .RTF
    Il y a aussi un exemple dans la démo 'Hotel' sur l'impression d'une
    réservation.
    Dans hotel, le modèle et l'exécution de word se trouve dans le
    répertoire <leonardi>/studio/examples/hotel/print


    Le principe est de replacer des mots clés dans un document template
    édité à l'origine sous word.

    Le point de départ est par exemple un document word qui correspond à ce
    que l'on veut afficher : par exemple une facture.

    1. Le document word modèle doit etre sauvegardé dans un format textuel :
      soit RTF soit au format XML (WordML) ce qui est possible à partir de Office2003. Pour le cas du XML voir l'exemple de Excel.
      NB : XML est plus logique et plus 'lisible' que RTF donc plus simple à mettre en oeuvre.

      WordML est plus compréhensible que RTF à l'édition, mais suppose que
      vous disposiez de Word 2003 ou > et pas de Word 2000.
    2. Ajouter une action de template _printModel (ou bien utiliser
      Studio avec l'action générique _printModel et les paramètres
      ci-dessous par exemple)

      Exemple :
      Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
       
                  <ACTION id="print_model_reservation" template="_printModel">
                        <NAME value="NAME_PRINT_MODEL_RESERVATION"/>
                        <PARAMETER name="_command" value="print\\printWord.bat
      %1"/>
                        <PARAMETER name="_model"
      value="print/reservation.rtf"/>
                        <PARAMETER name="_output" value="Facture.rtf"/>
                  </ACTION>
    3. Remplacer dans le document word modèle les champs à rendre dynamique :
      la syntaxe est celle indiquée ci-dessous.

      Le contexte est l'objet (ou les objets sélectionnés) lors de l'action.

      1. Ensuite, les variables @@xxx@@, xxx désigne le champ de l'objet du
        contexte à afficher.
        exemple : @@incomeTTC@@ sera remplacé par la valeur du champ "incomeTTC"
        de l'objet sélectionné.
      2. Pour chercher à travers les champs du type relation : par exemple une
        facture à une relation vers un client (incomeClient) et le client a un
        champ
        adresse 'clientAddress' : la variuable est alors :
        @@incomeClient::clientAddress@@ ce qui veut dire :
        Code java : Sélectionner tout - Visualiser dans une fenêtre à part
        currentObject.getIncomeClient().getClientAddress()
      3. il existe des valeurs par defaut que vous pouvez ajouter (vous pouvez
        ajouter les votres aussi dans le behavior de l'action printModel (cf. exemple sous excel))
        @@ONAME@@ est le nom de l'objet courant (currentObject.getName())
        @@CURRENT_DATE@@ est la date au moment de l'impression.
      4. Des sections correspondant à plusieurs objets (contexte avec
        plusieurs objets ou bien relation multiple) peuvent répéter un 'pattern'

        @@REPEAT_OBJECT_START@@

        @@REPEAT_OBJECT_END@@
        Ce pattern fait un copier coller de la zone entre START et END pour
        chaque objet. Voir exemple de facture en piece jointe.
      5. Il est possible de trier le résultat dans une relation multiple :
        @@REPEAT_OBJECT_START::incomeItems(SORT_ID=incomeItemsort)@@
        on indique la relation (incomeItems) et le critere de tri (doit etre
        défini dans le modele)
      6. @@incomeItems[0]::FIELDNAME_incomeItemProjectItem@@
        FIELD_NAME_xxx remplace le NOM du champ xxx et non pas sa valeur.
      7. @@incomeItems[i]@@
        entre crochet est indiqué l'index de l'objety à afficher en cas de
        relation multiple. La liste commence à l'index 0.

        Un exemple avec tous les cas de figure pour l'application
        leon/contrib/compta est fourni en piece jointe pour RTF.

        Dans laquelle vous déclarez la chemin relatif de votre template (_model)
        celui vers le fichier de sortie si besoin (_output)

    4. Et la commande utilisée dans notre le chemin vers printWord.bat décrit
      ci-dessous:
      Fichier printWord.bat contient :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      @start /wait "printing" "C:\Program Files\Microsoft
      Office\Office\winword.exe" %1

  3. #3
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juin 2007
    Messages : 58
    Points : 59
    Points
    59
    Par défaut Exemple 2 : cas d'un document XML (avec Excel 2003 ici)
    Extraire l'application de démo ci-jointe (cf. zip en piece jointe en bas)
    ******************************
    FICHIERS Excel modifiés dans cette démo :
    1. printModelExample/modeles/fichiers sources/navette_1.xsl : fichier Excel NON MODIFIE, votre fichier d'origine
    2. printModelExample/modeles/fichiers sources/Navette_feuille_calcul_avant_modif.xml : le fichier d'origine de 1) après sauvegarde (Fichier/sauvegarder/feuille de calcul XML) sous Excel de office 2003 en XML
    3. printModelExample/modeles/Navette_feuille_calcul.xml le fichier ci-dessus APRES AVOIR ajouté les mots clés c'est le seul fichier qui soit utile à l'exécution. C'est celui qui est lu par la démo.
    4. printModelExample/modeles/Navette_resu.xml : c'est le fichier qui est généré quand on appuie sur le bouton. Juste pour voir le résultat de la transformation.


    Une seule classe Java dans la démo : ActprintmodelBehavior.java dont le source est dans le zip et en bas de cet email.

    Sur cette petite application j'ai une classe "navette" avec une relation simple vers 2 zones, une relation multiple vers des réceptionnaires.

    1. Ajout d'une action actPrintModel héritant de _printModel de leonardi sur Navette : + un comportement sur cette action : ActprintmodelBehavior
      BIEN VERIFIER (dans Studio sélectionner la classe Navette, à droite choisir ses actions. Sélectionner 'actPrintModel' et cliquer sur modifier.
      Dans l'onglet 'paramètres' vérifier lezs chemins du fichier modèle et du fichier de sortie.
      par défaut dans le répertoire 'modèles'
    2. Il existe plusieurs type de valeurs :
      1. des valeurs simples prédéfinies par Léonardi :
        @@ONAME@@ est le nom de l'objet courant (currentObject.getName())
        @@CURRENT_DATE@@ est la date au moment de l'impression.

        MISE EN PRATIQUE : soit directement dans Excel, soit en editant Navette_feuille_calcul.xml
        1. Dans Excel la valeur de la cellule est '@@CURRENT_DATE@@
          Il faut mettre un simple quote ' car sinon excel croit que c'est une formule Excel à la saisie
        2. OU BIEN dans le XML on met x:Ticked="1" sur l'élément <DATA> : c'est ce qu'Excel génère quand on lui dit d'ignorer la formule
          Exemple : <Data ss:Type="String" x:Ticked="1">@@CURRENT_DATE@@</Data>

      2. des valeurs simples définies par du code Java dans le comportement de l'action
        exemple : @@FICHE_NAVETTE_NUMERO@@
        FICHE_NAVETTE_NUMERO est placé dans le dictionnaire dans le behavior ci-dessous.
      3. des valeurs simples extraites des l'objet qui est en cours d'impression :
        --> A chaque fois ce sont les identifiants studio des champs qu'il faut mettre dans les '@@''@@'
        @@xxx@@, xxx désigne le champ de l'objet du contexte à afficher.
        exemple : @@nav_stem@@ sera remplacé par la valeur du champ "nav_stem" (Numéro de STEM) de l'objet sélectionné.
      4. des valeurs simples mais qui sont portées par des relations entre l'objet sélectionné et d'autres objets :
        exemple : @@nav_zone_d@@ peut s'écrire aussi @@nav_zone_d[0]::zone_name@@
      5. des champs multiples (qui se répètent):
        exemple réceptionnaires.
        ATTENTION, Leonardi fait du chercher/remplacer et répete le bloc qui est indiqué. Une fois répété votre document
        doit rester un document XML (avec tous les tags correctement fermés). On ne peut donc pas placer n'importe ou les marques 'repeat'
        Exemple sur Plant(s) : "Divers réceptionnaires (un réceptionnaire par cellule)"
        1. on trouve dans le XML en cherchant ce mot :
          Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
          1
          2
          3
          4
          5
           
                  <Cell ss:MergeAcross="1" ss:StyleID="m91842834"><Data ss:Type="String">Divers réceptionnaires (un réceptionnaire par cellule)</Data></Cell>
                  <Cell ss:StyleID="s28"/>
                  <Cell ss:StyleID="s27"/>
                  <Cell ss:StyleID="s24"/>
          Si on remplace juste la chaine comme ci dessous :
          Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
          1
          2
          3
          4
          5
           
                  <Cell ss:MergeAcross="1" ss:StyleID="m91842834"><Data ss:Type="String" x:Ticked="1">@@REPEAT_OBJECT_START::nav_receptionnaire@@@@rec_name@@ @@REPEAT_OBJECT_END@@</Data></Cell>
                  <Cell ss:StyleID="s28"/>
                  <Cell ss:StyleID="s27"/>
                  <Cell ss:StyleID="s24"/>
          Si on teste on n'obtient pas le résultat voulu car tous les réceptionnaires sont dans la même cellule !
        2. Pour séparer les cellules :
          on remplace :
          Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
          1
          2
          3
          4
          5
           
              <Cell ss:MergeAcross="1" ss:StyleID="m91842834"><Data ss:Type="String" x:Ticked="1">@@REPEAT_OBJECT_START::nav_receptionnaire@@@@rec_name@@ @@REPEAT_OBJECT_END@@</Data></Cell>
              <Cell ss:StyleID="s28"/>
              <Cell ss:StyleID="s27"/>
              <Cell ss:StyleID="s24"/>

          par :
          Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
          1
          2
          3
          4
          5
           
                  @@REPEAT_OBJECT_START::nav_receptionnaire@@
                  <Cell ss:StyleID="m91846176"><Data ss:Type="String" x:Ticked="1">@@rec_name@@</Data></Cell>
                  @@REPEAT_OBJECT_END@@
                  @@FICHE_RECEPTIONNAIRES_CELLULES_VIDES@@
          comme cela on a une cellule (<cell>) par réceptionnaire (on répete le tag </cell>)

          Mais comme il faut pour excel toujours préserver le nombre total de cellule en complètant par des cellules vides,on ajoute à la fin.
          @@FICHE_RECEPTIONNAIRES_CELLULES_VIDES@@ est une variable

          La variable FICHE_RECEPTIONNAIRES_CELLULES_VIDES est ajoutée dans le dictionnaire via le code Java de ActprintmodelBehavior

          exemple :
          Code java : Sélectionner tout - Visualiser dans une fenêtre à part
          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          25
          26
          27
          28
          29
          30
          31
          32
          33
          34
          35
          36
          37
          38
          39
          40
          41
          42
          43
          44
          45
          46
          47
          48
           
              public class ActprintmodelBehavior extends LyPrintModelBehavior
              {
                  /**
                   * Method invoked to configure the content replacer.<br />
                   * <i>The default implementation</i> does nothing and return the given replacer.
                   *
                   * @param  printer  current LyPrintModelController instance
                   * @param  replacer current replacer
                   * @return the configured content replacer
                   * @see leon.app.behavior.LyPrintModelBehavior#preparePrint
                   */
                  public LyContentReplacer preparePrint(LyPrintModelController printer,
                      LyContentReplacer replacer)
                  {
                      // On complete le dictionnaire avec des tags :
                      java.util.Hashtable dict = replacer.getRootDictionnary();
           
                      // exemple de code généré pour des valeurs simples et libres...
                      dict.put("FICHE_NAVETTE_NUMERO", "REF_GENEREE_PAR_CODE_"+((int)Math.random()*10));
                      // exemple de code généré pour compléter le XML
                      LyObject navette = printer.getContext().getObject(0);
                      int      nbreReceptionnaires= navette.getRelationValue("nav_receptionnaire").getValueCount();
                      String   receptCellulesVides =LyContentReplacer.ESCAPE_ENCODE_SEP; // Garder le XML sans encodage
           
                      for (int i=nbreReceptionnaires; i<5; i++) // 5 car il y a 5 cellules de prévues.
                      {
                          receptCellulesVides = receptCellulesVides + "<Cell ss:StyleID=\"s60\"/>";
                      }
                      dict.put("FICHE_RECEPTIONNAIRES_CELLULES_VIDES", receptCellulesVides);
           
                      return super.preparePrint(printer, replacer);
                  }
           
           
                  /**
                   * Method invoked after printing the object or object list.<br />
                   * <i>The default implementation</i> does nothing and return false.
                   *
                   * @param  printer current LySimplePrintController instance
                   * @return true if the process is done (stop generic behavior) false otherwise.
                   * @see leon.app.behavior.LyPrintModelBehavior#printEnd
                   */
                  public boolean printEnd(LyPrintModelController printer)
                  {
                      return super.printEnd(printer);
                  }
              }
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. [XL-2007] transfert données excel vers word via plusieurs macro!
    Par yannick63430 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 18/12/2010, 21h41
  2. Insertion d'un tableau Excel dans Word via Ole
    Par blondelle dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/12/2008, 10h55
  3. Insérer un Tableau excel dans Word via VBA depuis Excel
    Par Godzestla dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 14/05/2008, 08h52
  4. Génération de fichier Excel Ou Word
    Par Maz85 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 23/08/2007, 17h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo