一步一步教你如何通过MFC操作excel
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
⼀步⼀步教你如何通过MFC操作excel
excel合成需要如下步骤:
打开MFC⼯程(任何⼯程都可以,此处以串⼝为例)
→打开MFC⼯程类向导并选择Automation
→点击Add class,并选择from a type library。
江会弹出如下浏览框
在浏览框中找到并选择office的excel.exe(或者是excel.olb),这⾥必须是office,⽽不能是wps,因为wps对应的事excel.et⽽不是exe⽂件,这⾥我选择的是excel.exe,我是⽤的是office2010,通过电脑的⽂件搜索功能定位了excel.exe的位置并添加的。
打开excel.exe之后,选择新类,如图
总共选择六个类,分别是_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range,加⼊新类,即可达到⽤MFC操作excel的前提条件。
选完之后,可在classview中看到如下六个新类。
→在My***Dlg.cpp中加⼊#include”excel.h”与#include”comdef.h”,同时,在My***.cpp中加⼊#include”excel.h”
→在My***App::InitInstance(),加⼊如下代码:
if(!AfxOleInit() ){
AfxMessageBox("初始化Ole出错!");
return FALSE;
},效果如图:
注意excel保存时需要添加“comdef.h”头⽂件。
到此为⽌,excel在MFC中的配置环境已完成。
接下来添加⼀个按键,⽤于保存成excel⽂档,按键对应的程序如下:
在对应(需要操作excel的)的CPP⽂件前加#include "comdef.h"
_Application ExcelApp;
Workbooks workbooks;
_Workbook workbook;
Worksheets sheets;
_Worksheet sheet;
Range range;
if (!ExcelApp.CreateDispatch("Excel.Application",NULL))
{
AfxMessageBox("创建Excel服务失败!");
}
//创建Excel 2000服务器(启动Excel)
ExcelApp.SetVisible(false);
workbooks.AttachDispatch(ExcelApp.GetWorkbooks(),true); //⽤来锁定对应的⼯作簿
workbook.AttachDispatch(workbooks.Add(COleVariant((_bstr_t)CString(). AllocSysString())));
//得到Worksheets
sheets.AttachDispatch(workbook.GetWorksheets(),true);
sheet.AttachDispatch(sheets.GetItem(_variant_t("Sheet1")),true);
//得到全部Cells,此时,range是cells的集合.
range.AttachDispatch(sheet.GetCells(),true);
//设置1⾏2列的单元的值
range.SetItem(_variant_t((long)1),_variant_t((long)2),_variant_t("This Is A Excel Test Program!"));
TCHAR szPath[MAX_PATH];
::GetCurrentDirectory(MAX_PATH, szPath);
CString strPath(szPath);
strPath +=_T("\\test.xlsx");
sheet.SaveAs(strPath,vtMissing,vtMissing,vtMissing,vtMissing, vtMissing,vtMissing,vtMissing,vtMissing,vtMissing); ExcelApp.SetVisible(true);
ExcelApp.ReleaseDispatch();
workbooks.ReleaseDispatch();
workbook.ReleaseDispatch();
sheets.ReleaseDispatch(); sheet.ReleaseDispatch();
Excel的数据读取:
运⽤在MSDN中的⽰例函数(具体函数见excel⽂档创建⽰例4):根据顺序,依次从系统中获取app、books、book、sheets、sheet、range、对象,然后获取路径strpath。
即可打开已有的excel⽂档。
通过定义variant格式的数据对象,得到range(单元格)的数据,再存储到COleSafeArray类型的对象之中,然后进⾏相关的处理,再显⽰到编辑框之中。
在编辑过程中,出现并解决了如下⼏个问题:
1)Getvalue()(即从单元格中获取值的函数)在excel2000以及之
前的库中没有参数,但是在excel2003即以后的库中有了参数,本例使⽤的事office2000,所以,当我⽤Getvalue()时出现编辑错误,⽤Gettext()同样出错,⽽Getvalue2()的参数情况却没有改变,只是它的返回值是⼆维数组。
2)Range.open()函数在msdn的⽰例中带有13个参数(⼀个路径,
12个VOptional,)但在实践中却是15个参数(⼀个路径参数,14个VOptional)。
否则编译出错。
3)程序中,Trace的作⽤是便于观看程序运⾏情况,可以通过调试->
停⽌调试,然后查看VCIDE窗⼝(程序运⾏报错窗⼝),则可看见Trace内容。
4)Debugview软件是⼀个专门的调试软件,可以捕获程序中由
TRACE(debug版本)和OutputDebugString输出的信息。
同样可以⽤于查看本⽰例中的Trace内容。
5)程序如下(本程序是接在excel存数之后的,所以,添加excel类
的操作在这⾥不赘述。
)
// OLE Variant for Optional.
COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
_Application objApp;
_Workbook objBook;
Workbooks objBooks;
WorkSheets objSheets;
_Worksheet objSheet;
Range objRange;
VARIANT ret;
TCHAR szPath[MAX_PATH];
::GetCurrentDirectory(MAX_PATH, szPath);
CString strPath(szPath);
strPath +=_T("\\test.xlsx");
// Instantiate Excel and open an existing workbook.
objApp.CreateDispatch("Excel.Application");
objBooks = objApp.GetWorkbooks();
objBook = objBooks.Open(strPath,
VOptional, VOptional, VOptional, VOptional,
VOptional, VOptional, VOptional, VOptional,
VOptional, VOptional, VOptional, VOptional
, VOptional, VOptional
);
objSheets = objBook.GetWorksheets();
objSheet = objSheets.GetItem(COleVariant((short)1));
//Get the range object for which you wish to retrieve the
//data and then retrieve the data (as a variant array, ret).
objRange = objSheet.GetRange(COleVariant("A1"), COleVariant("A2")); //objRange.AttachDispatch(objRange.GetItem
(COleVariant((long)2),COleVariant((long)2)).pdispVal );
// ret = objRange.GetText();
//ret = objRange.GetValue2();
ret = objRange.GetValue2();
CString str;
//Create the SAFEARRAY from the VARIANT ret.
COleSafeArray sa(ret);
//Determine the array's dimensions.
long lNumRows;
long lNumCols;
sa.GetUBound(1, &lNumRows);
sa.GetUBound(2, &lNumCols);
//Display the elements in the SAFEARRAY.
long index[2];
VARIANT val;
int r, c;
TRACE("Contents of SafeArray\n");
TRACE("=====================\n\t");
for(c=1;c<=lNumCols;c++)
{
TRACE("\t\tCol %d", c);
}
TRACE("\n");
for(r=1;r<=lNumRows;r++)
{
TRACE("Row %d", r);
for(c=1;c<=lNumCols;c++)
{
index[0]=r;
index[1]=c;
sa.GetElement(index, &val);
switch(val.vt)
{
case VT_R8:
{
TRACE("\t\t%1.2f", val.dblVal);
str.Format("%f",val.dblVal);
break;
}
case VT_BSTR:
{
TRACE("\t\t%s",(CString)val.bstrVal);
str=val.bstrVal;
break;
}
case VT_EMPTY:
{
TRACE("\t\t");
str="";
break;
}
}
}
TRACE("\n");
m_edit1=str;
}
//Close the workbook without saving changes
//and quit Microsoft Excel.
objBook.Close(COleVariant((short)FALSE), VOptional, VOptional);
objApp.Quit();
UpdateData(FALSE);
注解:读取程序本⼈操作是将excel中的信息读取出来显⽰到⼀个编辑框中。
读取程序能对应读出来。
亲测。
具体语句望能百度详解之。