在这里总结下在Window下如何读取Excel表格数据,方便自己学习和使用,网上的内容呢或多或少不太详细或者有些许错误,在这里总结下使用经验。
1. 首先在你的工程中要包含Excel的数据类,而数据类的导出可以借用MFC的类向导进行添加
右键工程,选择添加 ->添加类->MFC->TypeLib中的MFC类(如图 1.1所示)

图 1.1
点击添加之后出现添加类界面,选择从文件中添加,再浏览你安装的office中Excel.exe的位置。并添加下面的文件(
如图 1.2所示)

图 1.2
然后你发现,有几个文件以及加入到你的解决方案中了,常用的几个文件是CApplication.h CFont0.h CRange.h CWorkbook.h
CWorkbooks.h CWorksheet.h CWorksheets.h
结果你编译工程后发现有一万个错误,别担心,那是因为上面的这些导出文件,导出的时候加了一句导出标记
#import "C:\\Program Files (x86)\\Microsoft Office\\Office12\\EXCEL.EXE" no_namespace
现在把导出文件的这些开头的import语句删除或者注释,你发现OK,还是有错误,不过已经很少了。
然后把CRange中的DialogBox() 接口,修改为,_DialogBox()。 OK大功告成!现在可以在你的代码中使用Excel的接口了。
在头文件中申请变量空间。不要忘记包含头文件
#include "CApplication.h" #include "CFont0.h" #include "CRange.h" #include "CWorkbook.h" #include "CWorksheet.h" #include "CWorkbooks.h" #include "CWorksheets.h" CApplication m_oExcelApp; CWorksheet m_oWorkSheet; CWorkbook m_oWorkBook; CWorkbooks m_oWorkBooks; CWorksheets m_oWorkSheets; CRange m_oCurrRange;调用代码示例:
LPDISPATCH lpDisp = NULL; COleVariant covTrue((short)TRUE); COleVariant covFalse((short)FALSE); COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); CRange oCurCell; // 创建连接 if (!m_oExcelApp.CreateDispatch(_T("Excel.Application"))) { ::MessageBox(NULL, _T("创建Excel服务失败!"), _T("错误提示!"), MB_OK | MB_ICONERROR); return; } m_oWorkBooks.AttachDispatch(m_oExcelApp.get_Workbooks()); // 打开文件 lpDisp = m_oWorkBooks.Open("文件的路径", _variant_t(vtMissing), _variant_t(vtMissing), _variant_t(vtMissing), _variant_t(vtMissing), _variant_t(vtMissing), _variant_t(vtMissing), _variant_t(vtMissing), _variant_t(vtMissing), _variant_t(vtMissing), _variant_t(vtMissing), _variant_t(vtMissing), _variant_t(vtMissing), _variant_t(vtMissing), _variant_t(vtMissing)); m_oWorkBook.AttachDispatch(lpDisp); m_oWorkSheets.AttachDispatch(m_oWorkBook.get_Worksheets()); //lpDisp = m_oWorkBook.get_ActiveSheet(); //m_oWorkSheet.AttachDispatch(lpDisp); // 获取第几个sheet表就写几 m_oWorkSheet.AttachDispatch(m_oWorkSheets.get_Item(_variant_t((long)2)), TRUE); // 获取行数和列数 CRange usedRange; CRange mRange; usedRange.AttachDispatch(m_oWorkSheet.get_UsedRange()); mRange.AttachDispatch(usedRange.get_Rows(), TRUE); int nCount = mRange.get_Count(); mRange.ReleaseDispatch(); mRange.AttachDispatch(usedRange.get_Columns(), TRUE); int nLines = mRange.get_Count(); usedRange.ReleaseDispatch(); mRange.ReleaseDispatch(); // 读取 COleVariant vResult; CString strData = ""; for (int j = 1; j <= nLines; j++) { m_oCurrRange.AttachDispatch(m_oWorkSheet.get_Cells()); m_oCurrRange.AttachDispatch(m_oCurrRange.get_Item(COleVariant((long)i), COleVariant((long)j)).pdispVal); vResult = m_oCurrRange.get_Value2(); if (vResult.vt == VT_BSTR) { strData = vResult.bstrVal; } else if (vResult.vt == VT_R8) { int nData = (int)vResult.dblVal; } else { //AfxMessageBox(_T("数据类型错误!")); } m_oCurrRange.ReleaseDispatch(); } m_oWorkBooks.Close(); m_oExcelApp.Quit(); m_oCurrRange.ReleaseDispatch(); m_oWorkSheet.ReleaseDispatch(); m_oWorkSheets.ReleaseDispatch(); m_oWorkBook.ReleaseDispatch(); m_oWorkBooks.ReleaseDispatch(); m_oExcelApp.ReleaseDispatch(); 这个是获取当前的活动项
这个是获取第几个sheet表就写几
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225532.html原文链接:https://javaforall.net
