侃侃无极
我以前写过一个应用,比较复杂,而且还是VC++ 6.0的,等明天我给你传个简单的。我新建了一个Win32 控制台程序,在 stdafx.h 的结尾处添加: #import "c:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE12\\MSO.DLL" rename_namespace("Office")using namespace Office;#import "c:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.olb" rename_namespace("VBE6")using namespace VBE6;#import "c:\\Program Files\\Microsoft Office\\OFFICE12\\EXCEL.EXE" rename("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL") rename("DocumentProperties", "DocumentPropertiesXL") exclude ("IFont","IPicture"),rename_namespace("MSExcel")using namespace MSExcel;#import "c:\\Program Files\\Common Files\\Designer\\msaddndr.dll" raw_interfaces_only, raw_native_types, no_namespace, named_guids 下面的为对Excel的操作代码: int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]){ int nRetCode = 0; // 初始化 MFC 并在失败时显示错误 if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { // TODO: 更改错误代码以符合您的需要 _tprintf(_T("错误: MFC 初始化失败\n")); nRetCode = 1; } else { // TODO: 在此处为应用程序的行为编写代码。 HRESULT hr=NULL; // 初始化 COM 库 hr = CoInitialize(NULL); if(FAILED(hr)) { _tprintf(_T("错误: COM 初始化失败\n")); nRetCode = 1; return nRetCode; } LPDISPATCH lpDisp=NULL; CLSID clsid; ::COleDispatchDriver codd; COleException* pError=new COleException; // 获得EXCEL的CLSID ::CLSIDFromProgID(L"Excel.Application",&clsid); // 打开 Excel Application 。 if(!codd.CreateDispatch(clsid,pError)) { pError->Delete(); _tprintf(_T("错误: 打开 Excel Application 失败\n")); nRetCode = 1; return nRetCode; } CComQIPtr <MSExcel::_Application> pApp(codd.m_lpDispatch); // 显示 Excell Application。 pApp->PutVisible(0,TRUE); codd.ReleaseDispatch(); CComQIPtr <MSExcel::Workbooks> pCurDocs; CComQIPtr <MSExcel::_Workbook> pCurDoc; CComQIPtr <MSExcel::_Worksheet> pCurSheet; CComQIPtr <MSExcel::Range> pCurRange; COleVariant vTrue((short)TRUE),vFalse((short)FALSE); COleVariant vNull(L""); COleVariant vZero((short)0); COleVariant vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); // 保存文件名。 COleVariant vDocName(L"CppUseExcel.xlsx"); // 获取 Workbooks。 pCurDocs=pApp->GetWorkbooks(); // 新建空白工簿。 pCurDoc=pCurDocs->Add(vNull,0); // 获取 Sheet1 。 pCurSheet = pCurDoc->Sheets->GetItem(1); // 获取 Sheet1 的 A1 单元格,并填写初始值. pCurRange = pCurSheet->GetRange(L"A1"); int initValue = 1234; pCurRange->FormulaR1C1 = initValue; // 获取 Sheet1 的 A1 单元格的值. int nValueA1 = pCurRange->GetValue2(); // 获取 [C2,E5] 单元格,并填写初始值. pCurRange = pCurSheet->GetRange(L"C2",L"E5"); pCurRange->FormulaR1C1 = initValue; // 获取 Sheet1 的 [C2,E5] 单元格的值. _variant_t vC2E5= pCurRange->GetValue2(); // 获取 Sheet2 ,并将 Sheet1 A1 单元格的值乘以 2 后填入 Sheet2 的 A1 单元格. // Sheet1 [C2,E5] 单元格的值乘以 2 后填入 Sheet2 的 [C2,E5] 单元格. pCurSheet = pCurDoc->Sheets->GetItem(2); pCurRange = pCurSheet->GetRange(L"A1"); pCurRange->FormulaR1C1 = nValueA1 *2; pCurRange = pCurSheet->GetRange(L"C2",L"E5"); // 这里涉及到对 SAFEARRAY 中元素的操作,暂时不写,如果你确定是 // 在 Range [C2,E5] 中填写数组,我再写这个过程. pCurRange->FormulaR1C1 =vC2E5; hr = pCurDoc->SaveAs( vDocName, xlOpenXMLWorkbook, vOptional, vOptional, vFalse, vFalse, xlNoChange, xlLocalSessionChanges, vOptional, vOptional, vOptional, vOptional); if(FAILED(hr)) { _tprintf(_T("错误: 保存 Excel 文档失败\n")); pError->Delete(); pApp->Quit(); nRetCode = 1; return nRetCode; } pError->Delete(); pApp->Quit(); } return nRetCode;}