VC++操纵EXCEL的方法集

突然忘了自己要VC操作EXCEL干吗了。所以暂时收录下。记起来了再看。

=================================================

第一种方法,简单的,用CDatabase实现. 程序是一个基于对话框的,步骤:

    A,为了避免代码重复,设置下面几个全局变量(类范围的),要引入头文件<afxdb.h>

              CDatabase m_db;                     //数据库
             CString m_dbdriver;                 //要生成的EXCEL文件的目录
             char m_path[MAX_PATH];       //获取路径用的数组
               CString m_strdir;                      //包括EXCEL文件名在内的路径名.
               CString m_strsql;                    //SQL命令语句,用m_db可直接执行.

B,在OnInitDialog方法中,生成一个xls文件,并插入两条记录,可在TRY语句中进行,因为这里面要创建一张表,当再次启动程序时,会有异常发生,说表已经存在了,这时就避免了重复创建和插入.代码如下:

m_dbdriver="MICROSOFT EXCEL DRIVER (*.XLS)";
 GetCurrentDirectory(MAX_PATH,m_path);
 m_strdir=m_path;
 m_strdir+="//test.xls";             //上面初始化各个变量.
 m_strsql.Format("DRIVER={%s};DSN='''';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB="%s";DBQ=%s",m_dbdriver,m_strdir,m_strdir);
 TRY
 { 
  if (m_db.OpenEx(m_strsql,CDatabase::noOdbcDialog))
  {
   m_strsql="Create Table OdbcExl(Name Text,Age Number,Gener Text)";
   m_db.ExecuteSQL(m_strsql);
   m_strsql="Insert Into OdbcExl(Name,Age,Gener) Values('Bob',34,'Male')";
   m_db.ExecuteSQL(m_strsql);
   m_strsql="Insert Into OdbcExl(Name,Age,Gener) Values('Jane',23,'Female')";
   m_db.ExecuteSQL(m_strsql);

   m_db.Close();
  }
 
 }
 CATCH_ALL(e)
 {
 // e->ReportError();
  m_db.Close();
  return FALSE;
 }
 END_CATCH_ALL;

C,其实上面已经达到了答题人的要求,但作为一个程序,这也太不像话了,于是我又稍微加了点不值一提的东西,在对话框上输入信息,再插入到EXCEL表中去,这一切都在按下"插入"按钮后发生:

 UpdateData();

 m_strsql.Format("DRIVER={%s};DSN='''';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB="%s";DBQ=%s", m_dbdriver,m_strdir,m_strdir);

 TRY
 { 
  if (m_db.OpenEx(m_strsql,CDatabase::noOdbcDialog))
  {
   m_strsql.Format("Insert into OdbcExl(Name,Age,Gener)Values('%s',%d,'%s')",m_name,m_age,m_gener);
   m_db.ExecuteSQL(m_strsql);
  }
 }
 CATCH_ALL(e)
 {
  e->ReportError();
 // db.Close();
 }
 END_CATCH_ALL;
 m_db.Close();

可以说,只要对CDatabase稍有了解,对SQL语句稍有了解,这个问题就很容易解决,如果要说这是一个针对Excel文件操作的方法,那是因为在OpenEx初始化数据库对象(不是"打开"哦)时用的文件后缀名为.xls而已,我们可以像在普通的数据库中一样进行其他操作,如用SELECT语句来读取EXCEL文件的内容等, 第一种方法完.

下面是第二种方法,这里涉及的原理要复杂一些了,传说中的OLE(对象链接与嵌入)技术在这里用上了,EXCEL.EXE作为一个组件服务器,应用程序作为客户端......,还是直接写过程吧,头晕晕的,只能平铺直述了.

A,从classwizard中add class处from type library,去office的安装目录下引入excel.exe(这是office 2003的选择,其他版本都是用olb文件),服务器就算引入了,这时会弹出对话框,要求加入一些类,这些类都是一些接口,里面有大量的方法,类的对象表征着excel文件的一个个部分,常用的有这几个_application,workbooks,_workbook,worksheets,_worksheet,Range,它们分别代表不同的意义._application代表了EXCEL服务器,workbooks表示整个Excel服务器(表现为一个.xls文件)里所有的表,(可以通过"新建"得到多个表,即MDI程序里的一个视窗一样,所有的视窗就是workbooks), _workbook就是一个表,相当于MDI中的一个视窗, worksheets表示所有的表单,每个表都可能有很多表单(建立一个Excel文件之后,打开,可以看到有sheet1,sheet2等,所有这些sheetn就组成了worksheets), _worksheet就表示一个表单, range表示元素的集合. 搞清楚上面这几个名词的意思非常重要.

B,在dlg.h中声明下面几个变量:

 _Application exlapp;   //组件服务器的各个classes
 _Workbook wbk;
 Workbooks wbks;
 _Worksheet wht;
 Worksheets whts;
 LPDISPATCH lpDisp;
 并在app.cpp的InitInstance方法中加入下面两句AfxInitOle(); AfxEnableControlContainer();

C,这里我没有像上面一样完全用程序来生成一个Excel文件,而是在开始时就在当前目录下生成了一个Excel文件,在对话框上我设置了两个按钮,下面是"显示"按钮的代码:
 //创建Excel服务器
 if(!exlapp.CreateDispatch("Excel.Application"))
 {
  AfxMessageBox("无法启动Excel服务器!");
  return;
 }
 COleVariant  avar((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
 exlapp.SetVisible(TRUE);//使Excel可见
 exlapp.SetUserControl(TRUE);//允许其它用户控制Excel,否则Excel将一闪即逝.
 
 //Open an excel file
 char path[MAX_PATH];
 GetCurrentDirectory(MAX_PATH,path);
 CString strPath = path;
 strPath += "\VCOpExcel";

 wbks.AttachDispatch(exlapp.GetWorkbooks());
 
 lpDisp=wbks.Open(strPath,
  avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar);
 
 wbks.ReleaseDispatch();
 exlapp.ReleaseDispatch();

D,与上面第一种方法一样,可以插入记录:

 UpdateData();     //读入数据
 if (""==m_name)     //判断名字输入有效
 {
  MessageBox("Please input a right name");
  return;
 }
 if (0>=m_age||100<=m_age)  //判断年龄输入有效
 {
  MessageBox("Please input a right age");
  return;
 }

 char *p=strupr(_strdup(m_gener));
 if (strcmp(p,"FEMALE")&&strcmp(p,"MALE")) //判断性别输入有效
 {
  MessageBox("Please input a right gener");
  return;
 }
 

 Range range;
 Range usedRange;
 COleVariant  avar((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
 
 if(!exlapp.CreateDispatch("Excel.Application")) //启动服务器
 {
  AfxMessageBox("无法启动Excel服务器!");
  return;
 }
 char path[MAX_PATH];
 GetCurrentDirectory(MAX_PATH,path);
 CString strPath = path;
 strPath += "\VCOpExcel";
 wbks.AttachDispatch(exlapp.GetWorkbooks());
 lpDisp=wbks.Open(strPath,            //初始化.
  avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar);
 wbk.AttachDispatch(lpDisp);
 whts.AttachDispatch(wbk.GetWorksheets());
 lpDisp=wbk.GetActiveSheet();
 wht.AttachDispatch(lpDisp);
 
 
 
 usedRange.AttachDispatch(wht.GetUsedRange());
 range.AttachDispatch(usedRange.GetRows());
 long iRowNum=range.GetCount();//已经使用的行数
 range.AttachDispatch(wht.GetCells());
 
 range.SetItem(COleVariant(long(iRowNum+1)),COleVariant(long(1)),COleVariant(m_name));
 range.SetItem(COleVariant(long(iRowNum+1)),COleVariant(long(2)),COleVariant(m_age));
 range.SetItem(COleVariant(long(iRowNum+1)),COleVariant(long(3)),COleVariant(m_gener));
 
 wbk.Save();
 wbk.Close(avar,COleVariant(strPath),avar);
 wbks.Close();
 exlapp.Quit();

第二种方法完.

==============================================================

 

如何访问Excel文件:  
   
  1、通过ClassWizard添加相关类:  
   
  ClassWizard->MessageMaps->AddClass->From   a   type   library  
  选择文件   Program   FilesMicrosoft   OfficeOfficeExcel8.olb(没有8就有9,只要安装了Office,总会有一个)  
  在上面的列表中选择类(可以多选,不能少选)  
  _Application  
  _Workbook  
  _Worksheet  
  Workbooks  
  Worksheets  
  Range  
   
  2、引用头文件  
   
  #include   "excel8.h"  
   
  3、在应用程序或对话框初始化中调用  
   
  CoInitialize(NULL);  
   
  4、添加代码  
   
  示例代码一:  
  读一Excel文件数据,按一定格式写入文本文件  
  (说明:没有读出行数和列数,固定为99*99)  
  void   Els2Txt()  
  {  
  CString   xls="c:\test.xls";  
  CString   txt="c:\test.txt";  
  COleVariant   covOptional((long)DISP_E_PARAMNOTFOUND,   VT_ERROR);    
    操作对象、操作步骤  
  //   应用  
  _Application   oApp;  
  oApp.SetVisible(TRUE);  
  oApp.CreateDispatch("Excel.Application");  
  //   窗口  
  Workbooks   oBooks;  
  _Workbook   oBook;  
  oBooks   =   oApp.GetWorkbooks();  
  oBook   =   oBooks.Open(xls,  
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional);  
  //   表格  
  Worksheets   oSheets;  
  _Worksheet   oSheet;  
  oSheets   =   oBook.GetWorksheets();  
  oSheet   =   oSheets.GetItem(COleVariant((short)1));  
  //   数据  
  Range   oRange;  
  oRange   =   oSheet.GetCells();  
  //   字段  
          COleVariant   ItemID;  
          _Application   pApp;  
  //  
  COleVariant   row,   col,   value;  
   
  long   nRow=oRange.GetRow();  
  long   nCol=oRange.GetColumn();  
  CString   text,   temp;  
  nRow=99;  
  nCol=99;  
  BOOL   bNO;  
  int   NOCount=0;  
  CFile   file;  
  if(file.Open(txt,CFile::modeCreate|CFile::modeWrite))  
  {  
  for(int   r=1;r<=nRow&&NOCount<3;r++)  
  {  
  bNO=TRUE;  
  for(int   c=1;c<=nCol;c++)  
  {  
  row   =   (short)r;  
  col   =   (short)c;  
  ItemID   =   oRange.GetItem(row,col);  
  pApp.AttachDispatch(ItemID.pdispVal,TRUE);  
  text   =   pApp.GetValue();  
  if(text!="")  
  {  
  bNO=FALSE;  
  temp.Format(""%02d%02d",%s%c%c",r,c,text.GetBuffer(0),0x0d,0x0a);  
  //AfxMessageBox(temp);  
  file.Write(temp.GetBuffer(0),temp.GetLength());  
  }  
  }  
  if(bNO)NOCount++;  
  else   NOCount=0;  
  }  
  file.Close();  
  }  
  //    
  oApp.Quit();  
  oApp.ReleaseDispatch();  
  text.Format("处理完成:   %s",filename);  
  SetDlgItemText(IDC_EDIT4,text);  
  }  
   
  示例代码二:  
  胡乱打开一个文件,写入一些数据  
  void   Test()  
  {  
  COleVariant   covOptional((long)DISP_E_PARAMNOTFOUND,   VT_ERROR);    
  int   i,j;  
          CString   ssbuf;  
          COleVariant   x;                        
          COleVariant   y;  
          COleVariant   data;  
          COleVariant   ItemId;  
          _Application   pApp;                
          _Application   pXlsApp;  
          Workbooks   pXlsBooks;  
          Range   pXlsRange;  
   
           
          pXlsApp.CreateDispatch("Excel.Application");                  
          pXlsApp.m_bAutoRelease   =   TRUE;  
          pXlsApp.SetVisible(TRUE);                                                  
          LPDISPATCH   pWkBooks   =   pXlsApp.GetWorkbooks();                  
          CString   strFile   =   "C:\work\BOOK1.XLS";                            
          pXlsBooks.AttachDispatch(pWkBooks,TRUE);                          
          pXlsBooks.Open("c:\Book1.xls",  
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional);  
           
           
          LPDISPATCH   pCells   =   pXlsApp.GetCells();                                  
          pXlsRange.AttachDispatch(pCells,TRUE);  
   
           
          y   =   (short)1;  
          x   =   (short)1;  
          ItemId   =   pXlsRange.GetItem(y,x);                                                  
          pApp.AttachDispatch(ItemId.pdispVal,TRUE);  
          ssbuf   =   pApp.GetValue();      
   
  for(i=1;   i<11;   i++)  
  {  
  for(j=2;   j<11;   j++)  
  {  
  x   =   (short)i;  
  y   =   (short)j;  
  ssbuf.Format("%c%d",'A'+i-1,j);  
  data.SetString(ssbuf,VT_BSTR);  
  pXlsRange.SetItem(y,x,data);  
  }  
  }  
   
          pApp.DetachDispatch();                    
          pApp.ReleaseDispatch();                  
   
          pXlsRange.DetachDispatch();  
          pXlsRange.ReleaseDispatch();  
   
          pXlsBooks.Close();  
          pXlsBooks.DetachDispatch();  
          pXlsBooks.ReleaseDispatch();  
   
          pXlsApp.Quit();  
          pXlsApp.ReleaseDispatch();  
  }   
 

==================================================

 

想要通过ODBC直接读、写Excel表格文件,首先,应确保ODBC中已安装有Excel表格文件的驱动"MICROSOFT   EXCEL   DRIVER   (*.XLS)"。然后,可根据下面步骤进行:  
   
    1.   在StdAfx.h文件中加入:    
   
  #include   <afxdb.h>    
  #include   <odbcinst.h>  
   
    2.   通过ODBC直接创建Excel文件并在表中插入数据(暂定文件名:Demo.xls)   //创建并写入Excel文件  
  void   CRWExcel::WriteToExcel()  
  {  
      CDatabase   database;  
      CString   sDriver   =   "MICROSOFT   EXCEL   DRIVER   (*.XLS)";   //   Excel安装驱动  
      CString   sExcelFile   =   "c:\demo.xls";                                 //   要建立的Excel文件  
      CString   sSql;  
           
      TRY  
      {  
          //   创建进行存取的字符串  
          sSql.Format("DRIVER={%s};DSN='''';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB="%s";DBQ=%s",  
                                  sDriver,   sExcelFile,   sExcelFile);  
   
          //   创建数据库   (既Excel表格文件)  
          if(   database.OpenEx(sSql,CDatabase::noOdbcDialog)   )  
          {  
              //   创建表结构(姓名、年龄)  
              sSql   =   "CREATE   TABLE   demo   (Name   TEXT,Age   NUMBER)";  
              database.ExecuteSQL(sSql);  
   
              //   插入数值  
              sSql   =   "INSERT   INTO   demo   (Name,Age)   VALUES   (''MIKE'',26)";  
              database.ExecuteSQL(sSql);  
   
              sSql   =   "INSERT   INTO   demo   (Name,Age)   VALUES   (''TOM'',22)";  
              database.ExecuteSQL(sSql);  
   
              sSql   =   "INSERT   INTO   demo   (Name,Age)   VALUES   (''SMITH'',27)";  
              database.ExecuteSQL(sSql);  
          }              
   
          //   关闭数据库  
          database.Close();  
      }  
      CATCH_ALL(e)  
      {  
          TRACE1("Excel驱动没有安装:   %s",sDriver);  
      }  
      END_CATCH_ALL;  
  }  
   
    3.   通过ODBC直接读取Excel文件(暂定文件名:Demo.xls)   //   读取Excel文件  
  void   CRWExcel::ReadFromExcel()    
  {  
          CDatabase   database;  
          CString   sSql;  
          CString   sItem1,   sItem2;  
          CString   sDriver;  
          CString   sDsn;  
          CString   sFile   =   "Demo.xls";   //   将被读取的Excel文件名  
                                                                             
          //   检索是否安装有Excel驱动   "Microsoft   Excel   Driver   (*.xls)"    
          sDriver   =   GetExcelDriver();  
          if   (sDriver.IsEmpty())  
          {  
                  //   没有发现Excel驱动  
                  AfxMessageBox("没有安装Excel驱动!");  
                  return;  
          }  
           
          //   创建进行存取的字符串  
          sDsn.Format("ODBC;DRIVER={%s};DSN='''';DBQ=%s",   sDriver,   sFile);  
   
          TRY  
          {  
                  //   打开数据库(既Excel文件)  
                  database.Open(NULL,   false,   false,   sDsn);  
                   
                  CRecordset   recset(&database);  
   
                  //   设置读取的查询语句.  
                  sSql   =   "SELECT   Name,   Age   "                
                                "FROM   demo   "                                    
                                "ORDER   BY   Name   ";  
           
                  //   执行查询语句  
                  recset.Open(CRecordset::forwardOnly,   sSql,   CRecordset::readOnly);  
   
                  //   获取查询结果  
                  while   (!recset.IsEOF())  
                  {  
                          //读取Excel内部数值  
                          recset.GetFieldValue("Name   ",   sItem1);  
                          recset.GetFieldValue("Age",   sItem2);  
   
                          //   移到下一行  
                          recset.MoveNext();  
                  }  
   
                  //   关闭数据库  
                  database.Close();  
                                                             
          }  
          CATCH(CDBException,   e)  
          {  
                  //   数据库操作产生异常时...  
                  AfxMessageBox("数据库错误:   "   +   e->m_strError);  
          }  
          END_CATCH;  
  }  
   
    4.   获取ODBC中Excel驱动的函数   CString   CRWExcel::GetExcelDriver()  
  {  
          char   szBuf[2001];  
          WORD   cbBufMax   =   2000;  
          WORD   cbBufOut;  
          char   *pszBuf   =   szBuf;  
          CString   sDriver;  
   
          //   获取已安装驱动的名称(涵数在odbcinst.h里)  
          if   (!SQLGetInstalledDrivers(szBuf,   cbBufMax,   &cbBufOut))  
                  return   "";  
           
          //   检索已安装的驱动是否有Excel...  
          do  
          {  
                  if   (strstr(pszBuf,   "Excel")   !=   0)  
                  {  
                          //发现   !  
                          sDriver   =   CString(pszBuf);  
                          break;  
                  }  
                  pszBuf   =   strchr(pszBuf,   '''')   +   1;  
          }  
          while   (pszBuf[1]   !=   '''');  
   
          return   sDriver;  
  }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vc是指Visual C++编程语言,用于开发Windows平台下的应用程序。在VC中,可以使用Microsoft Office提供的COM对象模型来读写Excel文件。 首先,在VC中需要引入Excel的类型库,即"Microsoft Excel Object Library",这样才能使用Excel的相关功能。然后可以使用类似下面的代码来读取Excel文件: ``` #include <iostream> #include <afxdisp.h> //引入Excel库 using namespace std; int main() { // 初始化COM库 CoInitialize(NULL); // 创建Excel应用程序对象 _ApplicationPtr pExcel; pExcel.CreateInstance(__uuidof(Application)); // 打开Excel文件 _WorkbookPtr pWorkbook; pWorkbook = pExcel->Workbooks->Open(L"C:\\path\\to\\your\\excelFile.xlsx"); // 获取第一个工作表 _WorksheetPtr pSheet; pSheet = pWorkbook->Worksheets->Item[1]; // 读取单元格的数值 RangePtr pRange; pRange = pSheet->Cells->Item[1][1]; double value = pRange->Value; // 显示读取结果 cout << "单元格(1,1)的值为: " << value << endl; // 关闭Excel文件 pWorkbook->Save(); pWorkbook->Close(); // 释放资源 pExcel.Release(); CoUninitialize(); return 0; } ``` 类似地,我们也可以使用类似的方法来写入Excel文件。首先打开Excel文件,然后选择要写入的工作表和单元格,再将需要写入的数据赋值给单元格即可。例如: ``` // 写入单元格的数值 pRange = pSheet->Cells->Item[1][1]; pRange->Value = 123; // 保存并关闭Excel文件 pWorkbook->Save(); pWorkbook->Close(); ``` 上述代码只是简单示例了读写Excel文件的过程,实际应用中可能会涉及更复杂的操作,如遍历所有单元格、插入图表等。但整体的步骤和思路是相似的。通过使用VC和Excel的COM对象模型,我们可以方便地读写Excel文件,实现数据的导入和导出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值