开发者社区> 小麋鹿666> 正文

将Exce嵌入你的.Net程序1(转载)

简介:
+关注继续查看
 

        由于微软再一次推迟了.Net版的OLE Container Control的发布(2005版本叫ActiveDocumentControl),使我们几乎没有太多的办法来完成这个任务(你可以利用Visual C++来完成你的工作,不过该实现对技术的要求太高,大部分人不具备这个能力,因此只好作罢,最好在Visual C++基础上开发一个控件,在别的环境下调用,如果你能做这个工作,请帮帮我),只能够使用重量级的解决方案,就是利用WebBrowser控件和dsoframer.OCX来完成这个工作。

    在最新的Visual Studio 2005中,为我们提供了一个WebBrowser的封装控件,这个控件隐藏了底层的axWebBrowser控件,我们就利用WebBrowser控件来完成我们的Excel等ActiveDocument的嵌入和操作。在此之前,你需要将Office的.Net库安装到你的机器上。

1.在你的工具栏上选择WebBrowser控件,将其放到你的Form上

 

2.在Form上增加一个控件来使其加载一个Excel文件,如下:

 

Button的事件处理程序:

 private void button1_Click_1(object sender, EventArgs e)

 {

            string strFileName = @"d:"a.xls";

            Object refmissing = System.Reflection.Missing.Value;

            this.webBrowser1 .Navigate(strFileName);

            object axWebBrowser = this.webBrowser1.ActiveXInstance;

           

   }

3.增加WebBrowser的DocumentComplete事件处理程序

private void webBrowser1_DocumentCompleted_1(object sender, WebBrowserDocumentCompletedEventArgs e)

{

            Object refmissing = System.Reflection.Missing.Value;

            object[] args = new object[4];

            args[0] = SHDocVw.OLECMDID.OLECMDID_HIDETOOLBARS;

            args[1] = SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER;

            args[2] = refmissing;

            args[3] = refmissing;

 

            object axWebBrowser = this.webBrowser1.ActiveXInstance;

 

 

 

            axWebBrowser.GetType().InvokeMember("ExecWB", BindingFlags.InvokeMethod, null, axWebBrowser, args);

 

 

            object oApplication = axWebBrowser.GetType().InvokeMember("Document", BindingFlags.GetProperty, null, axWebBrowser, null);

   

            Excel.Workbook wbb = (Excel.Workbook)oApplication;

            Excel.ApplicationClass excel = wbb.Application as Excel.ApplicationClass ;

            Excel.Workbook wb = excel.Workbooks[1] ;

            Excel.Worksheet ws = wb.Worksheets[1] as Excel.Worksheet;

            ws.Cells.Font.Name = "Verdana";

            ws.Cells.Font.Size = 14;

            ws.Cells.Font.Bold = true;

            Excel.Range range = ws.Cells;

 

            Excel.Range oCell = range[10, 10] as Excel.Range ;

            oCell.Value2 = "你好";

           

 }

       这里要注意,WebBrowser加载Excel文档后,并不显示工具栏,为此我们需要使用高级一点的技术,通过反射调用底层的方法来实现,首先我们需要找到WebBrowser封装的AxWebBrowser控件。

                   object axWebBrowser = this.webBrowser1.ActiveXInstance;

然后,我们调用反射来显示工具栏

                 Object refmissing = System.Reflection.Missing.Value;

            object[] args = new object[4];

            args[0] = SHDocVw.OLECMDID.OLECMDID_HIDETOOLBARS;

            args[1] = SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER;

            args[2] = refmissing;

            args[3] = refmissing;

 

            axWebBrowser.GetType().InvokeMember("ExecWB", BindingFlags.InvokeMethod, null, axWebBrowser, args);

                     注:如果你直接使用AxWebBrowser控件,那你就可以直接调用ExecWB方法来显示工具栏。如下:

       axWebBrowser1.ExecWB(SHDocVw.OLECMDID.OLECMDID_HIDETOOLBARS, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, refmissing, refmissing)

     好了,现在你需要获得你的Excel对象来操作Excel,此时需要使用Office的.Net库来完成。代码如下:

            

object oApplication = axWebBrowser.GetType().InvokeMember("Document", BindingFlags.GetProperty, null, axWebBrowser, null);

   

          Excel.ApplicationClass excel = wbb.Application as Excel.ApplicationClass ;

            Excel.Workbook wb = excel.Workbooks[1] ;

            Excel.Worksheet ws = wb.Worksheets[1] as Excel.Worksheet;

            ws.Cells.Font.Name = "Verdana";

            ws.Cells.Font.Size = 14;

            ws.Cells.Font.Bold = true;

            Excel.Range range = ws.Cells;

 

            Excel.Range oCell = range[10, 10] as Excel.Range ;

            oCell.Value2 = "你好";

现在你可以随心所欲来控制Excel了,效果如下

    

 

说明:通过使用WebBrowser控件,是不能显示菜单栏的。

 

3.如果使用AxWebBrowser控件,那就需要处理NavigateComplete2事件,事件处理程序如下

    private void axWebBrowser_NavigateComplete2(object sender, AxSHDocVw.DWebBrowserEvents2_NavigateComplete2Event e)

        {

            Object refmissing = System.Reflection.Missing.Value;

            this.webBrowser1.ExecWB(SHDocVw.OLECMDID.OLECMDID_HIDETOOLBARS, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, ref refmissing, ref refmissing);

             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);

                ////由于打开的是excel文件,所以这里的oApplication 其实就是Excel.Application

            Excel.Application excel = (Excel.Application)oApplication;//这样就可以象上文中所述来操作Excel了。

 

            Excel.Workbook wb = excel.Workbooks[1];

            Excel.Worksheet ws = wb.Worksheets[1] as Excel.Worksheet;

            ws.Cells.Font.Name = "Verdana";

            ws.Cells.Font.Size = 14;

            ws.Cells.Font.Bold = true;

            Excel.Range range = ws.Cells;

 

            Excel.Range oCell = range[10, 10] as Excel.Range;

            oCell.Value2 = "你好";

        }

这里操作更简单一点,缺点就是你必须直接使用AxWebBrowser控件,该控件比起已经封装好的WebBrowser可能有些我们所不知道的问题。微软推荐大家通过WebBrowser来访问。使用AxWebBrowser,有一个意外的收获,如下:

      Object o = e.pDisp;

       IOleCommandTarget cmdTarget = o as IOleCommandTarget;

      Guid guidCMDGroup = new Guid("00020820-0000-0000-C000-000000000046");

      cmdTarget.Exec(ref guidCMDGroup , 1, 0, null, null);

 

通过IoleCommandTarget可以模拟如菜单命令,这样你可以自己定制菜单,然后将菜单命令发送到Excel来处理。呵呵,模拟菜单。

 public interface IOleCommandTarget

    {

        [PreserveSig()]

        int QueryStatus([In, MarshalAs(UnmanagedType.Struct)] ref Guid

           pguidCmdGroup, [MarshalAs(UnmanagedType.U4)] int cCmds,

           [In, Out] IntPtr prgCmds, [In, Out] IntPtr pCmdText);

 

        [PreserveSig()]

        int Exec(ref Guid pguidCmdGroup, uint nCmdID, uint nCmdExecOpt,

            object[] pvaIn, [In, Out, MarshalAs(UnmanagedType.LPArray)]

            object[] pvaOut);

    }

 

4.如果我们使用Visual C++我们可以获得一个完全的,嵌入式Excel,包括菜单,看起来就像我们自己的一样:

 

版权说明

  如果标题未标有<转载、转>等字则属于作者原创,欢迎转载,其版权归作者和博客园共有。
  作      者:温景良
  文章出处:http://wenjl520.cnblogs.com/  或  http://www.cnblogs.com/

posted @ 2008-12-25 17:16 温景良(Jason) Views(404) Comments(0) Edit 收藏
 

公告

hidden hit counter
 
本文转自我的程序人生博客园博客,原文链接:http://www.cnblogs.com/wenjl520/archive/2008/12/25/1362463.html,如需转载请自行联系原作者
 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
18897 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
13996 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
18431 0
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
16697 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
18106 0
+关注
385
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载