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 :

Enregistrer un fichier Calc Open office


Sujet :

C++Builder

  1. #1
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 24
    Par défaut Enregistrer un fichier Calc Open office
    Bonjour, j'ai touver sur le FAQ de C++ Builder le code suivant pour fermer avec une sauvegarde des modifications, d'un document Calc sous open office :

    Code :
    // ici on ferme le document avec ou sans sauvegarde
    vOOoDocument.OleFunction("close", false); // true
    vOOoDocument = Unassigned();
    J'exécute ces instructions lors de l'appui sur un bouton. Le document se ferme bien, mais les modifications ne sont pas enregistrées. J'ai tenté en remplaçant "false" par "true", mais ça ne change rien.
    Comment résoudre ce problème?
    Est-il possible de sauvegarder à partir de la boite de dialogue enregistrer sous d'OpenOffice Calc?

    J'utilise la version 3.0 d'openOffice.

    Merci

  2. #2
    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
    Par défaut
    Salut BruiserTu peux essayer ceci
    // sauvegarde
    Variant vOOoparametres;
    // on recompose le chemin avant de sauvegarder le fichier
    AnsiString FileName = "file:///";
    FileName += "D:/";
    FileName += "essai1.sxc";
    FileName = StringReplace(FileName,"\\","/",TReplaceFlags()<< rfReplaceAll << rfIgnoreCase);
    int Bounds[2] = {0,-1};
    vOOoparametres = VarArrayCreate(Bounds, 1, varVariant);
    vOOoDocument.OleFunction ("storeAsURL", FileName.c_str(), vOOoparametres);

  3. #3
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 24
    Par défaut
    Merci beaucoup sa marche. Je me doutais vaguement que cela pouvait venir du chemin de sauvegarde mais par contre j'étais loin de pensé à cette solution (noob inside).

    Cette solution est bien pratique, mais elle ne me permet pas de choisir l'endroit où je souhaite sauvegarder. Je reviens donc à ma deuxième question :
    Est-il possible d'appeler la boite de dialogue enregistrer sous d'OpenOffice Calc?

  4. #4
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Tu peut en appeler une depuis ton programme en utilisant le composant TSaveDialog si tu veut

  5. #5
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 24
    Par défaut
    Cela fait seulement une semaine et demi que je connais et travail sur BCB6 et donc je ne connais pas encore bien sont fonctionnement, même si ce forum m'a permit d'en apprendre déjà beaucoup de chose en peut de temps.

    Le composant TSaveDialog me parait pas mal, je l'ai testé pour enregistrer le contenu d'un TMemo de la façon suivante :

    TSaveDialog* TSD_Save = new TSaveDialog(this);
    TSD_Save->InitialDir = "C:\\";
    TSD_Save->Title = "Enregistrer sous...";
    TSD_Save->Filter = "Fichiers Html (*.html)|*.HTML";
    TSD_Save->FileName = "test.html";
    if (TSD_Save->Execute())
    Memo1->Lines->SaveToFile(TSD_Save->FileName);
    Mais je ne vois pas trop comment l'utiliser pour enregistrer mon fichier Calc OpenOffice. Comme un grand naïf que je suis , j'ai tenté ceci :
    TSaveDialog* TSD_Save = new TSaveDialog(this);
    TSD_Save->InitialDir = "C:\\";
    TSD_Save->Title = "Enregistrer sous...";
    TSD_Save->Filter = "Fichiers Ods (*.ods)|*.ODS";
    TSD_Save->FileName = "Fichier.ods";
    if (TSD_Save->Execute())
    vOOoDocument->SaveToFile(TSD_Save->FileName);
    Mais comme je m'y attendais ça ne marche pas.

  6. #6
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Il faut simplement reprendre le code de blondelle et de remplacer le chemin du fichier par la TSaveDialog, ici ton chemin de fichier est stocké dans FileName, c'est donc cette variable que tu doit remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // sauvegarde
    Variant vOOoparametres;
    TSaveDialog* TSD_Save = new TSaveDialog(this);
    TSD_Save->InitialDir = "C:\\";
    TSD_Save->Title = "Enregistrer sous...";
    TSD_Save->Filter = "Fichiers Ods (*.ods)|*.ODS";
    TSD_Save->FileName = "Fichier.ods";
    if (TSD_Save->Execute())
    {
       int Bounds[2] = {0,-1};
       vOOoparametres = VarArrayCreate(Bounds, 1, varVariant);
       vOOoDocument.OleFunction ("storeAsURL", TSD_Save->FileName.c_str(), vOOoparametres);
    }

  7. #7
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 24
    Par défaut
    La boite de dialogue enregister sous s'ouvre bien, mais mon programme plante quand je clique sur enregistrer .

  8. #8
    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
    Par défaut
    Dans le code tel qu'il est donne il est possible de choisir le disque et le chemin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // choix du disque
    FileName += "D:/";
    // choix du chemin
    FileName += "essai1.sxc";

  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
    Par défaut
    En fait le chemin qu'Openoffice attend c'est
    "file:///D:/essai1.sxc"
    celui que tu passe est comme ceci
    "C:\\essai1.sxc"
    d'ou l'erreur, il faut ajouter au debut de chaine "file:///" et modifier les "\\" en "/" voir la fonction StringReplace

  10. #10
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 24
    Par défaut
    J'ai utilisé vos indications pour procéder différemment, mais d'une manière qui correspond à ce que je voulais faire.

    Je fait une copie de mon fichier open office qui me sert de model avec un TSaveDialog, je modifie mon nouveau fichier, je ferme le fichier en sauvegardant les modifications.

    Tout marche bien ou presque... J'ai configuré mon TSaveDialog pour qu'il me propose un nom de fichier lorsque je veux enregistrer la copie de mon fichier. Mais le problème est que si je change ce nom dans la fenêtre Enregistrer sous (quand je l'utilise mon programme), il ne met plus l'extension que j'ai configurer dans le TSaveDialog et le fichier est créer sans extension. Si je souhaite utiliser un nom différent je suis obliger d'écrire l'extention à la suite nom. Comment résoudre ce problème??

    Voici mon code :

    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
    //Copie du Fichier
    AnsiString Temp_URL="P:\\TestOpenOffice1\\Fichier.ods";
    AnsiString NewTemp_URL;
     
    TSaveDialog* TSD_Save = new TSaveDialog(this);
    TSD_Save->InitialDir = "C:\\";
    TSD_Save->Title = "Enregistrer sous...";
    TSD_Save->Filter = "Fichiers Ods (*.ods)|*.ODS";
    TSD_Save->FileName = "Fichier1.ods";
     
    if (TSD_Save->Execute())
      {
     
        if (!CopyFile(Temp_URL.c_str(), TSD_Save->FileName.c_str(), true))
        {
          ShowMessage("Impossible de déplacer");
        }
      }
    // récupération de l'url du nouveau fichier  
    NewTemp_URL= TSD_Save->FileName.c_str();
     
    {...
    	ouverture et modification de mon nouveau fichier
    ...
    }
     
     
    Variant vOOoparametres;
    // on recompose le chemin avant de sauvegarder le fichier
     
    vOOoparametres = VarArrayCreate(Bounds, 1, varVariant);
    vOOoDocument.OleFunction ("storeAsURL", OoFileName.c_str(), vOOoparametres);
     
    //Fermeture et sauvegarde
    vOOoDocument.OleFunction("close", false);
    vOOoDocument = Unassigned;

  11. #11
    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
    Par défaut
    En faisant quelque chose comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    TSaveDialog* TSD_Save = new TSaveDialog(this);
    TSD_Save->InitialDir = "C:\\";
    TSD_Save->Title = "Enregistrer sous...";
    TSD_Save->Filter = "Fichiers Ods (*.ods)|*.ODS";
    //TSD_Save->FileName = "Fichier1.ods";
    if (TSD_Save->Execute())
    {
    String FilePath = TSD_Save->FileName;
    Memo1->Lines->SaveToFile(FilePath + ".ods"); // a adapter
    }

  12. #12
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 24
    Par défaut
    Ok merci, je testerai ça dans une semaine car je suis stagiaire en alternance et cette semaine j'ai cours donc je ne pourrai pas travailler sur mon programme qui est le sujet de mon stage. Donc je vous donnes rendez-vous dans une semaine pour le verdict .

    Edit :

    J'ai pas pu résister à l'envie de tester quand même, donc sa marche bien, mais... car j'aime bien complexifier la chose, je ne peut pas utiliser plusieurs extension différente. Comment faut-il faire pour qu'il utilise l'extension que l'on choisit dans lors de la sauvegarde.

    Ce n'est pas vitale pour mon projet, c'est plus pour ma culture.

  13. #13
    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
    Par défaut
    Apres avoir recuperer le chemin avec TSaveDialog et modification a l'aide de StringReplace tu peu sauvegarder a l'aide de ce code
    // fonction enregistrer sous
    int Bounds[2] = {0, -1};
    Variant fichsave = VarArrayCreate(Bounds, 1, varVariant);
    vOOoDocument.OleFunction("storeAsUrl", "file:///D:/ooOcalcOoo/essai10.ods", fichsave);
    ce qui donne avec un TsaveDialog
    String path;
    TSaveDialog* TSD_Save = new TSaveDialog(this);
    TSD_Save->InitialDir = "C:\\";
    TSD_Save->Title = "Enregistrer sous...";
    TSD_Save->Filter = "Fichiers Ods (*.ods)|*.ODS";
    TSD_Save->FileName = "Fichier.ods";
    if (TSD_Save->Execute())
    {
    path = TSD_Save->FileName;
    path = StringReplace(path,"\\","/",TReplaceFlags()<< rfReplaceAll << rfIgnoreCase);
    path = "file:///" + path;
    }
    // fonction enregistrer sous
    int Bounds[2] = {0, -1};
    Variant fichsave = VarArrayCreate(Bounds, 1, varVariant);
    vOOoDocument.OleFunction("storeAsUrl", path.c_str(), fichsave);

  14. #14
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 24
    Par défaut
    Merci pour tout, Je n'ai pas vraiment compris le code de ton dernier message blondelle, mais de toute façon je suis arrivé a faire ce que je voulais au départ . Il me reste encore ma dernière question auquel je n'ai pas trouvé de solution, mais je verrai plus si j'en ai vraiment besoin.

  15. #15
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 24
    Par défaut
    Je reviens sur ce que j'ai dit, je viens de comprendre ton dernier code blondelle, je suis un peut long à la détente.
    Je viens de m'apercevoir d'un petit souci, plutôt que d'enregistrer au format .ods avec Open Office, je voudrai enregistrer au format .xls avec Open Office pour que l'utilisateur ait le choix d'utiliser Open office ou Excel. Le problème c'est que le faite rajouté l'extension .xls à la fin du nom du fichier n'est pas suffisant, car lors de l'enregistrement le fichier est crypter au format .ods mais avec l'extension .xls, il est donc impossible de l'ouvrir avec Excel.
    Comment peut-on choisir le format de sauvegarde d'open office?

  16. #16
    Membre confirmé

    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
    Par défaut
    L'enregistrement dans un format autre (XL, PDF ...) demande un filtrage.

    Le paramètre vOOoparametres (cf 1ère réponse de Blondelle) doit être utilisé :
    passez Bounds à {0,0}
    Créez une propriété (avec "Bridge_getStruct") dont le nom "Name" est "FilterName" et "Value" est "MS Excel 97";
    Intégrez la dans vOOoparametres; appelez ensuite SaveAsURL avec ce paramètre et le tour est joué.

    Vous pouvez de cette manière créer des pdf, il suffit d'utiliser le bon filtre (Voir site OpenOffice pour les différentes possibilités).

  17. #17
    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
    Par défaut
    Grille!
    Bon je mais le code avec le Filtre Excel ou PDF
    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
     
    String path;
    TSaveDialog* TSD_Save = new TSaveDialog(this);
    TSD_Save->InitialDir = "C:\\";
    TSD_Save->Title = "Enregistrer sous...";
    TSD_Save->Filter = "Fichiers Ods (*.ods)|*.ODS";
    TSD_Save->FileName = "Fichier_xls.xls";
    if (TSD_Save->Execute())
    {
    path = TSD_Save->FileName;
    path = StringReplace(path,"<a href="file://\\","/",TReplaceFlags" target="_blank">\\","/",TReplaceFlags</a>()<< rfReplaceAll << rfIgnoreCase);
    path = "<a href="file:///" target="_blank">file:///</a>" + path;
    }
    // fonction enregistrer sous
    Variant vOOoPrSousxls = vOOoOpenOffice.OleFunction("Bridge_GetStruct","com.sun.star.beans.PropertyValue");
    vOOoPrSousxls.OlePropertySet("Name","FilterName");
    vOOoPrSousxls.OlePropertySet("Value","MS Excel 97"); // pour le format PDF "Value" = "writer_pdf_Export"
    int Bounds[2] = {0, 0};
    Variant fichsave = VarArrayCreate(Bounds, 1, varVariant);
    fichsave.PutElement(vOOoPrSousxls,0);
    // vOOoDocument.OleFunction("storeAsUrl", WideString(path), fichsave); // pour path declare en variant
    vOOoDocument.OleFunction("storeAsUrl", path.c_str(), fichsave); // pour path declare en string

  18. #18
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 24
    Par défaut
    Magnifique, c'est parfait, merci beaucoup les gars.
    Par contre le pdf ne marche pas, peut être que le nom du filtre n'est pas le bon, mais ce n'est pas grave.

    Edit : je viens de faire une recherche sur internet et le filtre semble bon

  19. #19
    Membre confirmé

    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
    Par défaut
    L'export pdf fonctionne bien, mais pour un doc Calc il faut utiliser "Calc_pdf_Export".

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ajouter un element dans un fichier XML open office
    Par Jcpan dans le forum Langage
    Réponses: 1
    Dernier message: 06/05/2013, 18h12
  2. Delphi et calc open office
    Par sys1 dans le forum Débuter
    Réponses: 2
    Dernier message: 25/12/2010, 15h27
  3. javascript dans calc (open office)
    Par litchi1234fr dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 17/02/2009, 13h55
  4. Impression avec Calc Open office
    Par Bruiser dans le forum C++Builder
    Réponses: 9
    Dernier message: 15/02/2009, 21h56
  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