使用VC++6.0 MFC OLE操作Excel 进行简单的读写

使用VC++6.0 MFC OLE操作Excel 进行简单的读写

- 简单的准备工作

首先保证VC++6.0在你的电脑上正确地安装,当然我们用Visual Stdio也是一样的。

然后,我们需要创建一个工程:

CreateMFC

简单设置之后,我们我们得到一个基于对话框的基本MFC程序。

CreateButton

双击Dialog上的按钮,添加上OnButtonRead()

当然写入按钮也是相同做法。

如此,我们便完成了准备工作。

- 所需求的类库

我们需要添加Office OLE操作的相关函数。

可以通过Ctrl+W方式调出类向导

getTypeLib

选择From a type library 之后,选择自己电脑的Office安装路径(我电脑的环境为Office2013,故文件名为Office15,不清楚自己电脑Office环境对应是多少的可以去网上查下)选择:Excel.exe。

selectExcel

再次进入类库选择,选择_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

猜你喜欢

转载自blog.csdn.net/llwodao/article/details/51568472
今日推荐