首页 新闻 会员 周边

求一个在VS2008中用MFC自动化EXCEL2007实例

0
悬赏园豆:100 [已解决问题] 解决于 2010-08-23 22:24

我一直在学习MFC自动化EXCEL2007,可是很难进步。在这里想占用大侠5分钟时间,传一个成功的实例给我。将感激不尽。

环境是XP系统32位。VS2008。EXCEL2007
条件:
  1。把Sheet1中A1位上的数字用C++语言乘以2后写入Sheet2中A1位上。
  2. 把Sheet1中(C2,E5)位上的数字用C++语言乘以2后写入Sheet2中(C2,E5)位上。
  3. 必须运行成功。

请把成功的文件发在论坛上。或传入我的QQ邮箱514546045@qq.com

谢谢了.....

一个文盲的主页 一个文盲 | 初学一级 | 园豆:105
提问于:2010-08-22 01:02
< >
分享
最佳答案
0

我以前写过一个应用,比较复杂,而且还是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;
}
收获园豆:100
Launcher | 高人七级 |园豆:45045 | 2010-08-22 22:36
已经把代码发到你的qq邮箱了.
Launcher | 园豆:45045 (高人七级) | 2010-08-23 11:14
非常感谢老师的指点。 非常感谢;;;;
一个文盲 | 园豆:105 (初学一级) | 2010-08-23 22:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册