当前位置: 首页 > 工具软件 > Chimm.Excel > 使用案例 >

MFC操作excel存取数据全步骤(OLE/COM)

松茂实
2023-12-01

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,此时,rangecells的集合.
range.AttachDispatch(sheet.GetCells(),true);

//设置12列的单元的值

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类的操作在这里不赘述。)

  // OLE Variant for Optional.

      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中的信息读取出来显示到一个编辑框中。读取程序能对应读出来。亲测。具体语句望能百度详解之。


 类似资料: