使用VC++6.0 MFC OLE操作Excel 进行简单的读写
- 简单的准备工作
首先保证VC++6.0在你的电脑上正确地安装,当然我们用Visual Stdio也是一样的。
然后,我们需要创建一个工程:
简单设置之后,我们我们得到一个基于对话框的基本MFC程序。
双击Dialog上的按钮,添加上OnButtonRead()
当然写入按钮也是相同做法。
如此,我们便完成了准备工作。
- 所需求的类库
我们需要添加Office OLE操作的相关函数。
可以通过Ctrl+W方式调出类向导
选择From a type library 之后,选择自己电脑的Office安装路径(我电脑的环境为Office2013,故文件名为Office15,不清楚自己电脑Office环境对应是多少的可以去网上查下)选择:Excel.exe。
再次进入类库选择,选择_Application,Sheets(旧版本为WorkSheets,因版本而异),_WorkSheet,_WorkBook,WorkBooks,Range。
确认之后,发现SourceFile里多了excel.h和excel.cpp,这是根据你的需要裁剪好了的支持库。
在当前的ExcelRandWDlg.cpp中加入
/* ExcelRandWDlg.cpp */
#include "excel.h"
//并设置全局变量
_Application ExcelApp;
Workbooks workbooks;
_Workbook workbook;
Sheets sheets; //低版本Office请将这改为 WorkSheets
_Worksheet sheet;
Range range;
并在 InitDialog( )函数中加入
AfxOleInit();
- 写入操作
写入操作就是完成按钮响应函数:OnButtonWrite()
void CExcelRandWDlg::OnButtonWrite()
{
CString strPath;
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
CFileDialog dlg(true,"配置文件",NULL,0,
"表格文件(.xlsx)|*.xlsx|表格文件(.xls)|*.xls");
//打开文件
if(IDOK==dlg.DoModal())
strPath =dlg.GetPathName();
if(!g_app.CreateDispatch("Excel.Application"))
{
AfxMessageBox("创建Excel服务失败");
return;
}
//获取所有的工作簿
g_books = g_app.GetWorkbooks();
//用来锁定对应的工作簿
g_books.AttachDispatch(g_app.GetWorkbooks(),true);
g_book = g_books.Open( strPath,covOptional,covOptional,
covOptional,covOptional,covOptional,covOptional,
covOptional,covOptional,covOptional,covOptional,
covOptional,covOptional,covOptional,covOptional);
//得到Worksheets
g_sheets.AttachDispatch(g_book.GetWorksheets(),true);
g_sheet=g_sheets.GetItem(COleVariant((short)1));
//得到全部Cells,此时
//设置5行第一列的单元的值
g_range=g_sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("A1")));
g_range.SetValue2(COleVariant(_T("1")));
g_range=g_sheet.GetRange(COleVariant(_T("A2")),COleVariant(_T("A2")));
g_range.SetValue2(COleVariant(_T("2")));
g_range=g_sheet.GetRange(COleVariant(_T("A3")),COleVariant(_T("A3")));
g_range.SetValue2(COleVariant(_T("3")));
g_range=g_sheet.GetRange(COleVariant(_T("A4")),COleVariant(_T("A4")));
g_range.SetValue2(COleVariant(_T("4")));
g_range=g_sheet.GetRange(COleVariant(_T("A5")),COleVariant(_T("A5")));
g_range.SetValue2(COleVariant(_T("5")));
g_book.Save(); //保存
g_range.ReleaseDispatch(); //退出
g_sheet.ReleaseDispatch();
g_sheets.ReleaseDispatch();
g_book.ReleaseDispatch();
g_books.ReleaseDispatch();
g_app.Quit();
g_app.ReleaseDispatch();
}
-读取操作
即OnButtonRead( )函数
void CExcelRandWDlg::OnButtonRead()
{
COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
VARIANT ret,val;
CString str,strPath;
long index[2];
COleSafeArray ole;
CFileDialog dlg(true,"配置文件",NULL,0,
"表格文件(.xlsx)|*.xlsx|表格文件(.xls)|*.xls");//打开文件夹
if(IDOK==dlg.DoModal())
strPath = dlg.GetPathName();
if(!g_app.CreateDispatch("Excel.Application"))
{
AfxMessageBox("创建Excel服务失败");
return;
}
//获取所有的工作簿
g_books = g_app.GetWorkbooks();
//打开工作簿
g_book = g_books.Open(strPath,VOptional,VOptional,
VOptional, VOptional,VOptional,VOptional,
VOptional, VOptional,VOptional,VOptional,
VOptional, VOptional,VOptional,VOptional);
//获取所有表
g_sheets = g_book.GetWorksheets();
//得到第一个表
g_sheet = g_sheets.GetItem(COleVariant(short(1)));
g_range = g_sheet.GetRange(COleVariant("A1"), COleVariant("A5")); //设置操作范围
ret = g_range.GetValue2();
ole = &ret;
for(int i=1;i<=5;i++)
{
index[0]=i;
//COleSafeArray的引索 行
index[1]=1; //列
ole.GetElement(index,&val);
switch (val.vt)
{
case VT_BSTR:
str.Format((char*)val.bstrVal);
AfxMessageBox(str);
break;
case VT_R8:
str.Format("%2f",val.dblVal);
AfxMessageBox(str);
break;
default:
break;
}
}
g_range.ReleaseDispatch();
g_sheet.ReleaseDispatch();
g_sheets.ReleaseDispatch();
g_book.ReleaseDispatch();
g_books.ReleaseDispatch();
g_app.Quit();
g_app.ReleaseDispatch();
}
-总结
当前的这种方法,使用起来感觉速度也不是很快,仅做基础的说明,还是推荐使用C#或者VB的Office外接程序,那样更加方便快捷。
程序中如有出现任何问题和错误,请各位大大不吝指出,感谢大家的支持。
From 左右摇摆CKC