MFC读取Excel(一)

https://blog.youkuaiyun.com/cai_niaocainiao/article/details/81806928

软件:vs2013
程序功能:MFC读取Excel里的第一个单元格的值
步骤:
第一步:创建基于对话框的MFC工程
第二步:添加库、添加Excel类库
在工程名上右键,选择“添加”—“类”(或者点击菜单栏的“项目”->“添加类”),选择“TypeLib中的MFC类”(MFC Class From TypeLib)

类来源选“注册表”,在可用的类型库中选择“Microsoft Excel 12.0 Object Library<1.6>”在接口列表框中选择需要的类,在此,我们选择_Application,_Workbook,Worksheet,Range,Workbooks,Worksheets这六个就可以了。

但是有的接口里没东西,例如:

怎么办呢?不急。可以选“文件”,找到EXCEL.EXE的位置,来进行添加:(我的位置在:D:\office\Office14\EXCEL.EXE)

第三步:修改头文件
分别将加进来的六个头文件上面的“#import "C:\\Program Files\\Microsoft Office\\OFFICE11\\EXCEL.EXE" no_namespace”注释掉。

第四步:编译,修改错误
编译,会出现两个错误:

…\crange.h(335): warning C4003: “DialogBoxW”宏的实参不足

…\crange.h(335): error C2059: 语法错误:“,”

双击错误提示,定位在错误行,

    VARIANT DialogBox()

    {

         VARIANT result;

         InvokeHelper(0xf5, DISPATCH_METHOD, VT_VARIANT, (void*)&result, NULL);

         return result;

    }

将该函数名“DialogBox()”前面加“_”下划线,即“_DialogBox()”,这样就可以编译成功了。

第五步:删除对话框内容,添加对应控件
在对话框中添加“读取”按钮

第六步:代码(可以直接将代码复制运行下)
添加头文件

#include "CWorkbook.h"                //管理单个工作表
#include "CWorkbooks.h"         //统管所有的工作簿
#include "CApplication.h"          //Excel应用程序类,管理我们打开的这整个Excel应用
#include "CRange.h"               //区域类,对EXcel的大部分操作都要和这个打招呼
#include "CWorksheet.h"            //工作薄中的单个工作表
#include "CWorksheets.h"            //统管当前工作簿中的所有工作表

编写按钮的响应函数:

    HRESULT hr;     //HRESULT函数返回值
    hr = CoInitialize(NULL);  //CoInitialize用来告诉 Windows以单线程的方式创建com对象
    if (FAILED(hr))
    {
        AfxMessageBox(_T("Failed to call Coinitialize()"));
    }
 
 
 
    CFileDialog  filedlg(TRUE, L"*.xls", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, L"Xls文件 (*.xls)|*.xls");
    filedlg.m_ofn.lpstrTitle = L"打开文件";
    CString strFilePath;
    if (IDOK == filedlg.DoModal())
    {
        strFilePath = filedlg.GetPathName();
    }
    else
    {
        return;
    }
 
    CApplication app1;
    CWorkbooks books;
    CWorkbook book;
    CWorksheets sheets;
    CWorksheet sheet;
    CRange range;
    CRange iCell;
    LPDISPATCH lpDisp;
    COleVariant vResult;  //COleVariant类是对VARIANT结构的封装
    GetDlgItem(IDC_READ)->EnableWindow(FALSE);
    COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
 
 
    if (!app1.CreateDispatch(_T("Excel.Application"), NULL))
    {
        AfxMessageBox(_T("无法启动Excel服务器!"));
        return;
    }
    books.AttachDispatch(app1.get_Workbooks());
    lpDisp = books.Open(strFilePath, covOptional, covOptional,
        covOptional, covOptional, covOptional, covOptional, covOptional, 
        covOptional, covOptional, covOptional, covOptional, covOptional,
        covOptional, covOptional);
 
 
    //得到Workbook    
    book.AttachDispatch(lpDisp);
    //得到Worksheets   
    sheets.AttachDispatch(book.get_Worksheets());
    //sheet = sheets.get_Item(COleVariant((short)1));
    //得到当前活跃sheet 
    //如果有单元格正处于编辑状态中,此操作不能返回,会一直等待 
    lpDisp = book.get_ActiveSheet();
    sheet.AttachDispatch(lpDisp);
    
    //读取第一个单元格的值   
    range.AttachDispatch(sheet.get_Cells());
    range.AttachDispatch(range.get_Item(COleVariant((long)2), COleVariant((long)1)).pdispVal);   //第一变量是行,第二个变量是列,即第二行第一列
    vResult = range.get_Value2();
    CString str;
    if (vResult.vt == VT_BSTR) //字符串  
    {
        str = vResult.bstrVal;
    }
    else if (vResult.vt == VT_R8) //8字节的数字  
    {
        str.Format(_T("%f"), vResult.dblVal);
    }
 
 
    // app1.put_Visible(TRUE);
    //app1.put_UserControl(TRUE);
    books.Close();
    app1.Quit(); 
    //释放对象      
    range.ReleaseDispatch();
    sheet.ReleaseDispatch();
    sheets.ReleaseDispatch();
    book.ReleaseDispatch();
    books.ReleaseDispatch();
    app1.ReleaseDispatch();
    //OnOK();  
    MessageBox(str);
--------------------- 
作者:cai_niaocainiao 
来源:优快云 
原文:https://blog.youkuaiyun.com/cai_niaocainiao/article/details/81806928 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值