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 :

Pilotage de StarOffice avec builder5


Sujet :

C++Builder

  1. #1
    Membre averti
    Avatar de Superstivix
    Inscrit en
    Décembre 2003
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 250
    Points : 405
    Points
    405
    Par défaut Pilotage de StarOffice avec builder5
    Bonjour à tous,

    J'ai réalisé un programme avec builder5 qui écrit des données dans Excel et qui réalise également la mise en forme des fichiers.

    J'aimerais réalisé la même chose pour StarOffice.
    Si quelqu'un connait un site ou possede des informations qui pourraient m'aider, ça serait gentil !

    Merci à tous pour votre aide
    Steve
    Modérateur Taverne et C++Builder
    Règles du Club - Règles de la Taverne
    FAQ BCB - sources
    Et je mords

  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
    Bonjour à tous.

    L'OLE Automation avec StarOffice est un sujet qui ne passionne visiblement pas beaucoup les participants à ce forum ; je n'ai moi même eu aucune réponse à mes questions sur le sujet.

    Ce problème est plus facile à traiter en Delphi ; dans un premier temps j'ai donc regroupé toutes mes fonctions dans une dll Delphi. C'est une solution qui tourne sans problèmes sur mes applis pour l'instant.
    (Des exemples directement utilisables sont disponibles sur le site d'OpenOffice.)

    Pour traiter la question en C++ il reste deux solutions :
    1: Télécharger le SDK sur le site OpenOffice et utiliser Visual C++;
    2: Développer une interface COM point par point.

    La 2éme solution fonctionne avec C++Builder 3 et n'est finalement pas si compliquée quand on a pigé le truc. Pour des exemples qui permettent de démarrer voir mes posts et ceux de Terminar sur le forum : http://www.oooforum.org, rubrique "OpenOffice.org Macros and API". (English forum)

    Attention : certaines fonctions ne fonctionnent pas avec la version 5.2, mais uniquement à partir de la 6 (ou d'OpenOffice 1.01)
    Toutes les infos sur les fonctions utilisables sont disponibles sur le site : http://api.openoffice.org/

    Bon courage.
    Tabz.

  3. #3
    Membre averti
    Avatar de Superstivix
    Inscrit en
    Décembre 2003
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 250
    Points : 405
    Points
    405
    Par défaut
    Merci de ton aide TabZ !

    je vais potasser tout ça !

    Par contre, j'ai vu que sur le site de Open Office tu proposais d'envoyer ton source à qui le demandait. Moi ça m'interesserais bien pour avoir un bon point de départ.

    Je te remercie par avance
    Modérateur Taverne et C++Builder
    Règles du Club - Règles de la Taverne
    FAQ BCB - sources
    Et je mords

  4. #4
    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
    Salut.

    Voilà le code que j'ai utilisé pour démarrer:
    (il lance StarOffice 5.2, ouvre un doc. vierge et écrit un nombre dans une cellule.)

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
     
    // Create service Manager of StarOffice
        IDispatch* pdispFactory= NULL; 
        CLSID clsFactory= {0x82154420,0x0FBF,0x11d4,{0x83, 0x13,0x00,0x50,0x04,0x52,0x6A,0xB4}};
        HRESULT hr;
        DISPID id_createInstance;
        DISPID id_loadComponentFromURL;
        IDispatch* pdispDesktop= NULL;
        IDispatch* pPropertyValue= NULL;
        IDispatch* pdispDocument= NULL;
        VARIANT param1;
        VARIANT result;
     
        CoInitialize(NULL);
        //create the ServiceManager 
        hr = CoCreateInstance( clsFactory, NULL, CLSCTX_ALL,IID_IDispatch,(void**)&pdispFactory);
     
        // create the desktop 
        OLECHAR* funcName= L"createInstance";
        pdispFactory->GetIDsOfNames( IID_NULL, &funcName, 1,
                                    LOCALE_USER_DEFAULT, &id_createInstance); 
     
        VariantInit( &param1);
        param1.vt= VT_BSTR;
        param1.bstrVal= SysAllocString( L"com.sun.star.frame.Desktop");
        DISPPARAMS dispparams1= { &param1, 0, 1, 0};
        VariantInit( &result);
        hr= pdispFactory->Invoke( id_createInstance, IID_NULL, LOCALE_USER_DEFAULT,
                                  DISPATCH_METHOD, &dispparams1, &result, NULL, 0);
        pdispDesktop= result.pdispVal;                            
     
        // create the PropertyValue for "AsTemplate"
            // 1: create core reflection
        DISPID id;
        OLECHAR *FCT = L"createInstance";
        HRESULT hr2 = pdispFactory->GetIDsOfNames(IID_NULL, &FCT, 1, LOCALE_USER_DEFAULT, &id);
        param1.vt = VT_BSTR;
        param1.bstrVal = L"com.sun.star.reflection.CoreReflection";
        DISPPARAMS dp1 = {&param1,0,1,0};
        VARIANT vRes;
        hr2 = pdispFactory->Invoke(id, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dp1, &vRes, NULL,0);
        IDispatch* pdisCoreRef = vRes.pdispVal;
        pdisCoreRef->AddRef();
        VariantClear(&vRes);
     
        OLECHAR *strforName = L"forName";
        hr2 = pdisCoreRef->GetIDsOfNames(IID_NULL, &strforName, 1, LOCALE_USER_DEFAULT, &id);
        param1.vt = VT_BSTR;
        param1.bstrVal = L"com.sun.star.beans.PropertyValue";
        hr2 = pdisCoreRef->Invoke(id, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dp1, &vRes, NULL,0);
     
        IDispatch* pdispClass = vRes.pdispVal;
        pdispClass->AddRef();
        VariantClear(&vRes);
     
        OLECHAR* strcreateObject = L"createObject";
        hr2 = pdispClass->GetIDsOfNames(IID_NULL, &strcreateObject, 1, LOCALE_USER_DEFAULT, &id);
        IDispatch* pdispPropertyValue = NULL;
        param1.vt = VT_DISPATCH|VT_BYREF;
        param1.ppdispVal = &pPropertyValue;
        hr2 = pdispClass->Invoke(id, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dp1, NULL, NULL,0);
        pPropertyValue->AddRef();
     
        /*OLECHAR* funcName1= L"Bridge_GetStruct";  // remplace le code précédent
                                                    //  mais ne fonct. pas avec SO 5.2
        hr = pdispDesktop->GetIDsOfNames( IID_NULL, &funcName1, 1,
                                    LOCALE_USER_DEFAULT, &id_createInstance);
     
        VariantInit( &param1);
        param1.vt= VT_BSTR;
        param1.bstrVal= SysAllocString( L"com.sun.star.beans.PropertyValue");
        DISPPARAMS dispparams2= { &param1, 0, 1, 0};
        VariantInit( &result);
        hr= pdispFactory->Invoke( id_createInstance, IID_NULL, LOCALE_USER_DEFAULT,
                                  DISPATCH_METHOD, &dispparams2, &result, NULL, 0);
     
        pPropertyValue= result.pdispVal;
        */
        // setting the PropertyValue Name to "AsTemplate" 
        OLECHAR *funcNameName= L"Name";
        DISPID id_Name;
     
        pPropertyValue->GetIDsOfNames( IID_NULL, &funcNameName, 1,
                                                    LOCALE_USER_DEFAULT, &id_Name); 
     
        VariantInit( &param1);
        param1.vt= VT_BSTR;
        param1.bstrVal= SysAllocString( L"AsTemplate");
        DISPPARAMS dispparams4= { &param1, 0, 1, 0};
        VariantInit( &result);
        hr= pPropertyValue->Invoke( id_Name, IID_NULL, LOCALE_USER_DEFAULT,
                            DISPATCH_PROPERTYPUT, &dispparams4, &result, NULL, 0);
     
        // setting the PropertyValue Value to true
     
        OLECHAR *funcValueName= L"Value";
        DISPID id_Value;
        hr = pPropertyValue->GetIDsOfNames( IID_NULL, &funcValueName, 1,
                                                    LOCALE_USER_DEFAULT, &id_Value);
     
        VariantInit( &param1);
        param1.vt = VT_BOOL;
        param1.boolVal = true; // ouvre comme modèle de doc; sinon : false
        DISPPARAMS dispparams5= { &param1, 0, 1, 0};
        VariantInit( &result);
        hr= pPropertyValue->Invoke( id_Value, IID_NULL, LOCALE_USER_DEFAULT,
                            DISPATCH_PROPERTYPUT, &dispparams5, &result, NULL, 0);
     
           // load the scalc with oo url
        funcName= L"loadComponentFromURL";
        hr= pdispDesktop->GetIDsOfNames( IID_NULL, &funcName, 1,
                                    LOCALE_USER_DEFAULT, &id_loadComponentFromURL); 
     
     
        SAFEARRAY FAR* pPropVals = SafeArrayCreateVector(VT_DISPATCH,0,1);
     
        long idx=0;
        SafeArrayPutElement( pPropVals,&idx, pPropertyValue);
     
        VARIANT params[4];
     
        params[3].vt = VT_BSTR; // ouvre feuille vierge
        params[3].bstrVal =SysAllocString( L"private:factory/scalc");
            //ou pour ouvrir un doc existant:
        //params[3].bstrVal =SysAllocString( L"File:///c:/temp/MyFile.sdc");
     
        params[2].vt = VT_BSTR;
        params[2].bstrVal =SysAllocString( L"_blank");
     
        params[1].vt = VT_BOOL;
        params[1].pboolVal = 0;
     
        params[0].vt = VT_ARRAY | VT_DISPATCH;
        params[0].parray =pPropVals;
     
        VariantInit( &result);
     
        DISPPARAMS dispparams3 = {params,0,4,0};
     
        hr= pdispDesktop->Invoke( id_loadComponentFromURL, IID_NULL, LOCALE_USER_DEFAULT,
                     DISPATCH_METHOD, &dispparams3, &result, NULL, 0);
     
        pdispDocument = result.pdispVal;
        // getting sheets
        OLECHAR* fct = L"getSheets";
        DISPID id_fct;
        hr = pdispDocument->GetIDsOfNames( IID_NULL, &fct, 1,
                                           LOCALE_USER_DEFAULT, &id_fct);
        IDispatch* pdispSheets = NULL;
        VariantInit( &param1);
        DISPPARAMS dispparams6= { &param1, 0, 1, 0};
        VariantInit( &result);
        hr= pdispDocument->Invoke( id_fct, IID_NULL, LOCALE_USER_DEFAULT,
                            DISPATCH_METHOD, &dispparams6, &result, NULL, 0);
        pdispSheets = result.pdispVal;
     
        // Getting Page by index
        OLECHAR* fct1 = L"getByIndex";
        DISPID id_fct1;
        VariantInit( &param1);
        param1.vt = VT_I2;
        param1.iVal = 0; // page 0
        DISPPARAMS dispparams7= { &param1, 0, 1, 0};
        VariantInit( &result);
        hr = pdispSheets->GetIDsOfNames( IID_NULL, &fct1, 1,
                                           LOCALE_USER_DEFAULT, &id_fct1);
     
        hr= pdispSheets->Invoke( id_fct, IID_NULL, LOCALE_USER_DEFAULT,
                            DISPATCH_METHOD, &dispparams7, &result, NULL, 0);
        IDispatch* pdispSheet = result.pdispVal;
     
        //Getting Cell by pos
        fct1 = L"getCellByPosition";
        VARIANT CellRef[2];
        CellRef[1].vt = VT_I2;
        CellRef[1].iVal = 4;  // Col "E"
        CellRef[0].vt = VT_I2;
        CellRef[0].iVal = 2;  // Row "3"
     
        DISPPARAMS dispparams8= { CellRef, 0, 2, 0};
        VariantInit( &result);
        hr = pdispSheet->GetIDsOfNames( IID_NULL, &fct1, 1,
                                           LOCALE_USER_DEFAULT, &id_fct1);
     
        hr= pdispSheet->Invoke( id_fct1, IID_NULL, LOCALE_USER_DEFAULT,
                            DISPATCH_METHOD, &dispparams8, &result, NULL, 0);
        IDispatch* pdispCell = result.pdispVal;//CellPosition
        fct1 = L"String"; // "Value" pour une donnée numérique
        hr = pdispCell->GetIDsOfNames( IID_NULL, &fct1, 1,
                                           LOCALE_USER_DEFAULT, &id_fct1);
        VariantInit( &param1);
        param1.vt = VT_R8;
        param1.dblVal = 2003.01; // Envoi d'un réel
        /*
        param1.vt = VT_BSTR;    // Envoi d'une chaîne
        String S = "C++Builder3";
        Variant Vstr = S; //Conversion pour passage en paramètre
        param1.bstrVal = SysAllocString(Vstr);
        */
        DISPPARAMS dispparams9= { &param1, 0, 1, 0};
        hr= pdispCell->Invoke( id_fct1, IID_NULL, LOCALE_USER_DEFAULT,
                            DISPATCH_PROPERTYPUT, &dispparams9, &result, NULL, 0);
    Vous trouverez à cette adresse : http://api.openoffice.org/DevelopersGuide/DevelopersGuide.html, tout le nécessaire pour continuer dans la doc. : "SpreadSheet" ; les docs "First Steps", "UNO", et "Components" contiennent des infos très utiles pour comprendre ce que l'on fait.


    Faites moi savoir quelle version de SO vous utilisez, et les opérations que vous souhaitez faire, j'ai peut-être déjà écrit le code correspondant.

    Bon développement.
    Tabz.

  5. #5
    Membre averti
    Avatar de Superstivix
    Inscrit en
    Décembre 2003
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 250
    Points : 405
    Points
    405
    Par défaut
    Merci beaucoup,

    mais mon développement n'est pas pour tout de suite, il faut d'abord que je termine toutes les fonctionnalités pour la partie Excel.

    Mais dès que je m'y met et que j'ai des soucis je n'hésiterais pas à vous faire signe

    Merci encore!
    a plus
    Modérateur Taverne et C++Builder
    Règles du Club - Règles de la Taverne
    FAQ BCB - sources
    Et je mords

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

Discussions similaires

  1. Pilotage de Mozilla avec Perl
    Par piotr dans le forum Web
    Réponses: 4
    Dernier message: 16/04/2008, 16h37
  2. Pilotage du PC avec sa voix
    Par Alvaten dans le forum Audio
    Réponses: 2
    Dernier message: 25/01/2007, 14h07
  3. Pilotage d'Excel avec MinGW
    Par dedesite dans le forum Windows
    Réponses: 11
    Dernier message: 03/08/2006, 17h41
  4. Pilotage de Word avec Delphi
    Par Teddy dans le forum Delphi
    Réponses: 7
    Dernier message: 10/07/2006, 09h52
  5. Pilotage OLE Word avec Visual C++
    Par baka02 dans le forum MFC
    Réponses: 2
    Dernier message: 20/03/2006, 13h04

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