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.pswp.cn/news/275936.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275936.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275936.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python腳本自動化盲注_三、基于報錯型注入和sql盲注的自動化實現

通過前面payload的構造&#xff0c;不難發現&#xff0c;對于報錯型注入和布爾注入(sql盲注)純手工注入的效率是非常慢的。這些payload語句雖然復雜&#xff0c;但大部分內容都是相同的&#xff0c;因此&#xff0c;一言不合就寫了個腳本自動化注入&#xff0c;坐等信息爆出的感…

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;下面我們一起來看一下吧。當垃圾回收成為主…

系統架構師學習筆記_第十一章(上)_連載

第十一章 信息安全技術 11.1 信息安全關鍵技術 11.1.1 加密和解密 有意的計算機犯罪 和 無意的數據破壞 被動攻擊&#xff1a;非法地從傳輸信道上截取信息&#xff0c;或從存儲載體上 偷竊、復制 信息。 主動攻擊&#xff1a;對傳輸或存儲的數據進行 惡意的刪除、篡改 等。 …

跨庫一致性_設計跨平臺的一致性

跨庫一致性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時冒犯了一名蘋果員工&…

React-生命周期雜記

前言 自從React發布Fiber之后&#xff0c;更新速度日新月異&#xff0c;而生命周期也隨之改變&#xff0c;雖然原有的一些生命周期函數面臨廢棄&#xff0c;但理解其背后更新的機制也是一種學習 在這里根據官方文檔以及社區上其他優秀的文章進行一個對于生命周期的總結&#xf…

漫畫 | 一個NB互聯網項目的上線過程…

大家好&#xff0c;我是若川&#xff08;點這里加我微信 ruochuan12&#xff0c;長期交流學習&#xff09;。今天雖然是周六&#xff0c;但還是要上班&#xff0c;所以就推薦一篇比較輕松的漫畫。點擊下方卡片關注我、加個星標&#xff0c;或者查看源碼等系列文章。學習源碼整體…

stm32 中斷處理級別_STM32中斷優先級徹底講解

文章來源&#xff1a;http://blog.sina.com.cn/s/blog_4fed55ce0100j7nd.html一&#xff1a;綜述STM32 目前支持的中斷共為 84 個(16 個內核68 個外部)&#xff0c; 16 級可編程中斷優先級的設置(僅使用中斷優先級設置 8bit 中的高 4 位)和16個搶占優先級(因為搶占優先級最多可…

胖子臉:庫珀·布萊克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;//......…

用委托實現窗體間傳值

1.新建一個工程.在Form1中添加一個Label和一個Button.新建一個事件類,讓它有一個string 類型的屬性,用于傳值. 1 ///ReturnValueEventArgs.cs 2 using System; 3 using System.Collections.Generic; 4 using System.Text; 5 6 namespace test 7 { 8 public class Return…

c++ explicit關鍵字_聊一聊 C++的特性 explicit 匿名空間

聊一聊 C的特性 explicit && 匿名空間explicit關鍵字首先看一下explicit的作用&#xff1a;explicit 是避免構造函數的參數自動轉換為類對象的標識符&#xff0c;平時代碼中并不是經常用到&#xff0c;但是&#xff0c;有時候就是因為這個&#xff0c;會造成一定的BUG出…

谷歌瀏覽器那些有趣的隱藏功能

大家好&#xff0c;我是若川&#xff08;點這里加我微信 ruochuan12&#xff0c;長期交流學習&#xff09;。今天推薦一篇實用文章。文末有抽獎。點擊下方卡片關注我、加個星標&#xff0c;或者查看源碼等系列文章。學習源碼整體架構系列、年度總結、JS基礎系列很多小伙伴說還是…

AppDelegate的模塊化+瘦身

前言 關于iOS的模塊化&#xff0c;要追溯到16年接觸的BeeHive了&#xff0c;BeeHive將功能模塊化&#xff0c;以module的形式進行構建&#xff0c;以performSelector&#xff1a;的形式進行module的事件響應&#xff0c;以protocol的形式進行module間的通信。可以說思路非常清晰…

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…