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 :

[OLE]Sauvegarder un fichier LibreOffice au format XLS


Sujet :

C++Builder

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Responsable de service informatique
    Inscrit en
    Mars 2021
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mars 2021
    Messages : 7
    Points : 6
    Points
    6
    Par défaut [OLE]Sauvegarder un fichier LibreOffice au format XLS
    bonjour

    j'ai cette fonction qui fait la sauvegarde d'un fichier Calc qui fonctionne bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Variant vOOoparametres;
    int Bounds[2] = {0,-1};
    vOOoparametres = VarArrayCreate(Bounds, 1, varVariant);
    // on recompose le chemin avant de sauvegarder le fichier
    AnsiString FileName = "file:///";
    FileName += NomFichier;
    FileName = StringReplace(FileName,"\\","/",TReplaceFlags()<< rfReplaceAll << rfIgnoreCase);
    vOOoDocument.OleFunction (L"storeAsURL", WideString(FileName.c_str()), vOOoparametres);
    j'aimerai que au lieu d'un fichier ODS il m'écrive un fichier XLS
    il faudrait j'ai l'impression le stocker dans "vOOoparametres"
    dans la propriété FilterName avec la valeurs MS Excel 97

    j'ai essayer ce code mais ca plante sur la ligne 9
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	Variant vOOoPropertyValue;
    	try
    	{
    		vOOoPropertyValue = vOOoOpenOffice.OleFunction(L"Bridge_GetStruct", L"com.sun.star.beans.PropertyValue");
    	}
    	catch(...)
    	{
    	}
    	vOOoPropertyValue.OlePropertySet(L"Name",WideString("FilterName"));
    	vOOoPropertyValue.OlePropertySet(L"Value",L"MS Excel 97");
    quelqu'un a déjà fait cette manip d'enregistrement ou aurai une idée pourquoi ca plante
    merci d'avance

  2. #2
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    même réponse que la dernière fois OLE nécessite des type WideString comme paramètre pour du texte et C++ Builder depuis le portage à UNicode à partie de XE1 s'obstine à fournir de l'UnicodeString ..> Plantage. Portage raté de la part d'Embarcadero
    il faut donc utiliser de la manière suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    
    vOOoPropertyValue = vOOoOpenOffice.OleFunction(L"Bridge_GetStruct", WideString(L"com.sun.star.beans.PropertyValue"));
    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Responsable de service informatique
    Inscrit en
    Mars 2021
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mars 2021
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Merci
    Tout fonctionne maintenant
    il me reste juste un problème quand je veux déconnecter les process Libre Office ne sont pas fermé
    autre truc étrange lors de la création de l'objet il me fait 2 process libre office je sais pas si c'est normal

    voila comment je connect et je deconect

    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
    37
    38
    39
    40
    41
    42
    43
    44
    bool ObjLibreOffice :: Connection()
    {
    	if (VarIsEmpty(vOOoOpenOffice))
    	{
    		try
    		{
    			vOOoOpenOffice = CreateOleObject(WideString(L"com.sun.star.ServiceManager"));
    			if (VarType(vOOoOpenOffice) == varDispatch)
    				vOOoDesktop = vOOoOpenOffice.OleFunction(WideString(L"createInstance"),WideString(L"com.sun.star.frame.Desktop"));
    			vOOoConnect = true;
    		}
    		catch (...)
    		{
    			// si on passe ici c'est qu'il y a une erreur
    			vOOoConnect = false;
    		}
    	}
    	return vOOoConnect;
    }
    //---------------------------------------------------------------------------
    bool ObjLibreOffice :: DeConnection()
    {
     
    	try
    	{
    		 if(VarType(vOOoDocument) == varDispatch)  //ferme le doc si il y en a un d'ouvert
    		 {
    			vOOoDocument.OleFunction(WideString(L"dispose"));
    			vOOoDocument = Unassigned();
    		 }
    		 //vOOoDesktop.OleFunction(WideString(L"dispose"));
    		 vOOoDesktop.OleFunction(WideString(L"terminate"));
    		 vOOoDesktop = Unassigned();
    		 vOOoOpenOffice.OleFunction(WideString(L"dispose"));
    		 vOOoOpenOffice = Unassigned();
    		 vOOoConnect = false;
    	}
    	catch (...)
    	{
    		// si on passe ici c'est qu'il y a une erreur
    	}
     
    	return vOOoConnect;
    }
    quelqu'un a une idée ?
    merci d'avance

  4. #4
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut
    le problème est que le 'desktop ouvert' n'est pas fermé regarde sur les forums LibreOffice/OpenOffice il devait exister une fonction close quelque part
    je ne l'ai pas encore trouvée.

    dans ton code je mettrais vOOoConnect = false; dans le bloc if(VarType(vOOoDocument) == varDispatch)

    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Responsable de service informatique
    Inscrit en
    Mars 2021
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mars 2021
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    j'ai fait un test juste de connecter le service manager sans faire la création du desktop
    vOOoOpenOffice = CreateOleObject(WideString(L"com.sun.star.ServiceManager"));

    et de le deco avec
    vOOoOpenOffice.OleFunction(WideString(L"dispose"));
    vOOoOpenOffice = Unassigned();


    et les taches ne sont pas killer

  6. #6
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut,
    Je vais essayer avec Delphi pour voir si le problème est identique.
    Essaye également en modifiant le script mis à disposition https://api.libreoffice.org/examples...ET/WriterDemo/ pour qu'il corresponde à ton code .

    En surveillant dans le TaskManager l’exécution de ce script l'instance de Libreoffice est libérée à la fermeture manuelle de LibreOffice,La seule différence est que le script est terminé avant la fermeture de LibreOffice.

    je suppose que le portage OLE de Embarcadero comporte un certain nombre d'erreurs et des pertes de mémoire (LEAK)
    il suffit de lire les nombreux articles a ce sujet dont celui-ci https://stackoverflow.com/questions/...nt-memory-leak

    Une possibilité simple est de vérifier ces propos en attribuant la Valeur NULL au variant en lieu et place de Unassigned().


    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  7. #7
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut,
    Après plusieurs tests que ce soit avec Delphi ou Vb j’obtiens toujours des résultats identiques à la fermeture de l’application il reste 2 process libre office dans le task manage
    Le problème vient donc de l’interface de libre office.un moyen simple de résoudre ce problème est de killer par programmation ces process restants.
    Cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  8. #8
    Futur Membre du Club
    Femme Profil pro
    Responsable de service informatique
    Inscrit en
    Mars 2021
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mars 2021
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Ok merci de ton aide et d'avoir pris le temps de regarder

    je vais killer les process alors

  9. #9
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Sage décision qui te permettra d’économiser du temps et de l’énergie.
    J’ai fait tous mes essais avec la dernière version de libre office.
    Cela étant l’interfacage de msoffice est nettement supérieure et mieux documenté
    Cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/04/2007, 18h31
  2. Sauvegarde d'un fichier Excel au format txt
    Par Lalanne dans le forum C++Builder
    Réponses: 8
    Dernier message: 22/02/2007, 19h00
  3. modifier/sauvegarder un fichier en format XML
    Par LN(a) dans le forum Delphi
    Réponses: 6
    Dernier message: 07/12/2006, 11h17
  4. sauvegarde d'un fichier excel csv sous le format xls
    Par blondelle dans le forum C++Builder
    Réponses: 5
    Dernier message: 01/08/2006, 11h30
  5. lecture de fichier au format xls via un prog C++
    Par lepoutho dans le forum C++
    Réponses: 9
    Dernier message: 08/09/2005, 10h23

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