分类: C/C++
2007-05-18 18:20:34
网上的一篇代码, 做了一下简单整理
#include "stdafx.h"
#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(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;
}
|