MFC读取Excel(一)

MFC读取Excel(一)软件 vs2013 程序功能 MFC 读取 Excel 里的第一个单元格的值步骤 第一步 创建基于对话框的 MFC 工程第二步 添加库 添加 Excel 类库在工程名上右键 选择 添加 类 或者点击菜单栏的 项目 gt 添加类 选择 TypeLib 中的 MFC 类 MFCClassFrom 类来源选 注册表 在可用的类型库中选择 Microsoft

软件:vs2013

程序功能:MFC读取Excel里的第一个单元格的值

步骤:

第一步:创建基于对话框的MFC工程

第二步:添加库、添加Excel类库

在工程名上右键,选择“添加”—“类”(或者点击菜单栏的“项目”->“添加类”),选择“TypeLib中的MFC类”(MFC Class From TypeLib)

MFC读取Excel(一)

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

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

MFC读取Excel(一)

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

MFC读取Excel(一)

第三步:修改头文件

分别将加进来的六个头文件上面的“#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);

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200936.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午10:17
下一篇 2026年3月20日 上午10:17


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号