VS2017,如何使用C++进行读取Excel中的数据,本人绝对的小白,连如何创建MFC都不太会,求各位大神指点

之前看了很多的资料,代码是看不懂只会用,有没有大神手把手教一下如何进行操作~

sql
phenix2009
白色一大坨 至少把帖子结一下吧
8 个月之前 回复
phenix2009
白色一大坨 手把手的话,在这环境怕是难了吧,而且你这一分没有的,诚意呢
8 个月之前 回复

3个回答

随便找一篇教程,按步骤加入一些插件就可以,一般是固定的流程

读取大概是以下过程,需要自己配置一下环境:


#include "CApplication.h"  
#include "CRange.h"
#include "CFont0.h"
#include "CWorkbook.h"  
#include "CWorkbooks.h"  
#include "CWorksheet.h"  
#include "CWorksheets.h"
#include <iostream>
using namespace std;
int main( )
{
    if(S_OK != CoInitialize(NULL)){
        cerr<<"Initialize com failed..."<<endl;
        return -1;
    }


    //创建,写Excel
    //定义接口类变量 
    CApplication app;
    CWorkbook book;
    CWorkbooks books;
    CWorksheet sheet;
    CWorksheets sheets;
    CRange range;
    CFont0 font;
    CRange cols;
    LPDISPATCH lpDisp;

    //打开Excel
    //开启Excel服务  
    COleVariant
        covTrue((short)TRUE),
        covFalse((short)FALSE),
        covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    if (!app.CreateDispatch(_T("Excel.Application")))
    {
        cout<<_T("无法创建Excel应用!");
        return TRUE;
    }
    books = app.get_Workbooks();

    TCHAR szFilePath[MAX_PATH + 1] = { 0 };
    GetModuleFileName(NULL, szFilePath, MAX_PATH);
    (_tcsrchr(szFilePath, _T('\\')))[1] = 0; // 删除文件名,只获得路径字串
    TCHAR xmlPath[256] = { 0 };
    sprintf_s(xmlPath, _T("%stest.xls"), szFilePath);
    //打开Excel,其中pathname为Excel表的路径名  
    lpDisp = books.Open(xmlPath, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional);
    //得到Workbook 
    book.AttachDispatch(lpDisp);
    ////获得表单集合 ,Worksheets 
    sheets = book.get_Worksheets();
    sheet = sheets.get_Item(COleVariant((short)1));
    //app.put_Visible(TRUE); //表格可见

    /*读取Excel表中的多个单元格的值,在listctrl中显示*/
    COleVariant vResult;
    //读取已经使用区域的信息,包括已经使用的行数、列数、起始行、起始列
    range.AttachDispatch(sheet.get_UsedRange());
    range.AttachDispatch(range.get_Rows());
    //取得已经使用的行数
    long iRowNum = range.get_Count();
    range.AttachDispatch(range.get_Columns());
    //取得已经使用的列数
    long iColNum = range.get_Count();
    //取得已使用区域的起始行,从1开始
    long iStartRow = range.get_Row();
    //取得已使用区域的起始列,从1开始
    long iStartCol = range.get_Column();


    for (int i = iStartRow; i <= iRowNum; i++)
    {
        for (int j = iStartCol; j <= iColNum; j++)
        {
            //读取单元格的值
            range.AttachDispatch(sheet.get_Cells());
            range.AttachDispatch(range.get_Item(COleVariant((long)i),
                COleVariant((long)j)).pdispVal);
            vResult = range.get_Value2();
            CString str, stry, strm, strd;
            SYSTEMTIME st;
            if (vResult.vt == VT_BSTR)     //若是字符串
            {
                str = vResult.bstrVal;
            }
            else if (vResult.vt == VT_R8) //8字节的数字
            {
                str.Format("%f", vResult.dblVal);
            }
            else if (vResult.vt == VT_DATE) //时间格式
            {
                VariantTimeToSystemTime(vResult.date, &st);
                stry.Format("%d", st.wYear);
                strm.Format("%d", st.wMonth);
                strd.Format("%d", st.wDay);
                str = stry + "-" + strm + L"-" + strd;
            }
            else if (vResult.vt == VT_EMPTY) //单元为空
            {
                str = L"";
            }
            else if (vResult.vt == VT_I4)
            {
                str.Format(_T("%ld"), (int)vResult.lVal);
            }
        }
    }

    /*释放资源*/
    range.ReleaseDispatch();
    sheet.ReleaseDispatch();
    sheets.ReleaseDispatch();
    book.ReleaseDispatch();
    books.ReleaseDispatch();
    app.Quit();
    app.ReleaseDispatch();

    return 0;
}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问