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這參數沒有作用,
那該如何下這參數, 懇請指點
謝
使用wxAutomationObject如何移動excel的工作表位置
Re: 使用wxAutomationObject如何移動excel的工作表位置
我不知道VBA是如何做到的,我不甚了解VBA
我也只会VC的办法,使用VC的DISP接口,不再是property而是method
MSDN有云:
看这里,Before和After不可同时指定,并且同是Object参数,
用VS导入Excel的类型库,找到Worksheet接口,看方法Move如下:
这样就好办了,也就意味着CallMethod方法可用,遂使用CallMethod,只要得到两个sheet即可,在一个sheet上调用Move方法,使用另一个sheet做after或者before参数即可,在你的代码的基础上改动如下:
这段代码可以解决问题,但是,会带来一个多次Release的问题,这个留给你了,相信你可以的
我也只会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.
用VS导入Excel的类型库,找到Worksheet接口,看方法Move如下:
Code: Select all
HRESULT Move (
const _variant_t & Before = vtMissing,
const _variant_t & After = vtMissing,
long lcid = 0 );
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()));
Slackware GNU/Linux x86_64
wxWidgets-3.3.0
wxWidgets-3.3.0
Re: 使用wxAutomationObject如何移動excel的工作表位置
Hi,
感謝 Kipade的指點, 可以了, 真是感謝
提到 会带来一个多次Release的问题,這是什麼,
我直接用你給的指令, 沒出現什麼問題
謝
感謝 Kipade的指點, 可以了, 真是感謝
提到 会带来一个多次Release的问题,這是什麼,
我直接用你給的指令, 沒出現什麼問題
謝
Re: 使用wxAutomationObject如何移動excel的工作表位置
这个也很好解释,看最后,我用一个com指针来构造临时变量,结果是,这个调用完成后临时变量被析构,会在当初构造的com接口上调用Release,这当然不是你想要的.因为,那个com指针都计划好了在跳出作用域是被析构.不是吗!
Slackware GNU/Linux x86_64
wxWidgets-3.3.0
wxWidgets-3.3.0
Re: 使用wxAutomationObject如何移動excel的工作表位置
Hi,Kipade
感謝您, 了解了
另再請教, PasteSpecial的用法 - 即選擇性貼上
如有CellRange1, 有一些cell是公式, 想把他的值, 貼到CellRange2, 該如何使用PasteSpecial
謝
感謝您, 了解了
另再請教, PasteSpecial的用法 - 即選擇性貼上
如有CellRange1, 有一些cell是公式, 想把他的值, 貼到CellRange2, 該如何使用PasteSpecial
謝
Re: 使用wxAutomationObject如何移動excel的工作表位置
这么说吧,你看看文档,比如MSDN里面的说法
至于到了wx这儿来了,也都是大同小异的
看看类型库里面的接口就能知道怎么调用
至于到了wx这儿来了,也都是大同小异的
看看类型库里面的接口就能知道怎么调用
Slackware GNU/Linux x86_64
wxWidgets-3.3.0
wxWidgets-3.3.0