Auotomate OfficeApplication in vc++

cpp Germany
  • 12 years ago

    Hai,
        Can anyone help me to automate the Microsoft Office(word,excel,powerpoint,Access etc) in VC++.


    Thanks in advance,


    Regards,
    vijee

  • 12 years ago

    Bonsoir,
    step1
    /*******************/
    /
                                                               /
    /
                     automation EXCEL                          /
    /
                                                               /
    /
    *******************/

    include <windows.h>


    include <stdio.h>


    include <TCHAR.H>


    include <conio.h>



    include <time.h>


    include <locale>


    include <sys/timeb.h>



    import "C:\Program Files\Fichiers communs\Microsoft Shared\Office10\MSO.DLL" \


        no_namespace rename("DocumentProperties","DocumentPropertiesXL")


    import "C:\Program Files\Fichiers communs\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB" \


        no_namespace


    import <C:\Program Files\Microsoft Office\Office10\excel.exe > \


        rename("DialogBox","DialogBoxXLs")  \
        rename("RGB","RGBXLs")  \
        rename("DocumentProperties",  "DocumentPropertiesXLs")  \
        nodualinterfaces


    pragma warning(disable: 4192)


    pragma warning(disable: 4146)      



    define VT    ariantt


    define BT    bstrt



    struct InitOle {
                       InitOle()  { CoInitialize(NULL); }
                       ~InitOle() { CoUninitialize(); }
                   } initInitOle; // Global Instance to force load/unload of OLE
    using namespace Excel;
    void main(int argc, char*argv[])
    {
       
    ApplicationPtr  pXlsApp;  
       WorkbookPtr     pBook;    //pBook = pXlsApp->Workbooks->Add(staticcast<long>(Excel::xlWorksheet)); // Create the workbook
       WorkbooksPtr     pBooks;
       _WorksheetPtr    pFeuille;
       
       HRESULT          hr;


       char path[ MAXPATH ];
       GetCurrentDirectory( MAX
    PATH, path );//ou GetOpenFilename()
       strcat(path, "\a.xls");


    /*I lecture écriture d'une feuille Excel */
       hr = pXlsApp.CreateInstance(L"Excel.Application");
       if( ! hr )            //accès au classeur existant
       {
           pXlsApp   -> PutVisible(1);


    /*00 //récurérer le nom de fichier choisi */    
           VARIANT  retopen = pXlsApp -> GetOpenFilename();
           BSTR txtopen;                                    
           txtopen = retopen.bstrVal;
           char nomfich[ MAXPATH ];
           strcpy( nomfich , _comutil::ConvertBSTRToString(txtopen));
           printf( "%s\n", nom_fich );    


    /0  ou choix nom_fich si extension==xls,xla.../    
           pBook     = pXlsApp -> Workbooks -> Open(path);
           pFeuille  = pXlsApp -> ActiveSheet;


    /1 lire un long/    
           long    n = pXlsApp -> Range["B4"] -> Value;  
           printf("n = %d\n", n);


    /2 lire une chaine/    
           VARIANT  ret = pXlsApp -> Range["D16"] -> Value;
           BSTR     txt;
                    txt = ret.bstrVal;
           printf("%s\n", comutil::ConvertBSTRToString(txt));
       
    /3 lire une date/    
           VARIANT      mad;                                
           ma
    d.vt = VTDATE;    //VTBYREF | VTDATE;
           VariantInit( &ma
    d );
           mad.date = pXlsApp -> Range["A26"] -> Value;
           printf( "date=%s\n", ma
    d.date );


           VariantClear( &ma_d );


    /4 récup nom utilisateur/    
           BSTR user = pXlsApp -> GetUserName();          
           char utilisat[MAXPATH];                        
           strcpy( utilisat , _com
    util::ConvertBSTRToString(user));
           printf("%s\n", utilisat);   //visualiser le nom de fichier choisi


    /* 5 écriture /
           _WorksheetPtr   pSheet = pXlsApp -> ActiveSheet;   // écriture
           pSheet -> Range["A19"] -> FormulaR1C1 = path;      // long, chaine...
           pSheet -> Range["A20"] -> FormulaR1C1 = nom_fich;
           pSheet -> Range["A21"] -> FormulaR1C1 = n
    45.0;
           pSheet -> Range["A22"] -> FormulaR1C1 = utilisat;


    /* 6 couleurs */
           variantt   coul;
           coul.vt      = VT_I2;
           VariantInit( &coul );
           coul.lVal    = 8;//23;
           pXlsApp -> Range["A27"] -> FormulaR1C1 = "6/1/2001";
           pXlsApp -> Range["A27"] -> Interior -> ColorIndex = coul.lVal;
                                             
           coul.lVal    = 40;          //3 rouge //4 vert clair//10 vert foncé
                                       //5 bleu //6 jaune //7 magenta
           pXlsApp -> Range["C1"]["C25"] -> Interior -> ColorIndex = coul.lVal;
           coul.lVal    = 3;
           pXlsApp -> Range["D1"]["D25"] -> Interior -> ColorIndex = coul.lVal;
           coul.lVal    = 4;
           pXlsApp -> Range["E1"]["E25"] -> Interior -> ColorIndex = coul.lVal;
           coul.lVal    = 10;
           pXlsApp -> Range["F1"]["F25"] -> Interior -> ColorIndex = coul.lVal;
           coul.lVal    = 5;
           pXlsApp -> Range["G1"]["G25"] -> Interior -> ColorIndex = coul.lVal;
           coul.lVal    = 6;
           pXlsApp -> Range["H1"]["H25"] -> Interior -> ColorIndex = coul.lVal;
           coul.lVal    = 7;
           pXlsApp -> Range["I1"]["I25"] -> Interior -> ColorIndex = coul.lVal;
           coul.lVal    = 39;
           pXlsApp -> Range["J1"]["J25"] -> Interior -> ColorIndex = coul.lVal;
           coul.lVal    = 23;
           pXlsApp -> Range["K1"]["K25"] -> Interior -> ColorIndex = coul.lVal;
           coul.lVal    = 24;
           pXlsApp -> Range["L1"]["L25"] -> Interior -> ColorIndex = coul.lVal;
           coul.lVal    = 25;
           pXlsApp -> Range["M1"]["M25"] -> Interior -> ColorIndex = coul.lVal;
           coul.lVal    = 26;
           pXlsApp -> Range["N1"]["N25"] -> Interior -> ColorIndex = coul.lVal;
           
           VariantClear( &coul );                                    


    /* 7 date */  //"hh:mm:ss" pour time
           RangePtr   pRange;
           pRange = pSheet -> Range["A11"]["A15"];
           pRange -> NumberFormatLocal = "[$-F800]jjjj, mmmm jj, aaaa";
           pXlsApp -> Range["A15"] -> FormulaR1C1 = "1962/07/05";          


           //pXlsApp -> Range["A13"] -> NumberFormat = true;
           pXlsApp -> Range["A13"]["A13"] -> FormulaR1C1 = "1962/01/23";
           
           pXlsApp -> Range["A16"] -> FormulaR1C1 = "1969/11/02";
           pXlsApp -> Range["A25"] -> FormulaR1C1 = "2005/07/29";
           pXlsApp -> Range["A26"] -> FormulaR1C1 = "2001/03/25";


    /* 8 écrire une date avec un format */
           char tmpbuf[60];
           time_t ltime;
           struct tm *today;


           setlocale(LC_TIME,"French");
           time( &ltime );
           today = localtime( &ltime );
           strftime( tmpbuf, 60,"aujord'hui %A  le %d  %B  %Y %X \n", today );        


           pSheet -> Range["A28"] -> FormulaR1C1 = tmpbuf;


    /* 9 écrire une date avec changt pays */
           setlocale(LC_TIME,"German");
           strftime( tmpbuf, 60,"en Allemand on dit %A  le %d  %B  %Y %X\n", today );        
           pSheet -> Range["A29"] -> FormulaR1C1 = tmpbuf;


    /* 10 passage de coordonées par variable*/
           char tmp[4]="A23";
           variantt  incr[10];
           incr[1] = tmp;//"A23";
           pFeuille -> Range[incr[1]][incr[1]] -> FormulaR1C1 = n/45.0;


    /* 11 copier coller /
           pFeuille -> Range["a16"] -> Copy();
           pXlsApp  -> ActiveCell -> FormulaR1C1 = "3/25/2001";
           pFeuille -> Range["A30"] -> Select();
           pFeuille -> Paste(vtMissing,vtMissing);
           pFeuille -> Range["A30"] -> FindNext();
           pFeuille -> Paste(vtMissing,vtMissing);
           //_Application::GetRange ( const _variant_t & Cell1,
                                     //const _variant_t & Cell2 );
    /
    fin lectecrt */
           pFeuille -> SaveAs( path );
           if( pBook ) pBook -> Close();  //ferme le classeur
       }
       if( pXlsApp ) pXlsApp -> Quit();   //ferme le Excel
       
    /* II mise en forme */
       
    ApplicationPtr  pXLsApp2;
       HRESULT          hr2;


       variantt       align;
       VariantInit( &align );
       align.vt     = VT_I4;
       align.lVal   = xlCenter;


       variantt   couleur;
       couleur.vt      = VT_I2;
       VariantInit( &couleur );
       couleur.lVal    = 14;


       variantt   coulfont;
       coulfont.vt      = VT_I2;
       VariantInit( &coulfont );
       coulfont.lVal    = 6;


       hr2 = pXLsApp2.CreateInstance(L"Excel.Application");
       if( ! hr2 )            
       {
           pXLsApp2 -> Visible = VARIANT_TRUE;


    //ajout d'une feuille
           pBook = pXLsApp2 -> Workbooks -> Add((long)xlWorksheet4);
           pFeuille = pXLsApp2  -> ActiveSheet;
           pFeuille -> Name = "mafeuille1";
           
    //pXLsApp2 -> StandardFontSize = 14;//changement de la taille
           pXLsApp2 -> Range["A1:J10"] -> Font -> Bold = true;
           pXLsApp2 -> Range["A1:J10"] -> Font -> Name = "Times New Roman";//"MS Sans Serif"
           pXLsApp2 -> Range["A1:J10"] -> Font -> Size =  couleur.lVal;


           pXLsApp2 -> Range["A10"]["A10"] -> Select();


           couleur.lVal    = 23;
           pXLsApp2 -> Range["A10"] -> Interior -> ColorIndex = couleur.lVal;
           pXLsApp2 -> Range["A10"] -> Font -> ColorIndex = coulfont.lVal;


           pXLsApp2 -> ActiveCell -> FormulaR1C1=(_T("essai A10"));


           pXLsApp2 -> Range["D6"]["D6"] -> Select();


           couleur.lVal     = 10;
           coulfont.lVal    = 2;


           pXLsApp2 -> Range["D6"] -> Interior -> ColorIndex = couleur.lVal;
           pXLsApp2 -> Range["D6"] -> Font -> ColorIndex = coulfont.lVal;
           pXLsApp2 -> Range["D6"] -> Font -> FontStyle = "Italique";//"Gras italique"
           pXLsApp2 -> ActiveCell -> FormulaR1C1 = (_T("c'est la d6"));
           
    //créer une cellule large POUR LE TITRE de la colonne
           pFeuille -> Range["A1"]["C5"] -> MergeCells = true;
           pXLsApp2 -> Range["A1"]["C5"] -> Select();
           
           couleur.lVal     = 6;
           coulfont.lVal    = 5;


           pXLsApp2 -> Range["A1"] -> Interior -> ColorIndex = couleur.lVal;
           pXLsApp2 -> Range["A1"] -> Font -> ColorIndex = coulfont.lVal;


           pXLsApp2 -> ActiveCell -> FormulaR1C1 = (_T("mon titre colonne 1"));
           pXLsApp2 -> ActiveCell -> VerticalAlignment   = &align;
           pXLsApp2 -> ActiveCell -> HorizontalAlignment = &align;


    //créer une cellule large POUR LE TITRE de la colonne
           pFeuille -> Range["D1"]["G5"] -> MergeCells = true;
           pXLsApp2 -> Range["D1"]["G5"] -> Select();


           couleur.lVal     = 26;
           coulfont.lVal    = 11;


           pXLsApp2 -> Range["D1"] -> Interior -> ColorIndex = couleur.lVal;
           pXLsApp2 -> Range["D1"] -> Font -> ColorIndex = coulfont.lVal;


           pXLsApp2 -> ActiveCell -> FormulaR1C1 = (_T("mon titre colonne 2"));
           pXLsApp2 -> ActiveCell -> VerticalAlignment   = &align;//alignement du texte
           pXLsApp2 -> ActiveCell -> HorizontalAlignment = &align;


    //créer une cellule large POUR LE TITRE de la colonne
           pFeuille -> Range["H1"]["J5"] -> MergeCells = true;
           pXLsApp2 -> Range["H1"]["J5"] -> Select();


           couleur.lVal     = 17;
           coulfont.lVal    = 31;


           pXLsApp2 -> Range["H1"] -> Interior -> ColorIndex = couleur.lVal;
           pXLsApp2 -> Range["H1"] -> Font -> ColorIndex = coulfont.lVal;


           pXLsApp2 -> ActiveCell -> FormulaR1C1 = (_T("mon titre colonne 3"));
           pXLsApp2 -> ActiveCell -> VerticalAlignment   = &align;//alignement du texte
           pXLsApp2 -> ActiveCell -> HorizontalAlignment = &align;
           
           pXLsApp2 -> Range["A7"]["D9"] -> Select();
           pFeuille -> Range["A7"]["D9"] -> MergeCells = true;    //fusionner des cellules
           
           couleur.lVal     = 47;
           coulfont.lVal    = 9;


           pXLsApp2 -> Range["A7"] -> Interior -> ColorIndex = couleur.lVal;
           pXLsApp2 -> Range["A7"] -> Font -> ColorIndex = coulfont.lVal;
           
           pXLsApp2 -> ActiveCell -> FormulaR1C1 = (_T("C'EST UN TEXTE CENTRE  HORIZONTALEMENT ET VER !"));
           
           pXLsApp2 -> ActiveCell -> VerticalAlignment   = &align;//alignement du texte
           pXLsApp2 -> ActiveCell -> HorizontalAlignment = &align;


           VariantClear( &align );
           VariantClear( &couleur );
           VariantClear( &coulfont );


    //pXLsApp2 -> StandardFontSize = 10;// retour à la taille 10
           
           char path2[ MAXPATH ];
           GetCurrentDirectory( MAX
    PATH, path2 );//ou GetOpenFilename()
           strcat(path2, "\mise_forme.xls");
           pFeuille -> SaveAs( path2 );


           if( pBook ) pBook -> Close();    //ferme le classeur
       }
       if( pXLsApp2 ) pXLsApp2 -> Quit();       //quitte l'application
    }
    /*
    step2
    chart
    /*******************/
    /
                                                               /
    /
                     automation EXCEL                          /
    /
                                                               /
    /
    *******************/
    /*#include <windows.h>

    include <stdio.h>


    include <TCHAR.H>


    include <conio.h>



    include <time.h>


    include <sys/timeb.h>


    include <locale>



    import "C:\Program Files\Fichiers communs\Microsoft Shared\Office10\MSO.DLL" \


        no_namespace rename("DocumentProperties","DocumentPropertiesXL")


    import "C:\Program Files\Fichiers communs\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB" \


        no_namespace


    import <C:\Program Files\Microsoft Office\Office10\EXCEL.EXE> \


        rename("DialogBox","DialogBoxXLs")  \
        rename("RGB","RGBXLs")  \
        rename("DocumentProperties",  "DocumentPropertiesXLs")  \
        nodualinterfaces


    pragma warning(disable: 4192)


    pragma warning(disable: 4146)



    using namespace Excel;      


    define VT    ariantt


    define BT    bstrt



    struct InitOle {
                       InitOle()  { CoInitialize(NULL); }
                       ~InitOle() { CoUninitialize(); }
                   } initInitOle_; // Global Instance to force load/unload of OLE


    void dumpcomerror(comerror &e)
    {
       tprintf(T("Oops - hit an error!\n"));
       tprintf(T("\a\tCode = %08lx\n"), e.Error());
       tprintf(T("\a\tCode meaning = %s\n"), e.ErrorMessage());
       bstrt bstrSource(e.Source());
       bstrt bstrDescription(e.Description());
       tprintf(T("\a\tSource = %s\n"), (LPCTSTR) bstrSource);
       tprintf(T("\a\tDescription = %s\n"), (LPCTSTR) bstrDescription);
    }


    void main(int argc, char*argv[])
    {
       _ApplicationPtr pXL;
       try
       {
           pXL.CreateInstance(L"Excel.Application");


           pXL -> Visible = VARIANT_TRUE;


           WorkbooksPtr pBooks = pXL    -> Workbooks;
           WorkbookPtr pBook  = pBooks -> Add((long)xlWorksheet);
           
    WorksheetPtr pSheet = pXL   -> ActiveSheet;
                         pSheet -> Name = "essai graphe";


           pSheet->Range["A2"]["A2"]->FormulaR1C1=T("Company A");
           pSheet->Range["B2"]["B2"]->FormulaR1C1=
    T("Company B");
           pSheet->Range["C2"]["C2"]->FormulaR1C1=T("Company C");
           pSheet->Range["D2"]["D2"]->FormulaR1C1=
    T("Company D");


           pSheet->Range["A3"]["A3"]-> FormulaR1C1 = 75.0;
           pSheet->Range["B3"]["B3"]-> FormulaR1C1 = 14.0;
           pSheet->Range["C3"]["C3"]-> FormulaR1C1 = 7.0;
           pSheet->Range["D3"]["D3"]-> FormulaR1C1 = 4.0;
       
           RangePtr   pRange  = pSheet -> Range["A23"];
           ChartPtr  pChart  = pBook  -> Charts -> Add();//"mongr1"
           
           pChart -> ChartWizard( (Range) pRange, (long) xl3DPie,
                                   7L, (long) xlRows, 1L, 0L, 2L,
                                   "essai graphe 3DPie");
           Sleep(3000 ); // 3000 msec = 3 sec
           
           pChart = pBook -> Charts -> Add();//"mon_gr2"
           pChart -> ChartWizard( (Range
    ) pRange, (long) xl3DArea,
                                  7L, (long) xlRows, 1L, 0L, 2L,
                                  "essai graphe 3DArea");
           Sleep(5000 ); // 5000 msec = 5 sec
           
           char pathg[ MAXPATH ];
           GetCurrentDirectory( MAX
    PATH, pathg );
           strcat( pathg, "\essai_grc++.xls" );
           pSheet -> SaveAs( pathg );


           if( pBook ) pBook -> Close();    //ferme le classeur
           if( pXL ) pXL     -> Quit();     //quitte l'application
       }
       catch(comerror &e) { dumpcomerror(e);}
    }    
    /*decration exist in EXCEL.tlh, EXCELtlh
    HRESULT Chart::ChartWizard (
                               const _variant
    t & Source,
                               const variantt & Gallery,
                               const variantt & Format,
                               const variantt & PlotBy,
                               const variantt & CategoryLabels,
                               const variantt & SeriesLabels,
                               const variantt & HasLegend,
                               const variantt & Title,
                               const variantt & CategoryTitle,
                               const variantt & ValueTitle,
                               const variantt & ExtraTitle
                            );
    type of chart:


    //    xl3DPie = -4102,       xl3DLine = -4101,
    //  xlLine = 4,            xlPie = 5,
    //  xlXYScatter = -4169,   xl3DArea = -4098,
    //  xlArea = 1,            xlDoughnut = -4120,  xlRadar = -4151 and other type consulte enum XlChartType in Excel.tlh.
    */    



     

  • 10 years ago

    Hi Nasredine,

    Thanks for the code on Excel Automation. It's  very much useful to me.

    Like that, can you please help me that how can I delete a ROM/COLUMN in an Excel sheet.

    also I would like to know all member functions of

       _ApplicationPtr  pXlsApp;  
       _WorkbookPtr     pBook;   

       WorkbooksPtr     pBooks;
       _WorksheetPtr    pFeuille;

    these classes. Can you please give me the way to see its member functions if possible.

     

    Thanks in Advance ,

    G.Varadarajan

     

Post a reply

Enter your message below

Sign in or Join us (it's free).

Contribute

Why not write for us? Or you could submit an event or a user group in your area. Alternatively just tell us what you think!

Our tools

We've got automatic conversion tools to convert C# to VB.NET, VB.NET to C#. Also you can compress javascript and compress css and generate sql connection strings.

“There are only two kinds of languages: the ones people complain about and the ones nobody uses” - Bjarne Stroustrup