乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      .NET1.1下,使用C#自動(dòng)生成Word2003文檔(通過(guò)操作COM組件實(shí)現(xiàn)) - sh...

       冰山上的薰衣草 2010-11-20

      做了一個(gè)多月的C#生成Word文檔的工作,我從一開始的對(duì)這個(gè)一竅不通,到現(xiàn)在的順利完成了這個(gè)功能模塊,其中還是有點(diǎn)心得的。想想自己說(shuō)不定以后還會(huì)用到,于是想吧這些心得寫下來(lái),以供自己以后的學(xué)習(xí)。同時(shí)也希望對(duì)那些正在或正要編程實(shí)現(xiàn)自動(dòng)生成Word的朋友有些小小的幫助。

      對(duì)于用C#來(lái)自動(dòng)生成Word文檔來(lái)說(shuō),最大的問(wèn)題是微軟提供的所有文檔的源代碼一般都是VBA編程的,沒(méi)有C#的現(xiàn)成文檔,最多也只是一些How To文檔。顯然,VBA編程和C#是有一定區(qū)別的,VBA編程的風(fēng)格和C#是完全不同的,它有著VB編程快捷的特性,可以省略參數(shù),可以對(duì)Style對(duì)象賦值等的功能是C#所沒(méi)有的。其次,在這個(gè)任務(wù)通過(guò)Word錄制宏查看到的宏代碼也是由VB代碼顯示的,我們必須要把這些宏代碼轉(zhuǎn)換到C#代碼。所以,做這個(gè)任務(wù)的人必須先有一點(diǎn)VB的經(jīng)驗(yàn)(最起碼知道那些代碼是在干什么)。
       
      下面是我自學(xué)C#生成Word文檔的過(guò)程(首先必須安裝好Word2003和.NET2003):

      一、下載Word的VBA編程參考手冊(cè)和網(wǎng)上的在線資料
      微軟大概覺(jué)得VB用的人太少了,想大力發(fā)展之,搞得Office編程的參考手冊(cè)都是VBA編程,害的我不懂VB的人也不得不學(xué)。不過(guò)沒(méi)辦法,要做這個(gè)工作,微軟的參考手冊(cè)是不能少的,可以從http://msdn.microsoft.com/office/downloads/vba/default.aspx這個(gè)頁(yè)面中下到相應(yīng)的的Office(本人使用的是Word2003,但好像只用WordXP的參考手冊(cè))的VBA Language References(當(dāng)然這個(gè)文檔是全英文的,看她簡(jiǎn)直是我的噩夢(mèng))。沒(méi)有必要看完這個(gè)參考手冊(cè),只要搜索需要的函數(shù),然后看看就可以了。

      有了這個(gè)參考手冊(cè)是遠(yuǎn)遠(yuǎn)不夠的,我們需要去網(wǎng)上搜集大量的現(xiàn)成代碼來(lái)看看才能快速的上手。下面是一個(gè)微軟老大提供的關(guān)于C#生成Word的中文How To文檔,感覺(jué)很好,分享一下http://support.microsoft.com/search/default.aspx?query=Word&catalog=LCID%3D2052&spid=1108&qryWt=&mode=r&cus=False。當(dāng)然,微軟提供的文檔都是最基礎(chǔ)的,我們只能在需要用到這個(gè)功能的時(shí)候才只得看看一看看,很全面,但沒(méi)有一個(gè)包含所有東西的程序。所以,我們還得再在網(wǎng)上淘資料。終于我在http://www./aspnet/wordapplication.asp建議:請(qǐng)看完Michela寫的這篇文章后再看下面的我的心得,他那里介紹了怎么建立一個(gè)項(xiàng)目,如添加引用等,我就不再累贅了,有空的話都想把他的文章翻譯過(guò)來(lái) )。這個(gè)頁(yè)面里找到了我所需要的:一個(gè)封裝Word操作的類(他的Word版本好像是XP),雖然這個(gè)類的功能很少,但我們可以按照原則自己寫代碼,擴(kuò)充類庫(kù)?;镜脑瓌t是:把底層的Word操作封裝在這個(gè)類中,外層通過(guò)調(diào)用此封裝類實(shí)現(xiàn)對(duì)Word的操作。

      二、編程實(shí)現(xiàn):通過(guò)查看Word宏代碼完善自定義類庫(kù)
       
      有了這樣一個(gè)大致的框架以后,我們就可以開始用C#開始實(shí)現(xiàn)各種Word操作的功能。總的來(lái)說(shuō),這項(xiàng)工作不難,但很繁瑣(要看你對(duì)Word操作的熟悉程度)。
       
      一般情況下,自動(dòng)生成的Word文檔會(huì)有一個(gè)模板Word文件(以.dot結(jié)尾,當(dāng)然模板本身也可以是.doc的Word文檔)。在這個(gè)模板中,我們先設(shè)計(jì)好要導(dǎo)出文檔的總體框架,在那些需要插入文字的地方先做好書簽。在這個(gè)工作中,我們最常用到的就是書簽,使用書簽的好處是方便快捷,Word文檔中的差不多所有的定位都是通過(guò)書簽來(lái)完成的。為了了解一個(gè)Word操作的具體編程實(shí)現(xiàn),我們可以通過(guò)Word自帶的宏編程:在進(jìn)行想要了解的操作之前,先錄制宏,操作完后再查看剛才錄制的宏代碼,這樣我們就得到了進(jìn)行這個(gè)操作的VB編碼。如:我們需要查看Word生成一個(gè)Table表的動(dòng)作是怎樣的,我們可以先在進(jìn)行插入Table前錄制宏,然后在Word中進(jìn)行一個(gè)插入Table的操作,再停止宏,這樣我們就可以看到一個(gè)插入Table的宏代碼了。下面就是一個(gè)插入最簡(jiǎn)單的Table的宏代碼:
      Sub Macro8()
      '
      '
       Macro8 Macro
      '
       by 林輝(sharemeteor)
      '
       宏在 2005-8-19 由 MC SYSTEM 錄制
      '
          ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=2, NumColumns:= _
              
      4, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _
              wdAutoFitFixed
          
      With Selection.Tables(1)
              
      If .Style <> "網(wǎng)格型" Then
                  .Style 
      = "網(wǎng)格型"
              End If
              .ApplyStyleHeadingRows 
      = True
              .ApplyStyleLastRow 
      = True
              .ApplyStyleFirstColumn 
      = True
              .ApplyStyleLastColumn 
      = True
          
      End With
      End Sub
       
      了解這些后,我們就需要學(xué)會(huì)從VBA編程到C#實(shí)現(xiàn)之間的轉(zhuǎn)變(這是我碰到的最大難題)??偨Y(jié)下來(lái),兩者間的函數(shù)名一般是相同的,但由于VB可以缺省參數(shù)而C#不行,所以我們必須同時(shí)了解那些缺省參數(shù),并進(jìn)行合理的填充。那些在VB代碼中出現(xiàn)的參數(shù)也要進(jìn)行適當(dāng)?shù)母淖儾拍軕?yīng)用于C#中。比如打開一個(gè)Word文檔的操作吧,Word的宏代碼如下:
      Sub Macro9()
      ' Macro9 Macro
      '
       by 林輝(sharemeteor)
      '
       宏在 2005-8-19 由 MC SYSTEM 錄制
      '
          Documents.Open FileName:="test.doc", ConfirmConversions:=FalseReadOnly:= _
              
      False, AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:= _
              
      "", Revert:=False, WritePasswordDocument:="", WritePasswordTemplate:="", _
              
      Format:=wdOpenFormatAuto, XMLTransform:=""
      End Sub
      它只有11個(gè)參數(shù),但在C#里需要16個(gè)參數(shù)值(Word2003中是16個(gè)參數(shù),WordXP為15個(gè))。在C#中,Word.ApplicationClass下的Documents屬性和VB宏代碼中的Documents對(duì)等,不過(guò)你需要獲得Word.ApplicationClass的實(shí)例后才能用。
      // Open a file (the file must exists) and activate it
              public void Open( string strFileName)
              
      {
                  
      object fileName = strFileName;
                  
      object readOnly = false;
                  
      object isVisible = true;
                  
      object missing = System.Reflection.Missing.Value;

                  oDoc 
      = oWordApplic.Documents.Open(ref fileName, ref missing,ref readOnly, 
                      
      ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, 
                      
      ref missing, ref missing, ref isVisible,ref missing,ref missing,ref missing,ref missing);

                  oDoc.Activate();
              }

      缺省參數(shù)一般可以通過(guò)賦System.Reflection.Missing.Value值就可以了。而那些VB代碼中出現(xiàn)了的參數(shù),我們必須先通過(guò)查找VBA Language References參考手冊(cè)了解其具體的值(實(shí)際上這些參數(shù)都是枚舉變量,其值大多數(shù)都是Object型的整數(shù)),然后再在C#中賦予相同的Object型的整數(shù)值。需要注意的是,C#中的參數(shù)一般都是引用型的,要加ref。

      這里有些方便的小技巧,在參考手冊(cè)的Reference/Enumerations下可以找到那些參數(shù)的名稱和其值,我們可以通過(guò)直接賦整數(shù)值實(shí)現(xiàn),但在C#的Word類庫(kù)中,Word.Wd***這個(gè)枚舉量下都會(huì)有一個(gè)值和VB中的這個(gè)參數(shù)對(duì)應(yīng),所以建議用這些枚舉值進(jìn)行賦值。如VB有個(gè)參數(shù)叫wdAlignParagraphCenter,我們通過(guò)查參考手冊(cè)知道它是WdParagraphAlignment下的枚舉值,那么它在C#中的值為Word.WdParagraphAlignment.wdAlignParagraphCenter。

      三、編程中遇到的問(wèn)題及解決
      在這個(gè)工作中,碰到點(diǎn)問(wèn)題是難免的,只要你用心,相信只是的問(wèn)題,肯定可以解決的。下面是我碰到的一些問(wèn)題和我的解決辦法,希望對(duì)大家有用

      1. Style等對(duì)象不能賦值的問(wèn)題
      感覺(jué)微軟對(duì)Office的類庫(kù)的設(shè)計(jì)可能存在問(wèn)題,很多在VB中可以賦值的對(duì)象如Style,但在C#就是不能賦值。這引來(lái)了很多問(wèn)題,如前面的產(chǎn)生Table的宏中就有“.Style = "網(wǎng)格型"”的語(yǔ)句,這在C#中是不可能用一條等價(jià)的語(yǔ)句來(lái)實(shí)現(xiàn)的。

      這里有兩種解決辦法,一種是干脆不用Style,另一種是間接實(shí)現(xiàn)Style的賦值。

      有些地方的Style是可以被替換的,如產(chǎn)生table的宏中的Style,它的Style只不過(guò)是是定義邊框的樣式,我們可以手工定義樣式來(lái)替代Style,用下列函數(shù)實(shí)現(xiàn)產(chǎn)生一個(gè)Table:
              public void RunMacroForTable(int rows,int columns)
              
      {
                  
      object _DefaultTableBehavior = Word.WdDefaultTableBehavior.wdWord9TableBehavior;
                  
      object _AutoFitBehavior = Word.WdAutoFitBehavior.wdAutoFitFixed;
                  oWordApplic.ActiveDocument.Tables.Add(oWordApplic.Selection.Range,rows,columns,
                      
      ref _DefaultTableBehavior,ref _AutoFitBehavior);

                  Word.Table table 
      = oWordApplic.Selection.Tables[1];
      //            oWordApplic.Selection.Rows.HeightRule = Word.WdRowHeightRule.wdRowHeightAtLeast;
                  oWordApplic.Selection.Rows.Height = oWordApplic.CentimetersToPoints((float)0.75);
                  
      //            if(table.Style != "網(wǎng)格型")
                  
      //                table.Style = "網(wǎng)格型";
                  對(duì)邊框進(jìn)行定義

                  oWordApplic.Options.DefaultBorderLineStyle 
      = Word.WdLineStyle.wdLineStyleSingle;
                  oWordApplic.Options.DefaultBorderLineWidth 
      = Word.WdLineWidth.wdLineWidth150pt;
                  oWordApplic.Options.DefaultBorderColor 
      = Word.WdColor.wdColorAutomatic;

                  oWordApplic.Selection.Rows.HeadingFormat 
      = (int)Word.WdConstants.wdToggle;

                  table.Rows.Alignment 
      = Word.WdRowAlignment.wdAlignRowCenter;
              }

      但有些地方的Sytle就替換不了了,有一種方法可以間接實(shí)現(xiàn)對(duì)Style等不能在C#中賦值對(duì)象的賦值,那就是通過(guò)調(diào)用VB.NET的dll。不得不佩服微軟的.NET框架,各個(gè)語(yǔ)言間可以隨意的調(diào)用,用起來(lái)相當(dāng)之方便。
      我們可以在VB.NET下面建個(gè)函數(shù)來(lái)調(diào)用那個(gè)語(yǔ)句,然后生成dll,C#項(xiàng)目只要引用這個(gè)dll,然后調(diào)用這個(gè)dll中的函數(shù)就可以了。下面是VB.NET下對(duì)Style賦值的函數(shù)(簡(jiǎn)單吧!C#里就是死活也不行
      Public Sub SetStyle(ByVal header As StringByVal oWordApplic As Word.ApplicationClass)
              oWordApplic.Selection.Style 
      = oWordApplic.ActiveDocument.Styles(header)
          
      End Sub
      其他那些不能在C#里賦值的對(duì)象都可以通過(guò)這種方法實(shí)現(xiàn)賦值。

      2.書簽過(guò)多,一個(gè)一個(gè)定位麻煩的問(wèn)題
      如果你的Word模板夠龐大,可能會(huì)出現(xiàn)有50多個(gè)書簽,而這些書簽的位置只是填充一些簡(jiǎn)單數(shù)據(jù)的情況。如果我們編程時(shí)一個(gè)個(gè)的定位,然后一個(gè)個(gè)的填充數(shù)據(jù)肯定時(shí)非常麻煩的。這種情況下,我的解決辦法是設(shè)置XML配置文檔。

      我們可以設(shè)置一個(gè)XML文件,其中存放需要填充數(shù)據(jù)的書簽(這些書簽處只是做簡(jiǎn)單的插入文本)的名稱。如下面是我的XML文件的詳細(xì)內(nèi)容:
      <?xml version="1.0" encoding="utf-8" ?> 
      <Forms>
         
      <Form>
              
      <Name>data</Name>
              
      <Bookmarks>
                  
      <Bookmark>date1</Bookmark>
                  
      <Bookmark>date2</Bookmark>
                  
      <Bookmark>project</Bookmark>
                  
      <Bookmark>company</Bookmark>
              
      </Bookmarks>
         
      </Form>    
         
      <Form>
              
      <Name>company</Name>
              
      <Bookmarks>
                  
      <Bookmark>recordnumber</Bookmark>
                  
      <Bookmark>customer</Bookmark>
                  
      <Bookmark>address</Bookmark>
                  
      <Bookmark>postcode</Bookmark>
                  
      <Bookmark>linkman</Bookmark>
                  
      <Bookmark>telephone</Bookmark>
                  
      <Bookmark>email</Bookmark>
                  
      <Bookmark>faxnumber</Bookmark>
            
        </Bookmarks>
         
      </Form>
      </Forms>
      我們可以把需要填充的數(shù)據(jù)都存放到一個(gè)Hashtable中,key為它們所對(duì)應(yīng)的書簽名,這樣在C#中讀取這個(gè)XML文件后,把同一Name下的所有Bookmark存放在一個(gè)ArrayList中,我們就可以統(tǒng)一地進(jìn)行填充了,使用的函數(shù)的形式如:
      foreach(string bookmark in bookmarks)
                  
      {
                      
      switch(bookmark)
                      
      {
                          
      case "company":
                              test.GotoBookMark(bookmark);
                              test.SetFontColor(Word.WdColor.wdColorDarkBlue);
                              test.SetFontName(
      "Times New Roman");
                              test.InsertText(hash[bookmark].ToString());
                              
      break;
                          
      case "catalog":
                              
      break;
                          
      case "modules":
                              
      break;
                          
      default:
                              test.GotoBookMark(bookmark);
                              test.InsertText(hash[bookmark].ToString());
                              
      break;
                      }

                  }
      這樣,對(duì)于那些不需要做特殊化處理的書簽,我們就統(tǒng)一的在default中進(jìn)行了填充數(shù)據(jù)。

      3.頁(yè)眉頁(yè)腳中添文字的問(wèn)題
      對(duì)于頁(yè)眉頁(yè)腳,需要注意的就是不要用書簽去定位,因?yàn)轫?yè)眉頁(yè)腳和主文檔的頁(yè)面視圖不一樣,所以不能在普通的視圖下直接定位到頁(yè)眉頁(yè)腳所在書簽處。但只要你切換一下視圖,一切就OK了。
      /// <summary>
              
      /// 設(shè)置頁(yè)眉
              
      /// </summary>
              
      /// <param name="strBookmarkName">要設(shè)置頁(yè)面中的一個(gè)書簽</param>
              
      /// <param name="text">頁(yè)眉的文字</param>

              public void SetHeader(string strBookmarkName,string text)
              
      {
                  
      this.GotoBookMark(strBookmarkName);
                  
      //            If ActiveWindow.View.SplitSpecial <> wdPaneNone Then
                  
      //            ActiveWindow.Panes(2).Close
                  
      //            End If
                  if(oWordApplic.ActiveWindow.View.SplitSpecial != Word.WdSpecialPane.wdPaneNone)
                      oWordApplic.ActiveWindow.Panes[
      2].Close();

                  
      //            If ActiveWindow.ActivePane.View.Type = wdNormalView Or ActiveWindow. _
                  
      //            ActivePane.View.Type = wdOutlineView Then
                  
      //            ActiveWindow.ActivePane.View.Type = wdPrintView
                  
      //            End If
                  if(oWordApplic.ActiveWindow.View.Type == Word.WdViewType.wdNormalView
                      
      || oWordApplic.ActiveWindow.View.Type == Word.WdViewType.wdOutlineView)
                      oWordApplic.ActiveWindow.ActivePane.View.Type 
      = Word.WdViewType.wdPrintView;

                  
      //            ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
                  oWordApplic.ActiveWindow.ActivePane.View.SeekView = Word.WdSeekView.wdSeekCurrentPageHeader;

                  
      this.GoToTheEnd();

      //            this.GotoBookMark(strBookmarkName);
                  this.SetFontColor(Word.WdColor.wdColorDarkBlue);
                  
      this.InsertText(text);

                  
      //            ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
                  oWordApplic.ActiveWindow.ActivePane.View.SeekView = Word.WdSeekView.wdSeekMainDocument;
              }

      這里,我先是通過(guò)書簽定位到頁(yè)眉所在頁(yè),這樣比較方便,不用在頁(yè)眉視圖中再翻頁(yè)定位。

      4.項(xiàng)目符號(hào)及多級(jí)項(xiàng)目符號(hào)的Style問(wèn)題
      這個(gè)問(wèn)題我的解決中有點(diǎn)問(wèn)題,要和模板一起設(shè)置才能用,感覺(jué)不好,就不拿出來(lái)給大家看了,以免誤導(dǎo)大家了

      5.添加特殊字符的問(wèn)題
      當(dāng)你要在文檔中添加特殊文字的時(shí)候(如你想添加一個(gè)þ),不能直接通過(guò)簡(jiǎn)單的復(fù)制粘貼來(lái)實(shí)現(xiàn)(你根本沒(méi)辦法在.NET的IDE下看到þ)。這時(shí),我們可以通過(guò)查找這個(gè)特殊字符的字體名稱和代表的16進(jìn)制編碼來(lái)插入。我們可以查到þ所在的字符集是Wingdings,它的16進(jìn)制編碼是\u00fe,這時(shí),我們就能對(duì)這個(gè)þ進(jìn)行插入,具體代碼如:
      test.SetFontName("Wingdings");
      test.SetFontColor(Word.WdColor.wdColorDarkBlue);
      test.InsertText(
      "\u00fe");
      其中,test是一個(gè)被封裝的Word操作類的實(shí)例。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多