使用wxAutomationObject如何移動excel的工作表位置

这是wxWidgets论坛的中文版本。在这里,您可以用您的母语汉语讨论上面任一子论坛所涉及的所有关于wxWidgets的话题。欢迎大家参与到对有价值的帖子的中英互译工作中来!
Post Reply
frog
Earned a small fee
Earned a small fee
Posts: 16
Joined: Mon Aug 22, 2011 11:49 am

使用wxAutomationObject如何移動excel的工作表位置

Post by frog »

Hi,各位前輩
我使用wxAutomationObject來寫入讀取excel, 沒問題,
但如要移動Sheet的位置, 如原先為Shett1,Sheet2,Sheet3, 移動為Sheet3,Sheet1,Sheet2
我試的方式如下
//啓動Excel及開新檔
wxAutomationObject exl, workBooks, workbook, workSheets, sheet;
bool ret = exl.CreateInstance(wxT("Excel.Application")); // ex1為Excel, excel
ret = exl.GetObject(workBooks, wxT("Workbooks")); //workbooks為Excel中的Workbooks變數
exl.PutProperty("visible", true);
workBooks.CallMethod("open", edtFile->GetValue());
exl.GetObject(workbook, wxT("ActiveWorkbook")); //workbook為excel中的ActiveWorkbook
ret = workbook.GetObject(workSheets, wxT("Worksheets"));
ret = workSheets.GetObject(sheet , wxT("Item"), wxVariant(3));
sheet.PutProperty("move", wxVariant("Before:=Sheet(1)")); //------>就是這行在移動工作表, 但他沒移到Sheet1的前面, 而是自己產生一新的工作薄, 移到新工作薄去了
在msdn上找到這一段 : 如果您未指定 Before 或 After,則 Microsoft Office Excel 會建立一個新的活頁簿內含被移動的工作表。
所以是Before這參數沒有作用,
那該如何下這參數, 懇請指點

kipade
Earned some good credits
Earned some good credits
Posts: 126
Joined: Fri Nov 11, 2011 2:45 am
Location: China

Re: 使用wxAutomationObject如何移動excel的工作表位置

Post by kipade »

我不知道VBA是如何做到的,我不甚了解VBA
我也只会VC的办法,使用VC的DISP接口,不再是property而是method
MSDN有云:

Code: Select all

public virtual void Move (
	[OptionalAttribute] Object Before,
	[OptionalAttribute] Object After
)
Parameters
Before
The sheet before which the moved sheet will be placed. You cannot specify Before if you specify After.
After
The sheet after which the moved sheet will be placed. You cannot specify After if you specify Before.
看这里,Before和After不可同时指定,并且同是Object参数,
用VS导入Excel的类型库,找到Worksheet接口,看方法Move如下:

Code: Select all

HRESULT Move (
        const _variant_t & Before = vtMissing,
        const _variant_t & After = vtMissing,
        long lcid = 0 );
这样就好办了,也就意味着CallMethod方法可用,遂使用CallMethod,只要得到两个sheet即可,在一个sheet上调用Move方法,使用另一个sheet做after或者before参数即可,在你的代码的基础上改动如下:

Code: Select all

 wxAutomationObject exl, workBooks, workbook, workSheets, sheet,sheet2;
	bool ret = exl.CreateInstance(wxT("Excel.Application")); // ex1為Excel, excel
	ret = exl.GetObject(workBooks, wxT("Workbooks")); //workbooks為Excel中的Workbooks變數
	exl.PutProperty("visible", true);
	workBooks.CallMethod("open", wxT("edtFile->GetValue()"));
	exl.GetObject(workbook, wxT("ActiveWorkbook")); //workbook為excel中的ActiveWorkbook
	ret = workbook.GetObject(workSheets, wxT("Worksheets"));
	ret = workSheets.GetObject(sheet , wxT("Item"),1,&wxVariant(3));
	ret = workSheets.GetObject(sheet2,wxT("Item"),1,&wxVariant(1));
	//sheet.PutProperty(wxT("move"), wxVariant(L"Before:=Sheet(1)")); 
	sheet.CallMethod(wxT("Move"),wxVariant(sheet2.GetDispatchPtr()));
这段代码可以解决问题,但是,会带来一个多次Release的问题,这个留给你了,相信你可以的
Slackware GNU/Linux x86_64
wxWidgets-3.3.0
frog
Earned a small fee
Earned a small fee
Posts: 16
Joined: Mon Aug 22, 2011 11:49 am

Re: 使用wxAutomationObject如何移動excel的工作表位置

Post by frog »

Hi,
感謝 Kipade的指點, 可以了, 真是感謝
提到 会带来一个多次Release的问题,這是什麼,
我直接用你給的指令, 沒出現什麼問題

kipade
Earned some good credits
Earned some good credits
Posts: 126
Joined: Fri Nov 11, 2011 2:45 am
Location: China

Re: 使用wxAutomationObject如何移動excel的工作表位置

Post by kipade »

这个也很好解释,看最后,我用一个com指针来构造临时变量,结果是,这个调用完成后临时变量被析构,会在当初构造的com接口上调用Release,这当然不是你想要的.因为,那个com指针都计划好了在跳出作用域是被析构.不是吗!
Slackware GNU/Linux x86_64
wxWidgets-3.3.0
frog
Earned a small fee
Earned a small fee
Posts: 16
Joined: Mon Aug 22, 2011 11:49 am

Re: 使用wxAutomationObject如何移動excel的工作表位置

Post by frog »

Hi,Kipade
感謝您, 了解了
另再請教, PasteSpecial的用法 - 即選擇性貼上
如有CellRange1, 有一些cell是公式, 想把他的值, 貼到CellRange2, 該如何使用PasteSpecial

kipade
Earned some good credits
Earned some good credits
Posts: 126
Joined: Fri Nov 11, 2011 2:45 am
Location: China

Re: 使用wxAutomationObject如何移動excel的工作表位置

Post by kipade »

这么说吧,你看看文档,比如MSDN里面的说法
至于到了wx这儿来了,也都是大同小异的
看看类型库里面的接口就能知道怎么调用
Slackware GNU/Linux x86_64
wxWidgets-3.3.0
Post Reply