1. 对excel的保存:
1) excel合成需要如下步骤:通过MFC工程的类向导添加类,并从现有类库中选择(from a type library),在弹出的对话框中选择office的excel.exe(或者是excel.olb),这里必须是office,而不能是wps,(对应得是et.exe,而不是excel.exe)。
2) 在弹出的对话框中选择_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range,加入新类,即可达到用MFC操作excel的前提条件。
3) 然后再用相应的MFC语句生成excel表格,注意excel保存时需要添加“comdef.h”头文件。
4) 程序如下:
在对应(需要操作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("ThisIs A Excel TestProgram!"));
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();
2. 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类的操作在这里不赘述。)
COleVariantVOptional((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 existingworkbook.
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 wishto retrieve the
//data and then retrieve the data (as avariant 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 VARIANTret.
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 ofSafeArray\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<empty>");
str="";
break;
}
}
}
TRACE("\n");
m_edit1=str;
}
//Close the workbook without savingchanges
//and quit Microsoft Excel.
objBook.Close(COleVariant((short)FALSE),VOptional, VOptional);
objApp.Quit();
UpdateData(FALSE);
注解:读取程序本人操作是将excel中的信息读取出来显示到一个编辑框中。读取程序能对应读出来。亲测。具体语句望能百度详解之。