1. 新建一个名为ExcelTest1的工程。
  2. 建立类向导,选择Automation,单击Add Class按钮,选择From a type library...,弹出文件选择对话框,之后定位到Microsoft Office的安装目录,选择EXCEL.exe,弹出Confirm Classes窗口,选择列表中_Application、_Workbook 、Workbooks 、_Worksheet、Worksheets、Rang、Font类,单击OK按钮。此时多了EXCEL.H及EXCEL.CPP两个文件。
  3. 打开stdafx.h头文件确保包含如下头文件:

#include <afxdisp.h>

#include "excel.h"

  1. 在ExcelTest1.cpp开头增加以下头文件

#include<comdef.h>  //程序里使用_variant_t需要

#include<COMUTIL.H>               

#include "shlwapi.h"//创建文件夹时需要包含该头文件与库函数

#pragma comment(lib,"shlwapi.lib") 

打开ExcelTest1.cpp文件,修改InitInstance(),加入如下代码:

BOOL CExcelTest1App::InitInstance()

{

     if( !AfxOleInit() )

{

          AfxMessageBox("初始化Ole出错!");

          return FALSE;

     }

    

}

为保证编译时不产生重复定义错误,打开excel.h文件,在文件开始位置加入如下代码:

#if !defined _HEAD_FILE_EXCEL_

#define _HEAD_FILE_EXCEL_

 相应的,在文件末尾加入:

#endif

  1. 操作EXCEL文件

1)选择ResourceView工作区,打开IDD_EXCELTEST1_DIALOG,添加如下编辑框,

使用VC++读取编辑框内容至Excel文件(从Excel读取内容至编辑框)

建立类向导,关联如下变量:

 

 使用VC++读取编辑框内容至Excel文件(从Excel读取内容至编辑框)

2)选择ResourceView工作区,打开IDD_EXCELTEST1_DIALOG,在对话框中添加一个按钮控件Button1,修改属性名为保存数据,用来保存编辑框数据到Excel。添加一个按钮控件Button2,修改属性名为读取数据,用来将Excel表格数据读取到编辑框。双击Button1,生成一个Button1 Click事件的处理函数,双击Button2,生成一个Button2 Click事件的处理函数:
 

void CExcelTest1Dlg::OnButton1() 
{
 // TODO: Add your control notification handler code here
 
}

void CExcelTest1Dlg::OnButton2() 
{
 // TODO: Add your control notification handler code here
 
}

 

(3)添加“保存数据“代码内容,在OnButton1()函数中,添加代码:
 

void CTExcelest1Dlg::OnButton1() 
{
 // TODO: Add your control notification handler code here
   _Application app;

   Workbooks books;

   _Workbook book;

   Worksheets sheets;

   _Worksheet sheet;

   Range range; //Excel中针对单元格的操作都应先获取其对应的Range对象

   Font font;

   Range cols;

 

   UpdateData(TRUE);           //更新编辑框

 

   if(m_date==""||m_jihao=="")

   {

        this->MessageBox("机号和日期不能为空!");

         return;

         }

  

   if( !app.CreateDispatch("Excel.Application") ){

         this->MessageBox("无法创建Excel应用!");

         return;

   }

   else

   {

         app.SetVisible(FALSE);     //Excel窗口不打开

         app.SetUserControl(TRUE);//并设置状态为用户可控制

         COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);  //covOptional 可选参数的VARIANT类型

         books.AttachDispatch(app.GetWorkbooks());

         book.AttachDispatch(books.Add(covOptional));

         sheets.AttachDispatch(book.GetWorksheets());

         sheet.AttachDispatch(sheets.GetItem(_variant_t("sheet1")));

         Range range;

         range.AttachDispatch(sheet.GetCells());

 

        if(!PathFileExists("C:\\data\\"))            

 //创建文件夹路径,如果不存在则创建data文件夹

            CreateDirectory("C:\\data\\",NULL);

  

         int r,c,i=1;                               //r表示行数,c表示列数

         char shuju[200][16];

         CString savePath="C:\\data\\"+m_date+"_"+m_jihao; 

//这里data存储要写入的数据,savePath为要保存的Excel文件路径

         sprintf(shuju[1],"%f",m_edit1);

         sprintf(shuju[2],"%f",m_edit2);

         sprintf(shuju[3],"%f",m_edit3);

         sprintf(shuju[4],"%f",m_edit4);

         sprintf(shuju[5],"%f",m_edit5);

         sprintf(shuju[6],"%f",m_edit6);

         sprintf(shuju[7],"%f",m_edit7);

         sprintf(shuju[8],"%f",m_edit8);

        

   range.SetItem(_variant_t((long)1), _variant_t((long)1), _variant_t("数据1"));//第一行写入标题栏

    range.SetItem(_variant_t((long)1), _variant_t((long)2), _variant_t("数据2"));

    range.SetItem(_variant_t((long)1), _variant_t((long)3), _variant_t("数据3"));

    range.SetItem(_variant_t((long)1), _variant_t((long)4), _variant_t("数据4"));

         for(r=2;r<=3;r++)

         {

              for(c=1;c<=4;c++)

      {

         range.SetItem(_variant_t((long)r), _variant_t((long)c), _variant_t(shuju[i]));//在第r行c列写入数据shuju[],注意行和列都是从1开始

         i++;

              }

         }

         book.SaveAs(COleVariant(savePath), covOptional, covOptional,

            covOptional, covOptional, covOptional, 0, covOptional,

            covOptional, covOptional, covOptional, covOptional);

         book.SetSaved(TRUE);

         range.ReleaseDispatch();

         sheet.ReleaseDispatch();

         sheets.ReleaseDispatch();

         book.ReleaseDispatch();

         books.ReleaseDispatch();

  

         app.ReleaseDispatch();

         app.Quit();

              this->MessageBox("数据保存成功!");

   }
}

(4)添加“读取数据“代码内容,在OnButton2()函数中,添加代码:
 

void CExcelTest1Dlg::OnButton2()    /////读取Excel数据////

{

   // TODO: Add your control notification handler code here

 

 

   _Application app;

   Workbooks books;

   _Workbook book;

   Worksheets sheets;

   _Worksheet sheet;

   Range range;

   LPDISPATCH lpDisp;  //接口指针

COleVariant avar((long)DISP_E_PARAMNOTFOUND,VT_ERROR);

////////////////////////////////////////////////////////////////////////////////////

CString excelPathName;              //调用打开文件对话框

CFileDialog dlg(TRUE, //TRUE为OPEN对话框,FALSE为SAVE AS对话框

                    NULL,

                    NULL,

                    OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,

                    _T("xlsx Files(*.xlsx)|*.xlsx|*.xls"), //打开xlsx文件

                    NULL);

if(dlg.DoModal()==IDOK)      //选择确定按钮保存文件路径

{

   excelPathName=dlg.GetPathName(); //文件名保存在了excelPathName里

}

else return;        //选择取消按钮就返回

 

   COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

   if( !app.CreateDispatch("Excel.Application") ){

         this->MessageBox("无法创建Excel应用!");

         return;

   }

   books=app.GetWorkbooks();

   lpDisp = books.Open(excelPathName,

        covOptional, covOptional, covOptional, covOptional,

        covOptional, covOptional, covOptional, covOptional,

        covOptional, covOptional, covOptional, covOptional,

        covOptional, covOptional

        );

   book.AttachDispatch( lpDisp );

   sheets.AttachDispatch(book.GetWorksheets());

    sheet.AttachDispatch(sheets.GetItem(_variant_t("sheet1")));

    range.AttachDispatch(sheet.GetCells());

   _variant_t var;

  //  CString tmpStr;//存储每个格子的数据

   CString shuju[200];

  

    int r,c,i=1;

   for(r=2;r<=3;r++)

   {

      for(c=1;c<=4;c++)

      {

            var =range.GetItem(_variant_t((long)r)

 ,_variant_t((long)c));         //读取第r行c列的数据,注意行和列都是从1开始

            shuju[i].Format("%s",(char*)(_bstr_t)var);//转换成CString

        i++;

 

      }

 

   }

   

//将读取的数据存入编辑框内。

   int index=excelPathName.GetLength();

   int index1=excelPathName.Find("_");           //查找“_”的位置

      CString str_date=excelPathName.Mid(3+5,index1-3-5);

   CString str_jihao=excelPathName.Mid(index1+1,index-index1-6); //取从“_”开始的n个字符

   m_edit1=(FLOAT)atof(shuju[1]);

   m_edit2=(FLOAT)atof(shuju[2]);

   m_edit3=(FLOAT)atof(shuju[3]);

   m_edit4=(FLOAT)atof(shuju[4]);

   m_edit5=(FLOAT)atof(shuju[5]);

  m_edit6= (FLOAT)atof(shuju[6]);

   m_edit7=(FLOAT)atof(shuju[7]);

   m_edit8=(FLOAT)atof(shuju[8]);

   m_date=str_date;

   m_jihao=str_jihao;

   UpdateData(FALSE);    //更新编辑框内容

   book.SetSaved(TRUE);

   app.SetUserControl(FALSE);

   book.Close(covOptional,covOptional,covOptional);

   books.Close();

   range.ReleaseDispatch();//注意释放顺序

   sheet.ReleaseDispatch();

   sheets.ReleaseDispatch();

   book.ReleaseDispatch();

   books.ReleaseDispatch();

   app.ReleaseDispatch();

     app.Quit();

     this->MessageBox("数据读取成功!");

}

相关文章: