Code:
void mainExcel(int err, BSTR bTemplate, BSTR range, VARIANT pSA, BSTR bOutput, int switchFlag){
IDispatch *pXlApp;
IDispatch *pXlBooks;
IDispatch *pXlBook;
IDispatch *pXlSheet;
//Opening Excel starts now
cout << endl;
cout << "Initialising COM..." << endl;
CoInitialize ( NULL );
// Get CLSID for Excel
CLSID clsid;
cout << "Obtaining Excel CLSID from application name..." << endl;
HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid);
if(FAILED(hr))
{
cout << "CLSIDFromProgID() failed - Error" << endl;
err = 1;
return;
}
// Start server and get IDispatch...
cout << "Creating instance of Excel using IDispatch..." << endl;
hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pXlApp);
if(FAILED(hr)) {
cout << "Excel not registered properly - Error" << endl;
err = 1;
return;
}
// Make it visible (i.e. app.visible = 1)
cout << "Making instance of Excel visible..." << endl;
{
VARIANT x;
x.vt = VT_I4;
x.lVal = 1;
AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlApp, L"Visible", 1, x);
}
// Get Workbooks collection
{
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"Workbooks", 0);
pXlBooks = result.pdispVal;
}
// Call Workbooks.Open() to open an existing workbook...
cout << "Opening workbook..." << endl;
{
VARIANT result;
VariantInit(&result);
VARIANT fname;
fname.vt = VT_BSTR;
if(switchFlag == 1)
{
fname.bstrVal = bOutput;
}
else
{
fname.bstrVal = bTemplate;
}
AutoWrap(DISPATCH_METHOD, &result, pXlBooks, L"Open", 1, fname);
pXlBook = result.pdispVal;
}
// Get ActiveSheet object
cout << "Getting Active Sheet..." << endl;
{
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"ActiveSheet", 0);
pXlSheet = result.pdispVal;
}
//Changing the ActiveSheet
if(switchFlag == 1)
{
{
VARIANT result;
VariantInit(&result);
VARIANT itemn;
itemn.vt = VT_I4;
itemn.lVal = 1;
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheet, L"Item", 1, itemn);
pXlSheet = result.pdispVal;
}
{
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_METHOD, &result, pXlSheet, L"Activate", 0);
}
}
// Get Range object...
cout << "Getting Range Object..." << endl;
IDispatch *pXlRange;
{
VARIANT parm;
parm.vt = VT_BSTR;
parm.bstrVal = range;
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheet, L"Range", 1, parm);
VariantClear(&parm);
pXlRange = result.pdispVal;
}
// Set range with our safearray...
cout << "Setting Range..." << endl;
AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlRange, L"Value", 1, pSA);
// Save workbook
wcout << "Saving " << bOutput << "..." << endl;
{
VARIANT result;
VariantInit(&result);
VARIANT fname;
fname.vt = VT_BSTR;
fname.bstrVal = bOutput;
AutoWrap(DISPATCH_METHOD, &result, pXlBook, L"SaveAs", 1, fname);
}
// Set .Saved property of workbook to TRUE so we aren't prompted
// to save when we tell Excel to quit...
{
VARIANT x;
x.vt = VT_I4;
x.lVal = 1;
AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlBook, L"Saved", 1, x);
}
//Tell Excel to quit (i.e. App.Quit)
//AutoWrap(DISPATCH_METHOD, NULL, pXlApp, L"Quit", 0);
//Release references...
pXlRange->Release();
pXlSheet->Release();
pXlBook->Release();
pXlBooks->Release();
pXlApp->Release();
//Uninitialize COM for this thread...
CoUninitialize();
}