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一样

ContractedBlock.gifExpandedBlockStart.gif代码
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方法获取,代码比较复杂

 

ContractedBlock.gifExpandedBlockStart.gif代码

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/275936.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NASA公布“门户计划”,在月球轨道建立空间站进一步探索月球

门户是NASA研发一种小型的宇宙飞船的名字&#xff0c;该宇宙飞船将围绕月球轨道运行 成为宇航员临时住所和办公室。 日前&#xff0c;美国宇航局&#xff08;以下简称“NASA”&#xff09;公布了“门户计划”&#xff0c;该计划具体是指在月球轨道上建立空间站&#xff0c;以帮…

浅析Page.LoadTemplate(模板)方法动态获取绑定模板后,通过FindControl获取服务端控件的方法。...

平常使用DataList数据控件绑定数据时&#xff0c;都是在ItemTemplate项里面放入 <asp:DataList ID"list2"runat"server"><ItemTemplate><asp:HyperLink ID"hl"runat"server"></asp:HyperLink></ItemTempl…

苹果5s变砖_苹果砖的故事以及可以改进的地方

苹果5s变砖Even since I can remember I’ve always been curious about trying out all kinds of software, checking out different operating systems, and improving my own user experience through customizing them. Over the years I’ve had the opportunity to test …

学习 launch-editor 源码整体架构,探究 vue-devtools「在编辑器中打开组件」功能实现原理...

1. 前言你好&#xff0c;我是若川[1]&#xff0c;微信搜索「若川视野」关注我&#xff0c;专注前端技术分享&#xff0c;一个愿景是帮助5年内前端开阔视野走向前列的公众号。欢迎加我微信ruochuan12&#xff0c;长期交流学习。这是学习源码整体架构系列 之 launch-editor 源码&…

:传递给 left 或 substring 函数的长度参数无效。_Java函数式编码结构-好程序员

好程序员Java培训分享Java函数式编码结构&#xff0c;本文将探讨三种下一代JVM语言&#xff1a;Groovy、Scala和Clojure&#xff0c;比较并对比新的功能和范例&#xff0c;让Java开发人员对自己近期的未来发展有大体的认识&#xff0c;下面我们一起来看一下吧。当垃圾回收成为主…

跨库一致性_设计跨平台的一致性

跨库一致性I offended an Apple employee the other day when I was checking out the new iPad Pro and I told him that I was an Android phone user. Eyes rolled, jokes were made, and we agreed to disagree.前几天&#xff0c;我在检阅新iPad Pro时冒犯了一名苹果员工&…

漫画 | 一个NB互联网项目的上线过程…

大家好&#xff0c;我是若川&#xff08;点这里加我微信 ruochuan12&#xff0c;长期交流学习&#xff09;。今天虽然是周六&#xff0c;但还是要上班&#xff0c;所以就推荐一篇比较轻松的漫画。点击下方卡片关注我、加个星标&#xff0c;或者查看源码等系列文章。学习源码整体…

胖子脸:库珀·布莱克100年

In 16th century Europe, roman typefaces were the first to surpass blackletter as the preferred choice for expressing emphasis in print. True bold weight roman letters didn’t appear until the 19th century, which critics quickly coined “Fat Faces” due to …

C语言中的布尔值

C语言的布尔类型在C语言标准(C89)没有定义布尔类型&#xff0c;所以C语言判断真假时以0为假&#xff0c;非0为真。所以我们通常使用逻辑变量的做法&#xff1a; //定义一个int类型变量&#xff0c;当变量值为0时表示false&#xff0c;值为1时表示trueint flag;flag 0;//......…

c++ explicit关键字_聊一聊 C++的特性 explicit 匿名空间

聊一聊 C的特性 explicit && 匿名空间explicit关键字首先看一下explicit的作用&#xff1a;explicit 是避免构造函数的参数自动转换为类对象的标识符&#xff0c;平时代码中并不是经常用到&#xff0c;但是&#xff0c;有时候就是因为这个&#xff0c;会造成一定的BUG出…

谷歌浏览器那些有趣的隐藏功能

大家好&#xff0c;我是若川&#xff08;点这里加我微信 ruochuan12&#xff0c;长期交流学习&#xff09;。今天推荐一篇实用文章。文末有抽奖。点击下方卡片关注我、加个星标&#xff0c;或者查看源码等系列文章。学习源码整体架构系列、年度总结、JS基础系列很多小伙伴说还是…

yii mysql_Yii2框架操作数据库的方法分析【以mysql为例】

本文实例讲述了Yii2框架操作数据库的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;准备数据库DROP TABLE IF EXISTS pre_user;CREATE TABLE pre_user(id int(11) AUTO_INCREMENT PRIMARY KEY,username varchar(255) NOT NULL,password varchar(32) NOT NULL DEF…

C++接口注意

1. 用Record接口&#xff0c;要注意 Packed的区别 2. cdecl和stdcall的区别 3. C导出的函数建议用C格式stdcall导出&#xff0c;使用Def文件定义名称 4. 用VS写的API dll要注意是否引用了MFC的DLL&#xff0c;否则会使LoadLibrary失败&#xff0c;并GetLastError后返回14001 Ap…

Vue 3.1.0 的 beta 版发布

大家好&#xff0c;我是若川&#xff08;点这里加我微信 ruochuan12&#xff0c;长期交流学习&#xff09;。昨晚尤大视频号直播说到vue 3.1.0 beta版发布了&#xff0c;今天分享这篇文章。也有小伙伴可能注意到了昨晚我一直在送礼物。点击下方卡片关注我、加个星标&#xff0c…

设计模式练习_设计练习是邪恶的

设计模式练习It was the final round of interviews. Or, so the candidate thought.这是采访的最后一轮。 或者&#xff0c;所以候选人认为。 She’d spent all day interviewing in our office. As the final interviewer, I walked her out the building. She seemed confi…

morningcat2018 LearningDocs

2019独角兽企业重金招聘Python工程师标准>>> LearningDocs 学习资料与文档 JCP&#xff08;Java Community Process &#xff0c;Java社区进程 &#xff09; https://www.jcp.org/en/home/index JSR&#xff08;Java Specification Requests&#xff0c;Java规范请求…

据说 99% 的人不知道 vue-devtools 还能直接打开对应组件文件?本文原理揭秘

1. 前言你好&#xff0c;我是若川[1]&#xff0c;微信搜索「若川视野」关注我&#xff0c;专注前端技术分享&#xff0c;一个愿景是帮助5年内前端开阔视野走向前列的公众号。欢迎加我微信ruochuan12&#xff0c;长期交流学习。这是学习源码整体架构系列 之 launch-editor 源码&…

mysql 存储 事务_MYSQL 可以在存储过程里实现事务控制吗

展开全部6.7 MySQL 事务与锁定命令6.7.1 BEGIN/COMMIT/ROLLBACK 句法缺省的&#xff0c;MySQL 运行在 autocommit 模式。这就意味着&#xff0c;当你执行完一e69da5e887aa62616964757a686964616f31333361326265个更新时&#xff0c;MySQL 将立刻将更新存储到磁盘上。如果你使用…

如何忽略证书继续访问_前5个最容易被忽视的可访问性问题

如何忽略证书继续访问Accessibility is quickly becoming one of the most important aspects of the way we use the web, if not the most important. Just between 2017 and 2018, the number of federal court cases regarding web accessibility nearly tripled, signifyi…

作为前端开发,如何高效学习 TypeScript

大家好&#xff0c;我是若川。有朋友跟我说最近面试前端候选人&#xff0c;问到关于 JavaScript 的一些少见误区问题&#xff0c;候选人很多都没回答上来&#xff0c;他很诧异&#xff0c;一个从国际大厂出来的面试者&#xff0c;竟然对 JavaScript 的一些误区问题都不了解。他…