Chinaunix首页 | 论坛 | 博客
  • 博客访问: 212862
  • 博文数量: 70
  • 博客积分: 2050
  • 博客等级: 大尉
  • 技术积分: 700
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-15 21:42
文章分类

全部博文(70)

文章存档

2013年(1)

2011年(5)

2010年(3)

2009年(9)

2008年(17)

2007年(6)

2006年(29)

我的朋友

分类: C/C++

2007-05-18 18:20:34

网上的一篇代码, 做了一下简单整理
#include "stdafx.h"
#include 
#include 

#pragma comment(lib, "comsupp.lib")

int
_tmain(int argc_TCHAR *argv[])
{
        // Dispatch interface
        IDispatch *pDispExcel;
        // Temporary variable to hold names.
        unsigned short *ucPtr;
        // ClSID of excel
        CLSID clsidExcel;
        // Return value
        HRESULT hr;

        IDispatch *pDispRange = 0;
        IDispatch *pDispSheet = 0;
        IDispatch *pDispSheets = 0;
        IDispatch *pDispBook = 0;
        IDispatch *pDispBooks = 0;

        // Initialize OLE Libraries.
        OleInitialize(NULL);

        // Get CLSID for Excel.Application from registry.
        hr = CLSIDFromProgID(L"Excel.Application", &clsidExcel);
        if (FAILED(hr))
        {
                MessageBox(NULL"Excel not registered.""Error"MB_OK);
                goto __exit;
        }

        ///////////////////////////////////////////////////////////////////////////////////////////////////
        // Start excel and get its IDispatch pointer.
        hr = CoCreateInstance(clsidExcelNULLCLSCTX_LOCAL_SERVERIID_IDispatch, (void **)&pDispExcel);
        if (FAILED(hr))
        {
                MessageBox(NULL"Couldn't start Excel.""Error"MB_OK);
                goto __exit;
        }

        ///////////////////////////////////////////////////////////////////////////////////////////////////
        // Get the 'visible' property's DISPID.
        DISPPARAMS dispParamsVisible = {NULLNULL00};
        VARIANT parmVisible;
        DISPID dispidNamed = DISPID_PROPERTYPUT;
        DISPID dispVisible;

        ucPtr = L"Visible";
        pDispExcel->GetIDsOfNames(IID_NULL, &ucPtr1LOCALE_USER_DEFAULT, &dispVisible);

        // Initialize parameters to set visible property to true.
        VariantInit(&parmVisible);
        parmVisible.vt = VT_I4;
        parmVisible.llVal = 1;

        // One argument.
        dispParamsVisible.cArgs = 1;
        dispParamsVisible.rgvarg = &parmVisible;

        // Handle special-case for property-puts!
        dispParamsVisible.cNamedArgs = 1;
        dispParamsVisible.rgdispidNamedArgs = &dispidNamed;

        // Set 'visible' property to true.
        hr = pDispExcel->Invoke(dispVisibleIID_NULLLOCALE_SYSTEM_DEFAULTDISPATCH_PROPERTYPUT | DISPATCH_METHOD,
                        &dispParamsVisibleNULLNULLNULL);
        VariantClear(&parmVisible);

        if (FAILED(hr))
        {
                MessageBox(NULL"Set visible!""Failed!"MB_OK);
                goto __exit;
        }


        /////////////////////////////////////////////////////////////////////////////////////////////////////
        OLECHAR *szGetBooks = L"Workbooks";
        DISPID dispGetWorkbooks;
        VARIANT varBooks;

        hr = pDispExcel->GetIDsOfNames(IID_NULL, &szGetBooks1LOCALE_USER_DEFAULT, &dispGetWorkbooks);
        if (FAILED(hr))
                goto __exit;

        DISPPARAMS dispParamsForGetBooks = {NULLNULL00};
        hr = pDispExcel->Invoke(dispGetWorkbooksIID_NULLLOCALE_SYSTEM_DEFAULTDISPATCH_PROPERTYGET | DISPATCH_METHOD,
                        &dispParamsForGetBooks, &varBooksNULLNULL);
        if (FAILED(hr))
                goto __exit;


        ///////////////////////////////////////////////////////////////////////////////////////////////////
        // Open
        if (varBooks.vt != VT_DISPATCH)
                goto __exit;
        else
        {
                // Get workbooks dispatch interface
                pDispBooks = varBooks.pdispVal;

                // Open
                VARIANT varRetBook;
                VARIANTARG varg;
                varg.vt = VT_BSTR;
                varg.bstrVal = _bstr_t("c:\\book.xls");

                DISPPARAMS dpOpen = {&vargNULL10};

                LPOLESTR lpOpen = L"Open";
                DISPID dispOpen;

                hr = pDispBooks->GetIDsOfNames(IID_NULL, &lpOpen1LOCALE_USER_DEFAULT, &dispOpen);
                if (FAILED(hr))
                        goto __exit;

                hr = pDispBooks->Invoke(dispOpenIID_NULLLOCALE_SYSTEM_DEFAULTDISPATCH_PROPERTYGET | DISPATCH_METHOD,
                                &dpOpen, &varRetBookNULLNULL);
                if (FAILED(hr))
                        goto __exit;

                if (varRetBook.vt != VT_DISPATCH)
                        goto __exit;
                else
                        pDispBook = varRetBook.pdispVal;
        }

        ///////////////////////////////////////////////////////////////////////////////////////////////////
        // worksheets
        if (pDispBook != NULL)
        {
                DISPPARAMS dpSheets = {NULLNULL00};
                DISPID dispSheets;
                LPOLESTR lpSheets = L"Worksheets";
                VARIANT varRetSheets;

                hr = pDispBook->GetIDsOfNames(IID_NULL, &lpSheets1LOCALE_USER_DEFAULT, &dispSheets);
                if (FAILED(hr))
                        goto __exit;

                hr = pDispBook->Invoke(dispSheetsIID_NULLLOCALE_SYSTEM_DEFAULTDISPATCH_PROPERTYGET | DISPATCH_METHOD,
                                &dpSheets, &varRetSheetsNULLNULL);
                if (FAILED(hr))
                        goto __exit;


                if (varRetSheets.vt != VT_DISPATCH)
                        goto __exit;
                else
                        pDispSheets = varRetSheets.pdispVal;
        }

        ///////////////////////////////////////////////////////////////////////////////////////////////////
        // worksheet
        if (pDispSheets != NULL)
        {
                VARIANT varRetSheet;

                VARIANTARG vargSheet;
                vargSheet.vt = VT_I4;
                vargSheet.intVal = 1;

                DISPPARAMS dpSheet = {&vargSheetNULL10};

                LPOLESTR lpSheet = L"Item";
                DISPID dispSheet;

                hr = pDispSheets->GetIDsOfNames(IID_NULL, &lpSheet1LOCALE_USER_DEFAULT, &dispSheet);
                if (FAILED(hr))
                        goto __exit;

                hr = pDispSheets->Invoke(dispSheetIID_NULLLOCALE_USER_DEFAULTDISPATCH_PROPERTYGET | DISPATCH_METHOD,
                                &dpSheet, &varRetSheetNULLNULL);
                if (FAILED(hr))
                        goto __exit;


                if (varRetSheet.vt != VT_DISPATCH)
                        goto __exit;
                else
                        pDispSheet = varRetSheet.pdispVal;
        }

        ///////////////////////////////////////////////////////////////////////////////////////////////////
        if (pDispSheet != NULL)
        {
                LPOLESTR lpCells = L"Cells";
                DISPPARAMS dpCells = {NULLNULL00};
                DISPID dispCells;
                VARIANT varRetRange;

                hr = pDispSheet->GetIDsOfNames(IID_NULL, &lpCells1LOCALE_USER_DEFAULT, &dispCells);
                if (FAILED(hr))
                        goto __exit;

                hr = pDispSheet->Invoke(dispCellsIID_NULLLOCALE_USER_DEFAULTDISPATCH_PROPERTYGET | DISPATCH_METHOD,
                                &dpCells, &varRetRangeNULLNULL);
                if (FAILED(hr))
                        goto __exit;


                if (varRetRange.vt != VT_DISPATCH)
                        goto __exit;
                else
                        pDispRange = varRetRange.pdispVal;
        }

        ///////////////////////////////////////////////////////////////////////////////////////////////////
        // put value in Item property
        if (pDispRange != NULL)
        {
                LPOLESTR lpRangeItem = L"Item";
                DISPID dispRangeItem;

                hr = pDispRange->GetIDsOfNames(IID_NULL, &lpRangeItem1LOCALE_USER_DEFAULT, &dispRangeItem);
                if (FAILED(hr))
                        goto __exit;


                VARIANT *vargRangeItem = new VARIANT[3];

                for (int i = 0i < 3i ++)
                        VariantInit(&vargRangeItem[i]);

                vargRangeItem[0].vt = VT_I4;
                vargRangeItem[0].intVal = 1;
                vargRangeItem[1].vt = VT_I4;
                vargRangeItem[1].intVal = 1;
                vargRangeItem[2].vt = VT_I4;
                vargRangeItem[2].intVal = 1;

                DISPPARAMS dpRangeItem = {NULLNULL00};
                dpRangeItem.cArgs = 3;
                dpRangeItem.rgvarg = vargRangeItem;
                dpRangeItem.cNamedArgs = 1;
                DISPID dispIDRangeItem = DISPID_PROPERTYPUT;
                dpRangeItem.rgdispidNamedArgs = &dispIDRangeItem;

                EXCEPINFO except;

                hr = pDispRange->Invoke(dispRangeItemIID_NULLLOCALE_USER_DEFAULTDISPATCH_PROPERTYPUT | DISPATCH_METHOD,
                                &dpRangeItemNULL, &exceptNULL);

                delete []vargRangeItem;

                if (FAILED(hr))
                        goto __exit;

        }

        ///////////////////////////////////////////////////////////////////////////////////////////////////
        // Save
        if (pDispBook)
        {
                LPOLESTR lpBookSave = L"Save";
                DISPID dispIDBookSave;

                hr = pDispBook->GetIDsOfNames(IID_NULL, &lpBookSave1LOCALE_USER_DEFAULT, &dispIDBookSave);
                if (FAILED(hr))
                        goto __exit;

                DISPPARAMS dispBookSave = {NULLNULL00};

                hr = pDispBook->Invoke(dispIDBookSaveIID_NULLLOCALE_USER_DEFAULTDISPATCH_METHOD, &dispBookSaveNULLNULLNULL);
                if (FAILED(hr))
                        goto __exit;
        }

        ///////////////////////////////////////////////////////////////////////////////////////////////
        // quit
        if (pDispExcel)
        {
                LPOLESTR lpExcelQuit = L"Quit";
                DISPID dispIDExcelQuit;

                hr = pDispExcel->GetIDsOfNames(IID_NULL, &lpExcelQuit1LOCALE_USER_DEFAULT, &dispIDExcelQuit);
                if (FAILED(hr))
                        goto __exit;


                DISPPARAMS dispExcelQuit = {NULLNULL00};

                hr = pDispExcel->Invoke(dispIDExcelQuitIID_NULLLOCALE_USER_DEFAULTDISPATCH_METHOD, &dispExcelQuit,
                                NULLNULLNULL);
                if (FAILED(hr))
                        goto __exit;

        }

__exit:
        if (pDispRange)
                pDispRange->Release();

        if (pDispSheet)
                pDispSheet->Release();

        if (pDispSheets)
                pDispSheets->Release();

        if (pDispBook)
                pDispBook->Release();

        if (pDispBooks)
                pDispBooks->Release();

        if (pDispExcel)
                pDispExcel->Release();

        OleUninitialize();

        return 0;
}

文件: excel.zip
大小: 1KB
下载: 下载
阅读(1982) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~