在MFC程序中导入一个Excel文件

时间:2024-04-12 17:21:35

这个程序只能读取一个单元格的值,初始化这些方法是自己废了好久的力气才总结出来的,不然哪个没敲进去,错误是上百个,但是只要写上了,错误也能瞬间消失,在有些经验贴里别人说要加这个,然后我就傻乎乎的加了,结果永远都是上百个错误,也不知道自己哪里出错了,现在看来还是要多尝试出错的地方

试试将它删了,也许就好了。在MFC程序中导入一个Excel文件

操作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类中,

VARIANT DialogBox() 

VARIANT result; 
InvokeHelper(0xf5, DISPATCH_METHOD, VT_VARIANT, (void*)&result, NULL); 
return result; 
}

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

d.如果有错误,尝试在每个头文件,就是CApplication.h,CWorkSheet.h,CWorkBook.h,CWorkSheets.h,CWorkBooks.h,CRange.h,stadfx.里面加入#include<afxdisp.h>,至此初始化就完成了

然后就是具体的实施过程了

在Dlg.cp文件的开头加入#include "stdafx.h"
#include "MFCApplication1.h"
#include "MFCApplication1Dlg.h"
#include "DlgProxy.h"
#include "afxdialogex.h"

在MFC对话框里面加入一个button按钮,双击按钮进入代码,

void CMFCApplication1Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CApplication app;
CWorkbooks books;
CWorkbook book;
CWorksheets sheets;
CWorksheet sheet;
CRange range;
CRange iCell;
LPDISPATCH lpDisp;
COleVariant vResult;
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
if (!app.CreateDispatch("Excel.Application"))
{
AfxMessageBox(_T("无法启动Excel服务器!"));
return;
}
books.AttachDispatch(app.get_Workbooks());
lpDisp = books.Open("E:/GSS-5070-04L-renr.xls",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 
//如果有单元格正处于编辑状态中,此操作不能返回,会一直等待 
lpDisp = book.get_ActiveSheet();
sheet.AttachDispatch(lpDisp);
//读取第一个单元格的值 
range.AttachDispatch(sheet.get_Cells());
range.AttachDispatch(range.get_Item(COleVariant((long)2), COleVariant((long)1)).pdispVal);
/*COleVariant*/ 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));
}


/*else if(vResult.vt==VT_DATE) //时间格式
{
SYSTEMTIME st;
VariantTimeToSystemTime(&vResult.date, &st);
}
else if(vResult.vt==VT_EMPTY) //单元格空的
{
str="";
}*/
books.Close();
app.Quit(); // 退出 
//释放对象 
range.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
app.ReleaseDispatch();
OnOK();
MessageBox(str);
}

注意在编译过程中,会发现afx.h文件有大量错误,。这个经验贴也算解决了我的问题http://blog.****.net/cqltbe131421/article/details/52484751,

再来就是一些注意问题,str.Format(_T("%f", vResult.dblVal));这句一开始没有_T,因为出现错误所以去改,发现了这个帖子解决了我的问题,http://blog.****.net/xiaopang1122/article/details/53813956

好了,这个程序只能读取一个单元格的数值,我再研究研究怎么读取全部Excel里面的值吧

相关文章