国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > 綜合 > 正文

C#用webbrowser在Form中嵌入并且操作Excel表格,如何讓他不提示是否保存并取消保存?

2024-07-21 02:26:01
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
一、首先簡(jiǎn)要回顧一下如何操作excel表  
   
      先要添加對(duì)excel的引用。選擇項(xiàng)目-〉添加引用-〉com-〉添加microsoft   excel   9.0。(不同的office講會(huì)有不同版本的dll文件)。  
        using   excel;  
        using   system.reflection;  
         
        //產(chǎn)生一個(gè)excel.application的新進(jìn)程  
        excel.application   app   =   new   excel.application();  
        if   (app   ==   null)    
        {  
          statusbar1.text   =   "error:   excel   couldn't   be   started!";  
          return   ;  
        }  
         
        app.visible   =   true;   //如果只想用程序控制該excel而不想讓用戶操作時(shí)候,可以設(shè)置為false  
        app.usercontrol   =   true;  
         
        workbooks   workbooks   =app.workbooks;  
       
        _workbook   workbook   =   workbooks.add(xlwbatemplate.xlwbatworksheet);   //根據(jù)模板產(chǎn)生新的workbook  
  //     _workbook   workbook   =   workbooks.add("c://a.xls");   //或者根據(jù)絕對(duì)路徑打開(kāi)工作簿文件a.xls  
   
        sheets   sheets   =   workbook.worksheets;  
        _worksheet   worksheet   =   (_worksheet)   sheets.get_item(1);  
        if   (worksheet   ==   null)    
        {  
          statusbar1.text   =     "error:   worksheet   ==   null";  
          return;  
        }  
   
        //   this   paragraph   puts   the   value   5   to   the   cell   g1  
        range   range1   =   worksheet.get_range("a1",   missing.value);  
        if   (range1   ==   null)    
        {  
          statusbar1.text   =     "error:   range   ==   null";  
          return;  
        }  
        const   int   ncells   =   2345;  
        range1.value2   =   ncells;  
       
  二、將excel用戶界面嵌入到自己的windows   form中  
   
              由于目前,c#和vb.net都不支持ole技術(shù)(參見(jiàn)微軟支持中心info:304562),,所以只有使用webbrowser控件來(lái)完成此功能。(以下方法參見(jiàn)微軟支持中心howto:304662)  
              1、右擊工具箱,選擇自定義工具箱,添加com組件,選擇“microsoft   web   瀏覽器”(對(duì)應(yīng)文件是/winnt/system32/shdocvw.dll),確定。在工具箱中將會(huì)出現(xiàn)文本為explorer的webbroser控件圖標(biāo)。  
              2、在form1中添加webbrowser控件。(對(duì)象名卻省是axwebbrowser1)  
              3、假定要打開(kāi)的excel文件是:   c:/a.xls。  
                string   strfilename   =   @"c:/a.xls";  
            object   refmissing   =   system.reflection.missing.value;  
            axwebbrowser1.navigate(strfilename,   ref   refmissing   ,   ref   refmissing   ,   ref   refmissing   ,   ref   refmissing);  
          值得注意的是用webbrowser控件不支持菜單合并,也就是說(shuō)無(wú)法把excel表的菜單帶入到我們的程序中。這是相對(duì)于ole實(shí)現(xiàn)方法的一大缺點(diǎn)。幸好提供了可以把工具欄添加進(jìn)來(lái)的功能,通過(guò)工具欄可以進(jìn)行許多excel專有的操作。  
            //下面這句可以將excel本身的工具調(diào)添加進(jìn)來(lái)  
          axwebbrowser1.execwb(shdocvw.olecmdid.olecmdid_hidetoolbars,   shdocvw.olecmdexecopt.olecmdexecopt_dontpromptuser,ref   refmissing   ,   ref   refmissing);  
           
  三、回到本文提出的問(wèn)題,如何操作嵌入的excel?  
   
        首先需要明白,用webbrowser“裝載”excel"表,實(shí)際上仍然是在新的進(jìn)程空間中運(yùn)行excel.exe。可以用任務(wù)管理器觀察。因此,只要我們能夠獲取excel.application對(duì)象,就能像上文一中所說(shuō)的那樣操作excel數(shù)據(jù)。  
        幸好可以通過(guò)webbrowser的方法navigatecomplete提供的事件參數(shù)e來(lái)訪問(wèn)excel.application。  
      public   void   axwebbrowser1_navigatecomplete2(object   sender,   axshdocvw.dwebbrowserevents2_navigatecomplete2event   e)  
      {  
        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);  
              //object   oname   =   o.gettype().invokemember("name",bindingflags.getproperty   ,null,oapplication,null);  
   
        //由于打開(kāi)的是excel文件,所以這里的oapplication   其實(shí)就是excel.application  
        excel.application   eapp   =(excel.application)oapplication;//這樣就可以象上文中所述來(lái)操作excel了。  
      }  
   
  四、包含該webbrowser的form退出時(shí)候,如何確保excel進(jìn)程也退出?(參見(jiàn)microsoft幫助中心kb317109)  
   
      由于webbrowser只不過(guò)是對(duì)excel表的瀏覽,而excel在單獨(dú)的進(jìn)程中運(yùn)行。所以要保證對(duì)該excel對(duì)象eapp及其相應(yīng)的所有成員變量都釋放引用,才能保證在form退出時(shí)excel進(jìn)程跟著退出。這一點(diǎn)在一個(gè)程序需要多次打開(kāi)關(guān)閉excel表時(shí)尤為重要。  
              excel.application   oapp;  
              excel.workbooks   obooks;  
              excel.workbook   obook;  
              excel.worksheet   osheet;  
              ...........  
          private   void   excelexit()  
          {  
                nar(osheet);  
                obook.close(false);  
                nar(obook);  
                nar(obooks);  
                oapp.quit();  
                nar(oapp);  
   
                debug.writeline("sleeping...");  
                system.threading.thread.sleep(5000);  
                debug.writeline("end   excel");  
          }  
      private   void   nar(object   o)  
      {  
                  try{system.runtime.interopservices.marshal.releasecomobject(o);}  
                  catch{}  
                  finally{o   =   null;}  
          }  
      經(jīng)過(guò)試驗(yàn),我發(fā)現(xiàn)除了釋放這些變量以外,必須把該axwebbroswer1也銷毀掉,excel進(jìn)程才退出。否則的話,即使讓axwebbroser1去navigate空內(nèi)容"about:blank",   excel進(jìn)程仍然不會(huì)退出。因此應(yīng)該將axwebbroser1所在的form關(guān)閉掉,或者直接調(diào)用axwebbrowser1.dispose();  
      如果還是其它問(wèn)題導(dǎo)致不能正常退出,就只有調(diào)用垃圾回收了。  
      gc.collect();  
  問(wèn)題:  
  問(wèn)題:  
  用axwebbrowser1.navigate(strfilename,   ref   refmissing   ,   ref   refmissing   ,   ref   refmissing   ,   ref   refmissing);重新打開(kāi)另一excel文件時(shí)提示是否保存,如何讓他不提示保存并且取消保存????
1樓 

up?。。。。。。。。?
2樓 

up
3樓 

obook.close(false)好象不對(duì)吧,我用了怎么老是報(bào)錯(cuò)啊  
 
4樓 

obook.close(false,type.missing,type.missing);  
  調(diào)試成功
5樓 

判斷文件是否存在,存在就刪除。
6樓 

up
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 古浪县| 元谋县| 黄山市| 平乐县| 库车县| 新竹县| 汝阳县| 天全县| 汝城县| 巢湖市| 乡城县| 昌平区| 东丰县| 东宁县| 南京市| 滁州市| 万安县| 丰城市| 大连市| 自治县| 桃园市| 华蓥市| 湟源县| 合江县| 西林县| 阜新市| 大厂| 资源县| 沈阳市| 卢龙县| 麦盖提县| 云南省| 临沧市| 花莲县| 房产| 隆安县| 黄梅县| 建瓯市| 全州县| 阜新市| 胶南市|