CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  数据库

怎样获得excel里面的Workbooks,_Workbook,Worksheets,_Worksheet?高手指教!

楼主xupeng225(千万别编程)2005-08-01 14:32:34 在 VC/MFC / 数据库 提问

我通过消息机制hook住excel的WM_CLOSE消息,同时可以通过以下代码获得excel的_Application对象:  
  _Application   objApp;  
  Window   window;  
  Workbooks   books;    
  _Workbook   book;    
  Worksheets   sheets;    
  _Worksheet   sheet;    
  Range   rang;  
  VARIANT   ret;  
   
  if   (   CLSIDFromProgID(   OLESTR("Excel.Application"),   &clsid   )   ==   NOERROR   )  
  {  
                                  LPUNKNOWN   lpUnk;  
                                  LPDISPATCH   lpDispatch;  
                                  if   (   GetActiveObject(clsid,   NULL,   &lpUnk   )   ==   S_OK   )  
                                  {    
                                          HRESULT   hr   =   lpUnk->QueryInterface(   IID_IDispatch,   (LPVOID*)&lpDispatch   );  
                                          lpUnk->Release();  
                                          if   (   hr   ==   NOERROR   )  
                                          {  
                                                  objApp.AttachDispatch(lpDispatch,   TRUE);  
                                                  //TCHAR*   strTest   =   _T("Hook   WM_CLOSE   message   successfully!");  
                                                  //::SendMessage(gApp,   WM_SETTEXT,   0,   (LPARAM)strTest);  
                                          }  
                                  }  
  }  
  但是我应该怎么得到_Application里面的Workbooks,_Workbook,Worksheets,_Worksheet以及每个cell的值呢?我用以下的代码好像老是出错:  
  books.AttachDispatch(   objApp.GetWorkbooks(),   true   );  
  book.AttachDispatch(   books.GetItem(   _variant_t((long)1)   ),   true   );  
  sheets.AttachDispatch(   book.GetWorksheets(),   true   );  
  sheet.AttachDispatch(   sheets.GetItem(   _variant_t((long)1)),   true);  
  range.AttachDispatch(   sheet.GetCells(),   true   );  
  ret   =   range.GetItem(   _variant_t((long)1),   _variant_t((long)1)   );  
  BSTR   bstrTemp   =   ret.bstrVal;  
  不知道应该怎么写才对,请高手指教 问题点数:100、回复次数:12Top

1 楼hahu(神仙?妖怪?谢谢!)回复于 2005-08-01 17:09:54 得分 80

然后就直接通过那个objApp来获取了阿  
   
  m_pExcelApp->Workbooks  
   
  m_pExcelApp->Workbooks->Open(_bstr_t(strBookName));  
   
  m_pWorkbook   =   m_pExcelApp->ActiveWorkbook;  
   
  m_pWorkbook->ActiveSheet;  
   
  m_pWorkbook->Worksheets->Item[(long)i];Top

2 楼lixiaosan(小三)回复于 2005-08-01 17:24:21 得分 20

http://www.vckbase.com/document/viewdoc/?id=231Top

3 楼xupeng225(千万别编程)回复于 2005-08-01 20:54:06 得分 0

to:hahu   现在关键就是这个strBookName我根本不知道这个名字是什么,所以我用GetItem()来获得,就是始终不成功。Top

4 楼xupeng225(千万别编程)回复于 2005-08-01 20:56:08 得分 0

to:lixiaosan   你给的例子我也有,他通过books.open()来打开硬盘上的xls文件。我是得到了一个没有保存过的_Application,所以不能使用他的方法Top

5 楼humourHM(小鬼)回复于 2005-08-01 22:43:33 得分 0

_Application   app;  
  Workbooks   books;  
  _Workbook   book;  
  Worksheets   sheets;  
  _Worksheet   sheet;  
  Range   range;  
            //Get   a   new   workbook.  
  books   =   app.GetWorkbooks();  
  book   =   books.Add   (covOptional);  
  //Get   the   first   sheet.  
  sheets   =book.GetSheets();  
  sheet   =   sheets.GetItem(COleVariant((short)1));  
  //获得A3单元格中的数据  
  range   =   ws.GetRange(COleVariant("A3"),COleVariant("A3"));  
  VARIANT   cellvalue=range.GetValue2();//如果是数值可以用下面的方法转换,其他类型值转换略  
  double   num=atof((char   *)_bstr_t(cellvalue));Top

6 楼xupeng225(千万别编程)回复于 2005-08-02 08:44:28 得分 0

谢谢humourHM,这个方法我也试过,得到的值好像是乱码。另外一个问题是从  
  book   =   books.Add   (covOptional);  
  代码以下,excel关闭的时候总是报错,弹出Debug   error的错误,紧接着还有runtime   error。我已经把几种方法都用过了,比如用  
  book.AttachDispatch(   books.Add(   covOptional   )   );    
  同时最后我也用了  
  book.ReleaseDispatch();  
  还是这些问题。  
  我在考虑是不是因为我捕捉WM_CLOSE消息的时候,数据已经丢失了?Top

7 楼hahu(神仙?妖怪?谢谢!)回复于 2005-08-02 16:15:55 得分 0

要么就是,获取已经打开的文件  
  m_pWorkbook   =   m_pExcelApp->ActiveWorkbook;  
   
  m_pWorkbook->ActiveSheet;  
  要么就是,自己添加一个文件  
  m_pExcelApp->Workbooks->Add();  
  m_pWorkbook   =   m_pExcelApp->ActiveWorkbook;  
   
  如果这样出错,有可能是Excel在WM_CLOSE的时候,释放操作,和Hook里面对Excel的操作会有冲突Top

8 楼xupeng225(千万别编程)回复于 2005-08-03 19:48:08 得分 0

谢谢hahu(神仙?妖怪?谢谢!)   ,不过我还想请问一个问题,我的程序要实现这样的功能:在一个对话框窗口中有一个表格和一个button,点击button之后,打开一个新excel文档,我希望把窗口中的数据读到excel里面去,这个我已经实现了。然后用户可以修改excel中的数据,当关闭excel的时候,我希望把excel中的数据重新读回到原来对话框中的表格中,现在我虽然捕捉住了excel关闭的消息,但是不知道怎么把excel中的数据读回到表格中。我看到excel的API中有WorkbookEvents、AppEvents等类,就是不知道该怎么用,希望能给个思路。谢谢!Top

9 楼hahu(神仙?妖怪?谢谢!)回复于 2005-08-04 12:01:15 得分 0

WorkbookEvents、AppEvents应该是通过连接点使用的  
   
  可以参考这个范例试试看  
  http://www.codeguru.com/Cpp/COM-Tech/atl/atl/article.php/c3623/Top

10 楼xupeng225(千万别编程)回复于 2005-08-08 14:47:21 得分 0

谢谢,另外有个问题,当我们关闭excel应用程序的时候通常会弹出一个问是否保存的对话框,我怎样用程序来抑制它,不让它弹出而直接关闭excel呢?Top

11 楼hahu(神仙?妖怪?谢谢!)回复于 2005-08-09 09:40:39 得分 0

 
  没找到有什么dirty的属性,如果有的话设dirty为false就可以  
   
  找到下面一个事件  
  IAppEvents   :  
          HRESULT   WorkbookBeforeClose   (  
                  struct   _Workbook   *   Wb,  
                  VARIANT_BOOL   *   Cancel   );  
  如果是从Excel窗体上关闭的时候,就Cancel   =   true;,  
  然后post一个消息回程序窗体(直接调用可能会死循环),代码调用Save   再调用close  
  Top

12 楼xupeng225(千万别编程)回复于 2005-08-09 14:53:32 得分 0

非常感谢,平时我们都是通过打开一个已经存在的excel来编辑,比如:  
  _Application   objApp;  
  Workbooks   objBooks;  
  _Workbook   objBook;  
  objBooks.AttachDispatch(   objApp.GetWorkbooks(),   true   );  
  objBook.AttachDispatch(   objBooks.Add(   _variant_t(   _T("d:\\test.xls")   )   )   );  
  objApp.SetVisible(true);    
  如果我想新建一个excel,然后编辑的话,比如:  
  _Application   objApp;  
  Workbooks   objBooks;  
  _Workbook   objBook;  
  COleVariant   VOptional((long)DISP_E_PARAMNOTFOUND,   VT_ERROR);  
  objBooks.AttachDispatch(   objApp.GetWorkbooks(),   true   );  
  objBook.AttachDispatch(   objBooks.Add(   _variant_t(   VOptional   )   )   );  
  objApp.SetVisible(true);    
  这样打开的excel,系统会给你制定一个Workbook的名字,一般是Book1,如果当前窗口有Book1的话,系统会自动产生一个Book2。  
  现在的问题是我想指定新建一个比如Workbook为BookTest的excel,该怎样实现?Top

相关问题

  • 如何用VB设定Excel的workbook对象的worksheet数量,默认只有三个。
  • 请问怎么连接excel的workbook.
  • 怎么获得excel文件的行数
  • ado.net如何获得excel工作表名?
  • 如何获得 excel 版本?????? 急!!!!!!!!!!!!!
  • Excel问题:复制当前的WorkSheet到指定的WorkSheet之后
  • vc操作excel时,关于获得excel版本的问题
  • 100分的Excel问题:如何获得EXCEL表名
  • 用VB打开EXCEL文件后,如何让EXCEL文件获得焦点
  • 关于Excel 操作 打开WorkSheet 关闭的问题

关键词

  • excel
  • 代码
  • 数据
  • 表格
  • 消息
  • workbook
  • attachdispatch
  • objapp
  • pexcelapp
  • pworkbook

得分解答快速导航

  • 帖主:xupeng225
  • hahu
  • lixiaosan

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo