博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
将Excel嵌入你的.Net程序
阅读量:6038 次
发布时间:2019-06-20

本文共 5279 字,大约阅读时间需要 17 分钟。

 
 

这是一篇技术总结,主要说明在.Net情况下,将Excel嵌入我们自己的程序,并进行控制。
由于微软再一次推迟了.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事件处理程序
[C#] 复制   [保存] 保存
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控件。
[C#] 复制   [保存] 保存
object axWebBrowser = this.webBrowser1.ActiveXInstance;
然后,我们调用反射来显示工具栏
[C#] 复制   [保存] 保存
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);

http://www.mscto.com

注:如果你直接使用AxWebBrowser控件,那你就可以直接调用ExecWB方法来显示工具栏。如下:
[C#] 复制   [保存] 保存
axWebBrowser1.ExecWB(SHDocVw.OLECMDID.OLECMDID_HIDETOOLBARS, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, refmissing, refmissing)
好了,现在你需要获得你的Excel对象来操作Excel,此时需要使用Office的.Net库来完成。代码如下:
[C#] 复制   [保存] 保存
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 = "你好"; http://www.mscto.com
现在你可以随心所欲来控制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 = "你好"; http://www.mscto.com
}
这里操作更简单一点,缺点就是你必须直接使用AxWebBrowser控件,该控件比起已经封装好的WebBrowser可能有些我们所不知道的问题。微软推荐大家通过WebBrowser来访问。使用AxWebBrowser,有一个意外的收获,如下:
[C#] 复制   [保存] 保存
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来处理。呵呵,模拟菜单。
[C#] 复制   [保存] 保存
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,包括菜单,看起来就像我们自己的一样: 

可惜我们对Visual C++都不太知道如何控制。

转载于:https://www.cnblogs.com/dragonchen/archive/2011/09/23/201101_s.html

你可能感兴趣的文章
【转】keyCode对照表及JS监听组合按键
查看>>
[Java开发之路](14)反射机制
查看>>
mac gentoo-prefix安装git svn
查看>>
浅尝异步IO
查看>>
C - Train Problem II——(HDU 1023 Catalan 数)
查看>>
Speak loudly
查看>>
iOS-在项目中引入RSA算法
查看>>
[译] 听说你想学 React.js ?
查看>>
gulp压缩合并js与css
查看>>
块级、内联、内联块级
查看>>
Predicate
查看>>
[面试题记录01]实现一个function sum达到一下目的
查看>>
这个季节的忧伤,点到为止
查看>>
mysql通过配置文件进行优化
查看>>
省级网站群建设关注点
查看>>
工作第四天之采集资源
查看>>
innobackupex 在增量的基础上增量备份
查看>>
Windows Server 2012 R2 DirectAccess功能测试(2)App1服务器安装及配置
查看>>
基于清单的启动器的实现
查看>>
外网用户通过citrix打印慢的解决方法
查看>>