zoukankan      html  css  js  c++  java
  • VS2008环境使用MFC操作读取excel文件

    1. 建立MFC工程,MDI(基于对话框),其他默认即可。

     

    2. 操作Excel文件初始化:

     

        a. project->add class->MFC class from typelib (项目->添加类->Typelib中的MFC类)导入Excel.exe,一般都在C:/Program Files/Microsoft Office/Office12路径下(即选择你的office安装路径下的excel.exe加入)

     

        b. 选中以下几项_Application,_WorkSheet,_WorkBook,WorkSheets,WorkBooks,Range,然后导入;

     

       c. 导入后自动在工程中添加CApplication,CWorkSheet,CWorkBook,CWorkSheets,CWorkBooks,CRange这些类;

     

    然后需要把这些类的头文件中的第一句话 #import ".......EXCEL.EXE" nonamespace 删除;

     

    引入之后如果编译遇到错误,Not enough actual parameters for macro 'DialogBoxW'. 让人头疼!

     

    解决方法是在CRange类中,

     

    [cpp] view plaincopy

    1. VARIANT DialogBox()  

    2. {  

    3.   VARIANT result;  

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

    5.   return result;  

    6. }  

     

     

    DialogBox()前面添加下划线变成_DialogBox(),解决了!

    3.操作excel文件

     

           资源里面选择MFC自动建立的对话框,双击打开按钮(若没有就自己做一个),然后程序会将你到对这个按钮的函数里,在函数中写如下内容: (文件是CxxxDlg.cpp  xxx是你的项目名称)

     

    [cpp] view plaincopy

    1. void Cexcel打开3Dlg::OnBnClickedOk()  

    2. {  

    3.     // TODO: 在此添加控件通知处理程序代码  

    4.     CApplication app;  

    5.     CWorkbooks books;  

    6.     CWorkbook book;  

    7.     CWorksheets sheets;  

    8.     CWorksheet sheet;  

    9.     CRange range;  

    10.     CRange iCell;  

    11.     LPDISPATCH lpDisp;  

    12.     COleVariant vResult;  

    13.     COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);  

    14.     if(!app.CreateDispatch(L"Excel.Application"))  

    15.     {  

    16.     AfxMessageBox(L"无法启动Excel服务器!");  

    17.     return;  

    18.     }  

    19.     books.AttachDispatch(app.get_Workbooks());  

    20.     lpDisp = books.Open(“d://test.xls”,covOptional, covOptional, covOptional, covOptional, covOptional,covOptional, covOptional, covOptional, covOptional, covOptional,covOptional, covOptional, covOptional,covOptional);  

    21.       

    22.     //得到Workbook  

    23.     book.AttachDispatch(lpDisp);  

    24.     //得到Worksheets  

    25.     sheets.AttachDispatch(book.get_Worksheets());  

    26.    

    27.     //得到当前活跃sheet  

    28.     //如果有单元格正处于编辑状态中,此操作不能返回,会一直等待  

    29.     lpDisp=book.get_ActiveSheet();  

    30.     sheet.AttachDispatch(lpDisp);  

    31.     //读取第一个单元格的值  

    32.     range.AttachDispatch(sheet.get_Cells());  

    33.     range.AttachDispatch(range.get_Item (COleVariant((long)2),COleVariant((long)1)).pdispVal );  

    34.     /*COleVariant*/ vResult =range.get_Value2();  

    35.     CString str;  

    36.     if(vResult.vt == VT_BSTR) //字符串  

    37.     {  

    38.     str=vResult.bstrVal;  

    39.     }  

    40.     else if (vResult.vt==VT_R8) //8字节的数字  

    41.     {  

    42.     str.Format(L"%f",vResult.dblVal);  

    43.     }  

    44.    

    45.     /*else if(vResult.vt==VT_DATE) //时间格式 

    46.     { 

    47.     SYSTEMTIME st; 

    48.     VariantTimeToSystemTime(&vResult.date, &st); 

    49.     } 

    50.     else if(vResult.vt==VT_EMPTY) //单元格空的 

    51.     { 

    52.     str=""; 

    53.     }*/    

    54.     books.Close();   

    55.     app.Quit();             // 退出  

    56.     //释放对象    

    57.     range.ReleaseDispatch();  

    58.     sheet.ReleaseDispatch();  

    59.     sheets.ReleaseDispatch();  

    60.     book.ReleaseDispatch();  

    61.     books.ReleaseDispatch();  

    62.     app.ReleaseDispatch();  

    63.     OnOK();  

    64.     MessageBox(str);  

    65. }  

     

     

     

     

     

          开始有一个教程没有如下代码(上一个代码框已包含)

    [cpp] view plaincopy

    1.         books.Close();   

    2.         app.Quit();             // 退出  

    3. //释放对象    

    4. range.ReleaseDispatch();  

    5. sheet.ReleaseDispatch();  

    6. sheets.ReleaseDispatch();  

    7. book.ReleaseDispatch();  

    8. books.ReleaseDispatch();  

    9. app.ReleaseDispatch();  

     

     

          这样会导致程序在关闭以后仍然有excel的进程存在,文件不关闭,使用以上代码后解决。

     

          另外,在这个文件的前端记得加入:

    [cpp] view plaincopy

    1. #include "CApplication.h"  

    2. #include "CRange.h"  

    3. #include "CWorkbook.h"  

    4. #include "CWorkbooks.h"  

    5. #include "CWorksheet.h"  

    6. #include "CWorksheets.h"  

     

     

         运行结果是,程序会将d:/test.xls打开,并且在对话框中输入格(1,1)的数据。

     

  • 相关阅读:
    windows的80端口被占用时的处理方法
    Ansible自动化运维工具安装与使用实例
    Tomcat的测试网页换成自己项目首页
    LeetCode 219. Contains Duplicate II
    LeetCode Contest 177
    LeetCode 217. Contains Duplicate
    LeetCode 216. Combination Sum III(DFS)
    LeetCode 215. Kth Largest Element in an Array(排序)
    Contest 176 LeetCode 1354. Construct Target Array With Multiple Sums(优先队列,递推)
    Contest 176
  • 原文地址:https://www.cnblogs.com/yaowen/p/2870756.html
Copyright © 2011-2022 走看看