怎样获得excel里面的Workbooks,_Workbook,Worksheets,_Worksheet?高手指教!
我通过消息机制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




