最近项目中要在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的):http://files.cnblogs.com/xujiaoxiang/Fly_Excel_WinForm.zip

 

转载于:https://www.cnblogs.com/xujiaoxiang/archive/2010/08/11/1797666.html

WinForm中使用Excel控件相关推荐

  1. c#在WinForm中重写ProgressBar控件(带%的显示)

    c#在WinForm中重写ProgressBar控件(带%的显示) 2009-05-14 13:13 #region 定义textProgressBar控件的类 namespace csPublish ...

  2. winform中使用ZedGraphControl控件做图

    winform中使用ZedGraphControl控件做图. 一些方法的总结 public class ChartEx : ZedGraph.ZedGraphControl{#region initp ...

  3. Web中无法使用Excel控件

    最近,受到微软防盗版安全机制的影响,原来web系统中的Excel控件无法使用了.测试发现由2008-10-16的补丁KB956391发起的.故,卸载该补丁后,系统正常使用Excel控件.

  4. WinForm中关于DataGridView控件的一些应用

    转载于新浪 美林居士 的博客:            blog.sina.com.cn/s/blog_797a56d20101daiw.html4 在.NET4.0中,以表格形式存储的数据通常是Dat ...

  5. Winform中使用printDocument控件打印pictureBox中的二维码照片

    场景 Winform中使用zxing和Graphics实现自定义绘制二维码布局: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1 ...

  6. winform中更新UI控件的方案介绍

    这是一个古老的话题...直入主题吧! 对winfrom的控件来说,多线程操作非常容易导致复杂且严重的bug,比如不同线程可能会因场景需要强制设置控件为不同的状态,进而引起并发.加锁.死锁.阻塞等问题. ...

  7. Winform中使用用户控件实现带行数和标尺的RichTextBox(附代码下载)

    场景 RichTextBox控件允许用户输入和编辑文本的同时提供了比普通的TextBox控件更高级的格式特征. 效果 注: 博客主页: https://blog.csdn.net/badao_lium ...

  8. 网页中嵌入Excel控件

    前提, 客户端必须装windows office Excel,我机器上装的时office 2003,如果你机器装的是office 2007只要把 object id="_obj_Excel& ...

  9. c#中显示Excel控件使用说明

    最近做一个项目,按客户需求,需要生成一些报表,OWC是比较合适的组件. 1.如何安装OWC组件 OWC是Office Web Compents的缩写,即Microsoft的Office Web组件,包 ...

最新文章

  1. android 通知取消折叠_三星折叠屏手机发布会取消背后-折叠屏真的是用户想要的吗...
  2. 人工智能产业2018年待解的三大难题
  3. python programming training(三):搜索算法
  4. 纯css用图片代替checkbox和radio,无js实现方法
  5. linux每日命令(17):which命令
  6. RPC调用链通信方法
  7. 一个图文混排问题的解决过程
  8. Find命令搜索过去一段时间内修改过的文件
  9. 一篇搞定 Redis6(完整版)
  10. Java图片压缩 - 压缩到指定大小范围
  11. Drupal7学习笔记之Theme感觉非常好转来共享啊!
  12. 惠普HP Deskjet 1180c 打印机驱动
  13. 带有en的单词有哪些_en押韵的词语
  14. 8、灰度图的腐蚀、膨胀、开闭运算、顶帽底帽
  15. Java中什么是多态?多态的优势和劣势是什么?
  16. opencv学习-高斯金字塔和拉普拉斯金字塔
  17. 2019智能手表推荐_智能手表什么牌子好,智能手表排行榜2020
  18. DENdb:human增强子数据库
  19. 支付宝 福卡 出花花卡 敬业福 的 福图片
  20. 文献中常见的表格(三线表)制作

热门文章

  1. http --- 基本认证与摘要认证
  2. 22 React高阶组件
  3. 微信小程序模仿开眼视频app(一)——视频首页、视频详情、分类
  4. 关于游戏平衡性——王者荣耀英雄伤害数值参考
  5. Oracle 变量绑定与变量窥视合集系列一
  6. 2017-5-4 进程
  7. leetcode21
  8. Hadoop2.6集群动态添加和删除数据节点
  9. ASP.NET的错误处理机制之一(概念)
  10. C程序设计语言--第五章:指针与数组