Excel Automation - 转


#include <oledb.h>
#include <comutil.h>
#include <tchar.h>

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

int
main(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(clsidExcel, NULL, CLSCTX_LOCAL_SERVER, IID_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 = {NULL, NULL, 0, 0};
VARIANT parmVisible;
DISPID dispidNamed = DISPID_PROPERTYPUT;
DISPID dispVisible;

ucPtr = L"Visible";
pDispExcel->GetIDsOfNames(IID_NULL, &ucPtr, 1, LOCALE_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(dispVisible, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT | DISPATCH_METHOD,
&dispParamsVisible, NULL, NULL, NULL);
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, &szGetBooks, 1, LOCALE_USER_DEFAULT, &dispGetWorkbooks);
if (FAILED(hr))
goto __exit;

DISPPARAMS dispParamsForGetBooks = {NULL, NULL, 0, 0};
hr = pDispExcel->Invoke(dispGetWorkbooks, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET | DISPATCH_METHOD,
&dispParamsForGetBooks, &varBooks, NULL, NULL);
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 = {&varg, NULL, 1, 0};

LPOLESTR lpOpen = L"Open";
DISPID dispOpen;

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

hr = pDispBooks->Invoke(dispOpen, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET | DISPATCH_METHOD,
&dpOpen, &varRetBook, NULL, NULL);
if (FAILED(hr))
goto __exit;

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

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

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

hr = pDispBook->Invoke(dispSheets, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET | DISPATCH_METHOD,
&dpSheets, &varRetSheets, NULL, NULL);
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 = {&vargSheet, NULL, 1, 0};

LPOLESTR lpSheet = L"Item";
DISPID dispSheet;

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

hr = pDispSheets->Invoke(dispSheet, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET | DISPATCH_METHOD,
&dpSheet, &varRetSheet, NULL, NULL);
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 = {NULL, NULL, 0, 0};
DISPID dispCells;
VARIANT varRetRange;

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

hr = pDispSheet->Invoke(dispCells, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET | DISPATCH_METHOD,
&dpCells, &varRetRange, NULL, NULL);
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, &lpRangeItem, 1, LOCALE_USER_DEFAULT, &dispRangeItem);
if (FAILED(hr))
goto __exit;


VARIANT *vargRangeItem = new VARIANT[3];

for (int i = 0; i < 3; i ++)
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 = {NULL, NULL, 0, 0};
dpRangeItem.cArgs = 3;
dpRangeItem.rgvarg = vargRangeItem;
dpRangeItem.cNamedArgs = 1;
DISPID dispIDRangeItem = DISPID_PROPERTYPUT;
dpRangeItem.rgdispidNamedArgs = &dispIDRangeItem;

EXCEPINFO except;

hr = pDispRange->Invoke(dispRangeItem, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT | DISPATCH_METHOD,
&dpRangeItem, NULL, &except, NULL);

delete []vargRangeItem;

if (FAILED(hr))
goto __exit;

}

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

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

DISPPARAMS dispBookSave = {NULL, NULL, 0, 0};

hr = pDispBook->Invoke(dispIDBookSave, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispBookSave, NULL, NULL, NULL);
if (FAILED(hr))
goto __exit;
}

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

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


DISPPARAMS dispExcelQuit = {NULL, NULL, 0, 0};

hr = pDispExcel->Invoke(dispIDExcelQuit, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispExcelQuit,
NULL, NULL, NULL);
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;
}

转载于:https://www.cnblogs.com/devilmsg/archive/2010/04/04/1704042.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值