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

C++Builder Discussion :

Impression avec Calc Open office


Sujet :

C++Builder

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 24
    Points : 9
    Points
    9
    Par défaut Impression avec Calc Open office
    Bonjour.
    Après la sauvegarde... l'impression.

    Sur le FAQ C++ Builder j'ai trouvé le code suivant qui permet d'imprimer une feuille calc open office
    int Bounds[2] = {0,-1};
    vOOoDocument.OleFunction("print", VarArrayCreate(Bounds, 1, varVariant));
    Voici ce que fait mon programme :
    -Ouverture d'un fichier existant
    -Remplissage des casses des tableaux
    -Impression
    -Fermeture du fichier

    Le problème c'est qu'il ne m'imprime que la feuille qui s'affiche à l'ouverture du fichier. Mon fichier ce compose de trois feuilles, et je souhaite imprimer les 3. Comment faire?

    Merci

  2. #2
    Membre du Club

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 21
    Points : 50
    Points
    50
    Par défaut
    Je vous transmets une adaptation d'une portion de code que j'utilise ; j'ai modifié les noms des variables pour qu'elles correspondent à celles de la FAQ. Je ne l'ai pas testé en l'état.
    Ceci doit vous permettre d'inclure les pages voulues en utilisant le même paramétrage que celui des boîtes de dialogue d'impression.

    Code : 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
     
    Variant vOOoPrCount = vOOoOpenOffice.OleFunction("Bridge_GetStruct","com.sun.star.beans.PropertyValue");
    Variant vOOoPrPages = vOOoOpenOffice.OleFunction("Bridge_GetStruct","com.sun.star.beans.PropertyValue");
     
    vOOoPrCount.OlePropertySet("Name","Count");
    vOOoPrCount.OlePropertySet("Value",1); //Nombre d'ensembles de pages à imprimer
     
    vOOoPrPages.OlePropertySet("Name","Pages");
    vOOoPrPages.OlePropertySet("Value","1-4");//Pages à imprimer ; "1-" devrait convenir dans votre cas
     
    int Bounds2[2] = {0,1};// Selon le nombre de propriétés à utiliser;
    //int Bounds2[2] = {0,3};// pour 4 props par ex.
    Variant vOOoPrProps = VarArrayCreate(Bounds2, 1, varVariant);
     
    vOOoPrProps.PutElement(vOOoPrCount,0);
    vOOoPrProps.PutElement(vOOoPrPages,1);
    OOoDocument.OleFunction("Print",vOOoPrProps);
    Le "Guide du développeur" disponible sur le site OOo est très complet quant aux options disponibles (format papier, orientation, collation...)

    Un problème toutefois : lorsque je demande l'impression d'un doc 2 fois (Count = 2), l'imprimante me sort 4 exemplaires ; si j'en demande n j'en obtiens n² ! Y'a comme un conflit avec Windows je pense. Blondelle a-t-il testé cela ?

  3. #3
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut TABZ
    Blondelle a-t-il testé cela ?
    Non je n'ai pas fait de teste, je n'utilise que tres peu OpenOffice, juste une idee comme cela il serait peut etre interressant de recuperer la valeur renvoyee par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vOOoPrProps.PutElement(vOOoPrCount,0);
    Il doit bien y avoir la possibilite de recuperer un Variant sous forme d'une chaine
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  4. #4
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 24
    Points : 9
    Points
    9
    Par défaut
    Merci TABZ, le code que vous m'avez donné est assez intéressant, mais il ne permet malheureusement pas de résoudre mon problème, car mon problème ne se situe pas au niveau des pages, mais au niveau des feuilles (Je sais pas si cette phrase est vraiment claire). J'ai trois feuilles de calcule, mais chacune tient sur une page A3.

    Par contre quand je demande l'impression d'un doc 2 fois (Count = 2), il ne me sort qu'un exemplaire , à mon avis sa doit venir du faite que j'utilise l'imprimante virtuel pdf creator.

    Non je n'ai pas fait de teste, je n'utilise que tres peu OpenOffice, juste une idee comme cela il serait peut etre interressant de recuperer la valeur renvoyee par
    Code :

    vOOoPrProps.PutElement(vOOoPrCount,0);
    Il doit bien y avoir la possibilite de recuperer un Variant sous forme d'une chaine
    Dans quel but?? (je suis complètement ignorant )

  5. #5
    Membre du Club

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 21
    Points : 50
    Points
    50
    Par défaut
    Bonjour.

    Blondelle : j'ai fait référence à vous parce que sur ce forum vous me semblez être celui qui a le plus fait avancer le sujet de l'OLE automation avec OpenOffice ; vous auriez pu avoir été confronté à ce problème.
    Suite à ma réponse d'hier, j'ai refait une recherche sur un forum OOo et j'ai enfin une reponse : ce serait un bug identifié de OOo, depuis la version 2.4.0 corrigé dans la version 3.1 !

    Bruiser : effectivement, avec PDF Creator, le nombre de docs (Count) est inopérant. Par contre, comme je le disais précédemment, il est possible de changer le format de page à imprimer ; c'est un autre processus décrit dans le Guide du développeur OOo, que j'ai déjà utilisé ; j'essaierai de le retrouver ce soir, mais je pense qu'avec la FAQ et le code fourni ici vous devriez pouvoir vous en sortir.
    Bon courage.

  6. #6
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Blondelle : j'ai fait référence à vous parce que sur ce forum vous me semblez être celui qui a le plus fait avancer le sujet de l'OLE automation avec OpenOffice
    C'est vrai que j'ai traduit une partie des exemples Delphi, je n'ai d'ailleur pas su tout traduire, pour mon travail j'utilise la suite MsOffice, les codes VB sont plus facile a traduire pour moi.
    J'ai fait un essai chez moi avec la version 3.0 voici ce que j'ai fait
    Code : 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
     
    Variant vOOoPrCount = vOOoOpenOffice.OleFunction("Bridge_GetStruct","com.sun.star.beans.PropertyValue");
    Variant vOOoPrCollate = vOOoOpenOffice.OleFunction("Bridge_GetStruct","com.sun.star.beans.PropertyValue");
    Variant vOOoPrPages = vOOoOpenOffice.OleFunction("Bridge_GetStruct","com.sun.star.beans.PropertyValue");
     
    vOOoPrCount.OlePropertySet("Name","Copies");
    vOOoPrCount.OlePropertySet("Value",1); //Nombre d'ensembles de pages à imprimer
    vOOoPrCollate.OlePropertySet("Name", "Collate");
    vOOoPrCollate.OlePropertySet("Value", true);
     
    int Bounds2[2] = {0,1};// Selon le nombre de propriétés à utiliser;
    Variant vOOoPrProps = VarArrayCreate(Bounds2, 1, varVariant);
    vOOoPrProps.PutElement(vOOoPrCount,0);
    vOOoPrProps.PutElement(vOOoPrCollate,1);
     
    vOOoDocument.OleFunction("Print",vOOoPrProps);
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  7. #7
    Membre du Club

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 21
    Points : 50
    Points
    50
    Par défaut
    L'exemple de code suivant permet de fixer les paramètres d'impression d'un doc OpenOffice. (Imprimante à utiliser, orientation, format papier).
    Il est possible de créer une propriété (vOOoPrtDescriptor) de toutes pièces, mais il est plus interessant d'invoquer "getPrinter" : cette propriété est alors auto-générée, et il est possible de lire le paramétrage actuel de l'imprimante avant de le modifier. (Il existe d'ailleurs aussi un booléen "IsBusy" permettant de tester la disponibilité de l'imprimante.)

    La propriété vOOoPrtDescriptor est en fait un tableau de variants ; on scrute celui-ci élément par élément.

    Code : 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
     
    String PrtName = "<Nom de l'imprimante>";
    int PwSize; //Largeur en mm
    int PhSize; //Hauteur en mm
     
    Variant vOOoPrtDescriptor = vOOoDocument.OleFunction("getPrinter");
     
    for(int i=0; i<=vOOoPrtDescriptor.ArrayHighBound(1); i++)
    {
    	Variant vOOoY = vOOoPrtDescriptor.GetElement(i);
            if(AnsiString(vOOoY.OlePropertyGet("Name")) == "Name")  
            {
               	//String(vOOoY.OlePropertySet("Value")); // -> retourne le nom de l'imprimante actuelle
    		vOOoY.OlePropertySet("Value",PrtName.c_str());// Nom imprimante
                    vOOoPrtDescriptor.PutElement(vOOoY,i);
            }
            if(AnsiString(vOOoY.OlePropertyGet("Name")) == "PaperOrientation")
            {
                    vOOoY.OlePropertySet("Value",0);	//0: Portrait; 1: paysage
                    vOOoPrtDescriptor.PutElement(vOOoY,i);
            }
            if(AnsiString(vOOoY.OlePropertyGet("Name")) == "PaperFormat")
            {
                    vOOoY.OlePropertySet("Value",0);// 0 à 8 = A3, A4, A5, B4, B5, LETTER, LEGAL, TABLOID, USER
                    vOOoPrtDescriptor.PutElement(vOOoY,i);
            }
            if(AnsiString(vOOoY.OlePropertyGet("Name")) == "PaperSize") // Cas "USER"
           	{
                    Variant vOOoY2 = vOOoY.OlePropertyGet("Value");
                    vOOoY2.OlePropertySet("Width", 100*PwSize);
                    vOOoY2.OlePropertySet("Height", 100*PhSize);
                    vOOoY.OlePropertySet("Value", vOOoY2);
                    vOOoPrtDescriptor.PutElement(vOOoY,i);
          	}  
    }
    vOOoDocument.OleFunction("setPrinter", vOOoPrtDescriptor);
    J'espère que tout celà pourra vous aider.

  8. #8
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 24
    Points : 9
    Points
    9
    Par défaut
    Merci beaucoup pour votre aide.
    J'ai trouvé une solution, j'en suis pas super Fan mais sa marche.

    Code : 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
      void __fastcall Print3File (int x)
    {
    Variant vOOoMonClasseur;
    Variant vOOoMaFeuille;
     
    Variant vOOoPrCount = vOOoOpenOffice.OleFunction("Bridge_GetStruct","com.sun.star.beans.PropertyValue");
    Variant vOOoPrCollate = vOOoOpenOffice.OleFunction("Bridge_GetStruct","com.sun.star.beans.PropertyValue");
    Variant vOOoPrPages = vOOoOpenOffice.OleFunction("Bridge_GetStruct","com.sun.star.beans.PropertyValue");
     
    vOOoPrCount.OlePropertySet("Name","Copies");
    vOOoPrCount.OlePropertySet("Value",2); //Nombre d'ensembles de pages à imprimer
    vOOoPrCollate.OlePropertySet("Name", "Collate");
    vOOoPrCollate.OlePropertySet("Value", true);
     
    int Bounds2[2] = {0,1};// Selon le nombre de propriétés à utiliser;
    Variant vOOoPrProps = VarArrayCreate(Bounds2, 1, varVariant);
    vOOoPrProps.PutElement(vOOoPrCount,0);
    vOOoPrProps.PutElement(vOOoPrCollate,1);
     
    vOOoDocument.OleFunction("Print",vOOoPrProps);
     
     
    vOOoMonClasseur = vOOoDocument.OleFunction("getSheets");
    vOOoMaFeuille = vOOoMonClasseur.OleFunction("GetByIndex", x);
    // on rend la feuille invisible
    vOOoMaFeuille.OlePropertySet("IsVisible", false);
    }
    Lorsque je lance une impression j'appelle la fonction "Print3File" autant de fois que j'ai de feuille, cad, si j'ai 3 feuille j'appelle 3 fois "Print3File" avec une boucle for et après chaque impression je rends invisible la feuille qui vient d'être imprimé, c'est ce qui me permet de sélectionné les feuilles. Mais bon c'est pas tip top, car si mon fichier ne s'ouvre pas à la première feuille je risque d'avoir des problèmes.
    De plus en entre les impressions je mets une temporisation (avec une boucle for ) car sinon il me saute des feuilles. Je pense que le faite de tester la disponibilité de l'imprimante entre chaque impression pourrait résoudre ce désagrément, mais...comment qu'on fait?

  9. #9
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    J'ai trouve pour imprimer plusieurs fois une feuille ceci dans la FAQ Delphi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    vOOoPrCount.OlePropertySet("Name","CopyCount"); // qui remplace "Copies"
    vOOoPrCount.OlePropertySet("Value",2);
    Chez moi l'impression de plusieurs feuilles ne fonctionne pas par exemple (Feuille_maitresse, et Feuille_data, et Feuille_value), je n'imprime que la feuille selectionnee, je pense qu'il doit y avoir une chaine de remplacement pour ("Name","Pages") comme pour "Copies", je n'ai pas encore trouve
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  10. #10
    Membre du Club

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 21
    Points : 50
    Points
    50
    Par défaut
    Chez moi l'impression d'un doc de trois pages fonctionne, si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    vOOoPrCount.OlePropertySet("Name","Pages"); 
    vOOoPrCount.OlePropertySet("Value","1-3");// ou "1,2,3", ou "1-" qui équivaut à All
    Pour Bruiser : code pour tester la disponibilité de l'imprimante (à adapter à votre cas)
    Code : 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
     
    Variant vOOoPrtDescriptor = vOOoDocument.OleFunction("getPrinter");
     
    for(int i=0; i<=vOOoPrtDescriptor.ArrayHighBound(1); i++)
    {
    	Variant vOOoY = vOOoPrtDescriptor.GetElement(i);
     
    	if(AnsiString(vOOoY.OlePropertyGet("Name")) == "IsBusy")
            {
                    if(bool(vOOoY.OlePropertyGet("Value")))
    		{
    			//Imprimante occupée => attente
    		}
    		else
    		{
    			//Imprimante disponible
    		}
     
            }
    De toutes façons, le bug sur le nombre de docs imprimés doit être corrigé par OOo dans la v 3.1 ; à moins que celà ne soit déjà le cas avec la 3.0.1 qui vient de sortir. Je ne pourrai malheureusement pas essayer avant samedi...

Discussions similaires

  1. Delphi et calc open office
    Par sys1 dans le forum Débuter
    Réponses: 2
    Dernier message: 25/12/2010, 15h27
  2. javascript dans calc (open office)
    Par litchi1234fr dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 17/02/2009, 13h55
  3. Enregistrer un fichier Calc Open office
    Par Bruiser dans le forum C++Builder
    Réponses: 18
    Dernier message: 15/02/2009, 17h22
  4. Peux-t'on exécuter des macros excel avec Open Office
    Par Lexot2 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 04/09/2006, 22h30
  5. Tableur Calc Open Office
    Par patrickbruneau dans le forum Delphi
    Réponses: 2
    Dernier message: 30/08/2006, 18h58

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