关于利用MFC操作Excle数据(visual studio 2010,office 2007)解决办法

关于利用MFC操作Excle数据(visual studio 2010,office 2007)
表格内容就为上班时间与下班时间,算一个周总共上班时间处理,开发工具为visual studio 2010,office 2007);按照网上教程:
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();