软件:vs2013
程序功能:MFC读取Excel里的第一个单元格的值
步骤:
第一步:创建基于对话框的MFC工程
第二步:添加库、添加Excel类库
在工程名上右键,选择“添加”—“类”(或者点击菜单栏的“项目”->“添加类”),选择“TypeLib中的MFC类”(MFC Class From TypeLib)

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

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

第三步:修改头文件
分别将加进来的六个头文件上面的“#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
