c++在MFC框架下实现读取Excel文件

文件读取 专栏收录该内容
1 篇文章 0 订阅

 在这里总结下在Window下如何读取Excel表格数据,方便自己学习和使用,网上的内容呢或多或少不太详细或者有些许错误,在这里总结下使用经验。

1. 首先在你的工程中要包含Excel的数据类,而数据类的导出可以借用MFC的类向导进行添加

右键工程,选择添加 ->添加类->MFC->TypeLib中的MFC类(如图 1.1所示

                   图 1.1

点击添加之后出现添加类界面,选择从文件中添加,再浏览你安装的office中Excel.exe的位置。并添加下面的文件( 如图 1.2所示


          图 1.2

 然后你发现,有几个文件以及加入到你的解决方案中了,常用的几个文件是CApplication.h CFont0.h CRange.h CWorkbook.h

CWorkbooks.h CWorksheet.h CWorksheets.h

结果你编译工程后发现有一万个错误,别担心,那是因为上面的这些导出文件,导出的时候加了一句导出标记

#import "C:\\Program Files (x86)\\Microsoft Office\\Office12\\EXCEL.EXE" no_namespace

 现在把导出文件的这些开头的import语句删除或者注释,你发现OK,还是有错误,不过已经很少了。

然后把CRange中的DialogBox() 接口,修改为,_DialogBox()。 OK大功告成!现在可以在你的代码中使用Excel的接口了。

在头文件中申请变量空间。不要忘记包含头文件

#include "CApplication.h"
#include "CFont0.h"
#include "CRange.h"
#include "CWorkbook.h"
#include "CWorksheet.h"
#include "CWorkbooks.h"
#include "CWorksheets.h"

CApplication  m_oExcelApp;
CWorksheet    m_oWorkSheet;
CWorkbook     m_oWorkBook;
CWorkbooks    m_oWorkBooks;
CWorksheets   m_oWorkSheets;
CRange        m_oCurrRange;
调用代码示例:

    LPDISPATCH lpDisp = NULL;
    COleVariant covTrue((short)TRUE);
    COleVariant covFalse((short)FALSE);
    COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    CRange  oCurCell;

    // 创建连接
    if (!m_oExcelApp.CreateDispatch(_T("Excel.Application")))
    {
        ::MessageBox(NULL, _T("创建Excel服务失败!"), _T("错误提示!"), MB_OK | MB_ICONERROR);
        return;
    }

    m_oWorkBooks.AttachDispatch(m_oExcelApp.get_Workbooks());
    // 打开文件
    lpDisp = m_oWorkBooks.Open("文件的路径",
        _variant_t(vtMissing),
        _variant_t(vtMissing),
        _variant_t(vtMissing),
        _variant_t(vtMissing),
        _variant_t(vtMissing),
        _variant_t(vtMissing),
        _variant_t(vtMissing),
        _variant_t(vtMissing),
        _variant_t(vtMissing),
        _variant_t(vtMissing),
        _variant_t(vtMissing),
        _variant_t(vtMissing),
        _variant_t(vtMissing),
        _variant_t(vtMissing));

    m_oWorkBook.AttachDispatch(lpDisp);
    m_oWorkSheets.AttachDispatch(m_oWorkBook.get_Worksheets());
    //lpDisp = m_oWorkBook.get_ActiveSheet();
    //m_oWorkSheet.AttachDispatch(lpDisp);

    // 获取第几个sheet表就写几
    m_oWorkSheet.AttachDispatch(m_oWorkSheets.get_Item(_variant_t((long)2)), TRUE);

    // 获取行数和列数
    CRange usedRange;
    CRange mRange;
    usedRange.AttachDispatch(m_oWorkSheet.get_UsedRange());
    mRange.AttachDispatch(usedRange.get_Rows(), TRUE);
    int nCount = mRange.get_Count();
    mRange.ReleaseDispatch();
    mRange.AttachDispatch(usedRange.get_Columns(), TRUE);
    int nLines = mRange.get_Count();
    usedRange.ReleaseDispatch();
    mRange.ReleaseDispatch();

    // 读取
    COleVariant vResult;
    CString strData = "";
    for (int j = 1; j <= nLines; j++)
    {
        m_oCurrRange.AttachDispatch(m_oWorkSheet.get_Cells());
        m_oCurrRange.AttachDispatch(m_oCurrRange.get_Item(COleVariant((long)i), COleVariant((long)j)).pdispVal);

        vResult = m_oCurrRange.get_Value2();
        if (vResult.vt == VT_BSTR)
        {
            strData = vResult.bstrVal;
        }
        else if (vResult.vt == VT_R8)
        {
            int nData = (int)vResult.dblVal;
        }
        else
        {
            //AfxMessageBox(_T("数据类型错误!"));
        }

        m_oCurrRange.ReleaseDispatch();
    }

    m_oWorkBooks.Close();
    m_oExcelApp.Quit();

    m_oCurrRange.ReleaseDispatch();
    m_oWorkSheet.ReleaseDispatch();
    m_oWorkSheets.ReleaseDispatch();
    m_oWorkBook.ReleaseDispatch();
    m_oWorkBooks.ReleaseDispatch();
    m_oExcelApp.ReleaseDispatch();
这个是获取当前的活动项 

lpDisp = m_oWorkBook.get_ActiveSheet();
 m_oWorkSheet.AttachDispatch(lpDisp);

这个是获取第几个sheet表就写几

m_oWorkSheet.AttachDispatch(m_oWorkSheets.get_Item(_variant_t((long)(获取第几个就写几))), TRUE);

根据 VARENUM的数据类型来对读取的数据进行向对应的处理


  • 4
    点赞
  • 2
    评论
  • 13
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 2 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

大菜鸟级别

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值