• 将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/

  • 相关阅读:
    第一次使用博客,有点小激动
    oracle中的分区表基本介绍
    【转】Apache Common HttpClient使用之七种武器
    利用Iterator删除List里相近或相同的对象
    [转]给开发维护大型项目的Java开发者的建议
    JavaScript中String对象的一些方法
    [转] ORA00913: 值过多
    [转]HTTP协议详解
    DOM解析xml
    C# 中的 == 和 .Equals()
  • 原文地址:https://www.cnblogs.com/wenjl520/p/1362463.html
Copyright © 2020-2023  润新知