#include #include #include "windows.h" #include "ole2.h" using namespace std; // FUNCTION THAT MAKES USING COM WITH OUT #import OR MFC // A LITTLE BIT EASIER HRESULT AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...); // FUNCTION THAT CONVERTS AN HTM FILE TO AN XLS FILE // USING A COM CONNECTION TO MS EXCEL bool htmtoxls(char *inputFile, char *outputFile); bool htmtoxls(char *inputFile, char *outputFile){ // INITIALIZE COM FOR THIS THREAD CoInitialize(NULL); // GET CLSID FOR OUR SERVER CLSID clsid; HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid); if(FAILED(hr)) { return false; } // START SERVER AND GET IDispatch IDispatch *pXlApp; hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pXlApp); if(FAILED(hr)) { return false; } // MAKE EXCEL INVISIBLE (app.visible = 0) { VARIANT x; x.vt = VT_I4; x.lVal = 1; AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlApp, L"Visible", 1, x); } // GET Workbooks COLLECTION IDispatch *pXlBooks; { VARIANT result; VariantInit(&result); AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"Workbooks", 0); pXlBooks = result.pdispVal; } // CALL Workbooks.Open(); IDispatch *pXlBook; { VARIANT param; param.vt = VT_BSTR; param.bstrVal = ::SysAllocString(/*mbtowc*/L"C:\\Documents and Settings\\robertb\\My Documents\\Visual Studio 2005\\Projects\\OVG481_exn_off_less_negative_than_-0.850.htm"); VARIANT result; VariantInit(&result); AutoWrap(DISPATCH_PROPERTYGET, &result, pXlBooks, L"Open", 1, param); VariantClear(¶m); pXlBook = result.pdispVal; } // GET ActiveSheet OBJECT IDispatch *pXlSheet; { VARIANT result; VariantInit(&result); AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"ActiveSheet", 0); pXlSheet = result.pdispVal; } // SaveAs METHOD { VARIANT param[2]; VariantInit(¶m[0]); VariantInit(¶m[1]); param[0].vt = VT_BSTR; param[0].bstrVal = ::SysAllocString(L"C:\\Documents and Settings\\robertb\\My Documents\\Visual Studio 2005\\Projects\\TEST"); param[1].vt = VT_INT; param[1].intVal = 51; //param[1].vt = VT_I4; //param[1].lVal = 51; VARIANT result; VariantInit(&result); AutoWrap(DISPATCH_METHOD, &result, pXlSheet, L"SaveAs", 2, param[0], param[1]); VariantClear(¶m[0]); VariantClear(¶m[1]); } // SET .Saved PROPERTY OF THE WORK BOOK TO TRUE SO WE ARN'T // PROMPTED TO SAVE WHEN EXCEL QUITS { VARIANT x; x.vt = VT_I4; x.lVal = 1; AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlBook, L"Saved", 1, x); } // TELL EXCEL TO QUIT (app.Quit) AutoWrap(DISPATCH_METHOD, NULL, pXlApp, L"Quit", 0); pXlSheet->Release(); pXlBook->Release(); pXlBooks->Release(); pXlApp->Release(); // UNINITIALIZE COM FOR THIS THREAD CoUninitialize(); return true; } HRESULT AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...) { // BEGIN VARIABLE ARGUMENT LIST va_list marker; va_start(marker, cArgs); if(!pDisp) { _exit(0); } DISPPARAMS dp = { NULL, NULL, 0, 0 }; DISPID dispidNamed = DISPID_PROPERTYPUT; DISPID dispID; HRESULT hr; char szName[200]; // CONVERT DOWN TO ANSI WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL); // GET DISPID FOR NAME PASSED hr = pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID); if(FAILED(hr)) { _exit(0); return hr; } // ALLOCATE MEMORY FOR ARGUMENTS VARIANT *pArgs = new VARIANT[cArgs+1]; // EXTRACT ARGUMENTS for(int i=0; iInvoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, autoType, &dp, pvResult, NULL, NULL); if(FAILED(hr)) { _exit(0); return hr; } // END variable-arguments SECTION va_end(marker); delete [] pArgs; return hr; }