MFC对Excel数据进行读取

本文介绍了如何使用COM组件在Visual C++环境中访问和操作Excel数据,包括读取和写入数据的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 通过com组件方式来访问excel数据
  • 打开VC编辑器,并打开类向导(快捷键CTRL+W,VS2010 CTRL+Shift+X),点击“Add Class”->”from a type library…”,再插入EXCEL9.OLB文件
  • 为了保证不会出错最好全部选中如下图
  • 这里写图片描述
  • 最后发现在工程目录下生成有excel9.h和excel9.cpp,将这两个文件拷贝到新建的工程目录下面
  • EXCEL9.OLB(excel9.h和excel9.cpp)自己可以到网上下载这里写链接内容
//com组件的初始化
*App::InitInstance()
{
    if (!AfxOleInit())
    {
        AfxMessageBox(_T("无法初始化COM的动态连接库"));
        return FALSE;
    }
}
//对excel进行数据读
COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); 
    _Application readApp;   //Excel应用程序接口
    Workbooks readBooks;    //工作薄集合
    _Workbook readBook;     //工作薄
    Worksheets readSheets;  //工作表集合
    _Worksheet readSheet;   //工作表
    Range readRange;//Excel针对单元格的操作都应先获取对应的Range对象
    VARIANT ret;
//打开已存在的工作薄
    UpdateData(TRUE);   
    if(!readApp.CreateDispatch("Excel.Application"))//判断打开Excel应用程序
    {
        AfxMessageBox(_T("无法打开工作薄!"));
        return;
    }
readApp.SetVisible(TRUE);//设置用户可见(TRUE代表打开excel)
readApp.SetUserControl(TRUE); //用户可控制
readBooks=readApp.GetWorkbooks();   //获取工作薄集合
readBook=readBooks.Open("xls的文件路径", 
    VOptional,VOptional,VOptional,
    VOptional,VOptional,VOptional,
    VOptional,VOptional,VOptional,
    VOptional,VOptional,VOptional); //打开一个工作薄
readSheets=readBook.GetWorksheets();//获取工作表集合
readSheet=readSheets.GetItem(COleVariant((short)1));//获取第一个工作表
//获取使用的行数,再获取每行的字段
Range usedRange;
usedRange.AttachDispatch(readSheet.GetUsedRange());
readRange.AttachDispatch(usedRange.GetRows());
long iRowNum=readRange.GetCount();
//获取每行的字段个数
readRange.AttachDispathc(usedRange.GetRows());
long iColumnNum=readRange.GetCount();
//通过循环来获取每一行的每个字段的值
for (int i=1;i<=iRowNum;i++)
{
    CString str;
    CString strText[13];//假设数据库建表字段共有13个

    //读取第i行第j列的单元格值
    for(int j=1;j<=iColumnNum;j++)
    {           
       readRange.AttachDispatch(readSheet.GetCells());//读取第一个单元格的值

   readRange.AttachDispatch(readRange.GetItem(COleVariant(long(i)),COleVariant(long(1))).pdispVal);
    ret=readRange.GetValue();

    if (ret.vt==VT_BSTR)    //判断是否为文本(字符串)
    {
        str=ret.bstrVal;
        strText[j-1]=str;
        AfxMessageBox(strText[j-1]);
    }
    else if (ret.vt==VT_R8)  //8字节的数字
     {
            str.Format("%f",ret.dblVal);
            AfxMessageBox(str);
     }
     else if(ret.vt==VT_DATE) //时间格式
     {
           SYSTEMTIME st;
           VariantTimeToSystemTime((long)&vet.date, &st);
           strText[j-1].Format("%d-%d-%d %d:%d:%d",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecont);
           AfxMessageBox(strText[j-1]);
     }
     else if(vet.vt==VT_EMPTY)   //单元格空的
     {
            str="";
            continue;
     } 
    }
}
readBook.Close(COleVariant((short)FALSE), VOptional, VOptional);
readApp.ReleaseDispatch();
readApp.Quit();

//以上是对excel数据进行读取
  • 将MySQL数据写入excel中
COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); 

    _Application writeApp;  //Excel应用程序接口
    Workbooks writeBooks;   //工作薄集合
    _Workbook writeBook;    //工作薄
    Worksheets writeSheets; //工作表集合
    _Worksheet writeSheet;  //工作表
    Range writeRange;       //Excel针对单元格的操作都应先获取对应的Range对象

    if(!writeApp.CreateDispatch(_T("Excel.Application",NULL)))   
    {   
        AfxMessageBox(_T("创建Excel服务失败!"));   
        return;   
    }
//加载所有工作薄
writeBooks.AttachDispatch(writeApp.GetWorkbooks(),TRUE);    
//加载工作薄 ,m_Browse表示为创建的excel文件的保存路径         
writeBook.AttachDispatch(writeBooks.Add(_variant_t(m_Browse)),TRUE);        

//加载所有的Sheet
writeSheets.AttachDispatch(writeBook.GetSheets(),TRUE);

//加载第一个Sheet                       
writeSheet.AttachDispatch(writeSheets.GetItem(_variant_t((long)1)),TRUE);   

//加载第一个Sheet的所有单元格
writeRange.AttachDispatch(writeSheet.GetCells(),TRUE);
//如果MySQL数据库中有一个三个字段(name,id,tel)的表
//插入字段名到excel中
writeRange.SetItem(_variant_t((long)1),_variant_t((long)1),_variant_t("name")); 

writeRange.SetItem(_variant_t((long)1),_variant_t((long)2),_variant_t("id"));   

writeRange.SetItem(_variant_t((long)1),_variant_t((long)3),_variant_t("tel"));   
int i=2;    //excel第一行是字段名称
CString cmd=_T("select * from changsha_order"); 

CRecordset rs(&m_db);   //用于查询的记录类
rs.Open(CRecordset::snapshot,cmd);

CString strname,strid,strtel;
while(!rs.IsEOF())
{
     //获取数据库字段的值并存入CString 中
     rs.GetFieldValue(short(0),strname);    
     rs.GetFieldValue(1,strid);
     rs.GetFieldValue(2,strtel);

 //将获取的值存入excel相应位置
    writeRange.SetItem(_variant_t((long)i),_variant_t((long)1),_variant_t(strname));  
    writeRange.SetItem(_variant_t((long)i),_variant_t((long)2),_variant_t(strid));   
    writeRange.SetItem(_variant_t((long)i),_variant_t((long)3),_variant_t(strtel));
    i++;
    rs.MoveNext();
}
//由于保存文件时aa.xls,结果在aa1.xls中,不知为何,所以删除aa.xls文件,另存为aa.xls
CFile file;   
file.Remove(m_Browse);  
writeBook.SaveAs(COleVariant(m_Browse),VOptional,  
        VOptional,VOptional,  
            VOptional,VOptional,(long)0, VOptional,VOptional,VOptional,VOptional);         //将存入的文件另存为m_Browse

writeApp.SetUserControl(TRUE);  //用户可控制
writeBook.SetSaved(TRUE);       //保存
writeApp.SetVisible(FALSE);     //TRUE代表用户可见,FALSE反之

writeRange.ReleaseDispatch();   //记得释放
writeSheet.ReleaseDispatch();   
writeSheets.ReleaseDispatch();   
writeBook.ReleaseDispatch();   
writeBooks.ReleaseDispatch();   
writeApp.ReleaseDispatch();   
writeApp.Quit();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值