zoukankan      html  css  js  c++  java
  • WinForm中使用Excel控件

    

    最近项目中要在WinForm中使用Excel控件,经过几天的研究,现在总结一下成果。

    在WinForm中使用Excel控件主要有三种方法:WebBrowser、DSOFramer、OWC。下面分别描述一下如何使用。

    一、WebBrowser

        /// -1、如何使用 WebBrowser 控件在 Visual C# 2005 或 Visual C# .NET 中打开 Office 文档
        ///     参见:http://support.microsoft.com/kb/304662/
        /// 0、尝试在 Windows Internet Explorer 7 或 Internet Explorer 8 中查看 2007 Microsoft Office 程序文档时会打开一个新的窗口
        ///     参见:http://support.microsoft.com/kb/927009/
        ///     即:运行BrowserFlags.reg注册表脚本。

        /// 1、添加控件:选择COM选项卡中的Microsoft Web Browser
        /// 2、使用控件:axWebBrowser1.Navigate(fileNme)
        /// 3、添加工具条:在axWebBrowser1_NavigateComplete2事件中添加,否则出错。
        ///     this.axWebBrowser1.ExecWB(SHDocVw.OLECMDID.OLECMDID_HIDETOOLBARS, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER);
        /// 4、获取对象:在axWebBrowser1_NavigateComplete2事件中获取。
        ///     eDocument = e.pDisp.GetType().InvokeMember("Document", BindingFlags.GetProperty, null, e.pDisp, null);
        ///     eApplication = (Excel.Application)eDocument.GetType().InvokeMember("Application", BindingFlags.GetProperty, null, eDocument, null);
        ///     eWorkbook = eApplication.ActiveWorkbook;
        /// 5、保存文件:eWorkbook.Save();
        /// 6、释放文件:释放COM对象引用

        ///     Marshal.ReleaseComObject(eWorkbook);
        ///     Marshal.ReleaseComObject(eApplication);
        ///     Marshal.ReleaseComObject(eDocument);

    后来发现,可以使用.NET的webBrowser控件,而不用添加COM选项卡中的Microsoft Web Browser。

    只是获取eApplication 对象方式不同,有两种方法获取Application对象。

    第一种其实和axWebBrowser一样

    代码
    private void LoadByActiveXInstance()
    {
    SHDocVw.WebBrowser wb
    = (SHDocVw.WebBrowser)this.webBrowser1.ActiveXInstance;
    eDocument
    = wb.Document;
    eApplication
    = (Excel.Application)eDocument.GetType().InvokeMember("Application", BindingFlags.GetProperty, null, eDocument, null);

    //添加工具条
    eWorkbook = eApplication.ActiveWorkbook; wb.ExecWB(SHDocVw.OLECMDID.OLECMDID_HIDETOOLBARS, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER);
    }

    第二种是使用COM方法获取,代码比较复杂

    代码

    private Office.CommandBar m_StandardCommandBar = null;
    /// <summary>
    /// 获取Application方式二
    /// 添加工具条方式二
    /// </summary>
    private void LoadByAPI()
    {
    // Creation of the workbook object
    if ((eWorkbook = RetrieveWorkbook(FileName)) == null) return;

    // Create the Excel.Application
    eApplication = eWorkbook.Application;
    // Creation of the standard toolbar
    m_StandardCommandBar = eApplication.CommandBars["Standard"];
    m_StandardCommandBar.Position
    = Office.MsoBarPosition.msoBarTop;
    m_StandardCommandBar.Visible
    = true;
    //foreach (Office.CommandBar bar in eApplication.CommandBars)

    // Enable the OpenFile and New buttons
    foreach (Office.CommandBarControl control in m_StandardCommandBar.Controls)
    {
    string name = control.get_accName(Missing.Value);
    if (name.Equals("Open")) ((Office.CommandBarButton)control).Enabled = false;
    if (name.Equals("Save")) ((Office.CommandBarButton)control).Enabled = false;
    }
    }

    ///此方法为COM提供的方法。可google:COM原理及应用 命名和绑定技术
    ///另所有 OLE api 和接口的目的,参见:http://support.microsoft.com/kb/126157/zh-cn
    [DllImport("ole32.dll")]
    static extern int GetRunningObjectTable(uint reserved, out IRunningObjectTable pprot);
    [DllImport(
    "ole32.dll")]
    static extern int CreateBindCtx(uint reserved, out IBindCtx pctx);

    public Excel.Workbook RetrieveWorkbook(string xlfile)
    {
    IRunningObjectTable prot
    = null;
    IEnumMoniker pmonkenum
    = null;
    try
    {
    IntPtr pfetched
    = IntPtr.Zero;
    // Query the running object table (ROT)
    if (GetRunningObjectTable(0, out prot) != 0 || prot == null) return null;
    prot.EnumRunning(
    out pmonkenum);
    pmonkenum.Reset();
    IMoniker[] monikers
    = new IMoniker[1];
    while (pmonkenum.Next(1, monikers, pfetched) == 0)
    {
    IBindCtx pctx;
    string filepathname;
    CreateBindCtx(
    0, out pctx);
    // Get the name of the file
    monikers[0].GetDisplayName(pctx, null, out filepathname);
    // Clean up
    Marshal.ReleaseComObject(pctx);
    // Search for the workbook
    // filepathname = @"file:///D:/fly/Book1.xls"
    // xlfile = @"D:\fly\Book1.xls"
    if (filepathname.IndexOf(xlfile) != -1)
    {
    object roval;
    // Get a handle on the workbook
    prot.GetObject(monikers[0], out roval);
    return roval as Excel.Workbook;
    }
    }
    }
    finally
    {
    // Clean up
    if (prot != null) Marshal.ReleaseComObject(prot);
    if (pmonkenum != null) Marshal.ReleaseComObject(pmonkenum);
    }
    return null;
    }

    另外,可以不引用COM对象,直接使用GetType().InvokeMember执行Excel操作。

    二、DSOFramer

    这种方法比较简单,感觉是对WebBrowser的封装。

        /// 需要下载DSOFramer.ocx控件。并regsvr32注册控件。
        /// 然后添加到工具箱ToolBox中使用。

    三、OWC

    需要下载并安装OWC11,添加Spreadsheet到工具箱中即可使用。

    OWC方式只能打开xml、csv、htm格式的Excel文件!!无法打开xls文件。

    附示例代码(VS2010的):https://files.cnblogs.com/xujiaoxiang/Fly_Excel_WinForm.zip

     

  • 相关阅读:
    restful架构风格设计准则(四)资源表示和资源访问
    洛谷P2178 [NOI2015]品酒大会(后缀自动机 线段树)
    HDU 6138 Fleet of the Eternal Throne(后缀自动机)
    BZOJ1278: 向量vector(计算几何 随机化乱搞)
    BZOJ2564: 集合的面积(闵可夫斯基和 凸包)
    POJ 1113 Wall(思维 计算几何 数学)
    POJ 3304 Segments(直线与线段相交)
    洛谷P1742 最小圆覆盖(计算几何)
    洛谷P4555 [国家集训队]最长双回文串(manacher 线段树)
    洛谷P3193 [HNOI2008]GT考试(dp 矩阵乘法)
  • 原文地址:https://www.cnblogs.com/xujiaoxiang/p/1797666.html
Copyright © 2011-2022 走看看