C#操作Excel新添加右键菜单项的问题(Winform)

pinglan 2009-05-05 08:40:40
各位好!
在做用代码控制Excel的功能。比如控制打开Excel之后,用代码将Excel右键菜单新增一项“aa”,并对其定义新的方法。
看代码:
-------------------
#endregion
#region Excel support code
public ContextMenu m_RMBContextMenu = null;
Excel.Application exApp = null;
Microsoft.Office.Core.CommandBarButton cbb = null;
Microsoft.Office.Core.CommandBar t = null;
public void NewWorkbook(Excel.Workbook Wb)
{
System.Diagnostics.Debug.WriteLine("NewWorkbook");
exApp = Wb.Application;
object type = 1;
object oMissing = System.Reflection.Missing.Value;
//find the cell menu and then disable all and then add the ones we want
int cnt =
(int)exApp.CommandBars.GetType().InvokeMember("Count", System.Reflection.BindingFlags.GetProperty, null, exApp.CommandBars, new object[] { });
for (int i = 1; i <= cnt; i++)
{
t =
(Microsoft.Office.Core.CommandBar)exApp.GetType().InvokeMember("CommandBars", System.Reflection.BindingFlags.GetProperty, null, exApp, new object[] { i });
if (t.Name == "Cell")
{
t.Reset();
for (int j = 1; j <= t.Controls.Count; j++)
t.Controls[j].Visible = false;
cbb =
(Microsoft.Office.Core.CommandBarButton)t.Controls.Add(type, oMissing, oMissing, oMissing, oMissing);
break;
}
}
cbb.Caption = "Hello";
cbb.Click += new
Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler(cbb_Click);
}

private void cbb_Click(Microsoft.Office.Core.CommandBarButton Ctrl, ref bool CancelDefault)
{
Console.WriteLine("cbb_Click");
}

public void WorkbookBeforeClose(Excel.Workbook Wb, ref bool Cancel)
{
t.Reset(); //reset the menu
System.Diagnostics.Debug.WriteLine("WorkbookBeforeClose");
}

#endregion
-------------------
但近来遇到一个奇怪棘手的问题,受阻!!! 如下:
(Microsoft.Office.Core.CommandBarButton)t.Controls.Add(type, oMissing, oMissing, oMissing, oMissing);

//每次执行到这一句,代码就跳出了,也不提示出错,VBA中这句也没错,VSTO中也没错,就是在C#Winform中,执行完这句就跳出了。 而且浮动工具栏的新增不存在这个问题,仅仅针对右键菜单就出现这个问题!

高手指教!(代码来自微软官方技术支持)



...全文
395 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
pinglan 2009-05-08
  • 打赏
  • 举报
回复
/*我使用的是axWebBrowser1 控件作为容器实现嵌入效果的

//内嵌打开Excel
private void OpenExcelInForm(string strFileName)
{
eApp = new Excel.Application();
pnCellRFrmLock.Visible = false;
//eApp = new Excel.Application();
//eApp_protect = new Excel.Application();
object refmissing = System.Reflection.Missing.Value;
this.axWebBrowser1.Navigate(strFileName, ref refmissing, ref refmissing, ref refmissing, ref refmissing);
}
/// <summary>
/// 首先需要明白,用WebBrowser“装载”Excel"表,实际上仍然是在新的进程空间中运行Excel.exe。可以用任务管理器观察。因此,只要我们能够获取Excel.Application对象,就能像上文一中所说的那样操作Excel数据。
///幸好可以通过WebBrowser的方法NavigateComplete提供的事件参数e来访问Excel.Application。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void axWebBrowser1_NavigateComplete2(object sender, AxSHDocVw.DWebBrowserEvents2_NavigateComplete2Event e)
{
try
{//.OLECMDID_HIDETOOLBARS
object refmissing = System.Reflection.Missing.Value;
axWebBrowser1.ExecWB(SHDocVw.OLECMDID.OLECMDID_HIDETOOLBARS, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, ref refmissing, ref refmissing);
}
catch { }
Object o = e.pDisp;
Object oDocument = o.GetType().InvokeMember("Document", BindingFlags.GetProperty, null, o, null);
Object oApplication = o.GetType().InvokeMember("Application", BindingFlags.GetProperty, null, oDocument, null);
Object oName = o.GetType().InvokeMember("Name",BindingFlags.GetProperty ,null,oApplication,null);
string aaa = oName.ToString();
Excel.Workbook wbb = (Excel.Workbook)oDocument;
eApp = wbb.Application as Excel.ApplicationClass;//获取到eApp,可以像外部打开一样操作Excel了,支持VBA函数

workBook = eApp.Workbooks[1];
workSheet = workBook.Worksheets[1] as Excel.Worksheet;
//但是问题出在下面!!!!
Office.CommandBar oCellRCommandBar;
oCellRCommandBar = workBook.Application.CommandBars["cell"];
oCellRButton = (Office.CommandBarButton)oCellRCommandBar.Controls.Add(Office.MsoControlType.msoControlButton, oMissing, oMissing, oMissing, true);//就这句!调试就跳出,也不出错!
//但是这句在弹出操作Excel时正常,而且可以成功创建一个Excel右键菜单项!
// Set the caption and face ID.
oCellRButton.Caption = "New game1";
oCellRButton.FaceId = 1845;
}

希望高手指点!!(官方论坛有人说浏览器和Dsoframer.ocx内嵌方案属于Web,所以一些VBA方法不可用!)
十八道胡同 2009-05-05
  • 打赏
  • 举报
回复
帮顶
wts_net 2009-05-05
  • 打赏
  • 举报
回复
帮你顶一下先 ,找段代码给你!
feifeiyiwen 2009-05-05
  • 打赏
  • 举报
回复
帮顶~
zhengzeng 2009-05-05
  • 打赏
  • 举报
回复
顶顶先
南哥1207 2009-05-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 LCL_data 的回复:]
帮顶
[/Quote]
帮顶~

111,077

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧