ice world

          There is nothing too difficult if you put your heart into it.
          posts - 104, comments - 103, trackbacks - 0, articles - 0

          C#操作word總結(jié)

          Posted on 2011-04-16 13:38 IceWee 閱讀(1188) 評論(0)  編輯  收藏 所屬分類: Others
          最近有個(gè)小項(xiàng)目中自己負(fù)責(zé)word報(bào)表的生成,開發(fā)語言是C#,我是做JAVA的,臨時(shí)用一下而已。發(fā)現(xiàn)微軟的在線MSDN是個(gè)好東西,很強(qiáng)大,基本需要的東西都在里面可以找到,比如word的創(chuàng)建、打開、關(guān)閉等等一系列的操作DEMO代碼。

          我主要是將現(xiàn)有的模板填入數(shù)據(jù)保存文檔即可。主題是TABLE填值,檢索TABLE主要是通過下標(biāo),如:

          WordDoc.Tables[6]

          其中WordDoc的類型是Word.Document,就是當(dāng)前操作的word文檔,上面的代碼是獲取當(dāng)前文檔中的第六個(gè)表格,這里要注意一下, 我們慣性會認(rèn)為是第七個(gè)表格,但這就是微軟的不同,沒有采用數(shù)組索引的方式,如果當(dāng)初數(shù)組也這么設(shè)計(jì),下標(biāo)從1開始,我們學(xué)習(xí)的時(shí)候不知道省多少事。

          開發(fā)過程中遇到了一個(gè)小難題就是合并單元格(縱向),沒有設(shè)計(jì)橫向的合并,現(xiàn)將合并的代碼貼出來備用:

          /// <summary>
          /// 縱向單元格合并 
          /// 說明:如合并了第一行第一列和第二行第一列兩個(gè)單元格,則單元格cell(2, 1)已經(jīng)不存在,繼續(xù)操作會有異常, 
          /// 只有通過cell(1, 1)來獲取合并后的單元格 
          /// /<summary>
          /// <param name="table"></param>
          /// <param name="startRowIndex"></param>
          /// <param name="columnIndex"></param>

          private static void verticalCellMerge(Word.Table table, int startRowIndex, int columnIndex)
          {    
              
          string previousText = table.Cell(startRowIndex++, columnIndex).Range.Text;    // 保存對比文字    
              int previousRowIndex = startRowIndex - 1;    // 因剛已經(jīng)+1了,所以再減回去    
              for (int i = startRowIndex; i <= table.Rows.Count; ++i) // 遍歷所有行的columnIndex列,發(fā)現(xiàn)相同的合并,從起始行的下一行開始對比    
              {        
                  
          string currentText = table.Cell(i, columnIndex).Range.Text;        
                  
          if (previousText.Equals(currentText))        
                  
          {            
                      table.Cell(previousRowIndex, columnIndex).Merge(table.Cell(i, columnIndex)); 
          // 合并先前單元格和當(dāng)前單元格            
                      table.Cell(previousRowIndex, columnIndex).Range.Text = currentText;    // 因?yàn)楹喜⒑蟛]有將單元格內(nèi)容去除,需要手動修改            
                      table.Cell(previousRowIndex, columnIndex).Select();            
                      WordApp.Selection.ParagraphFormat.Alignment 
          = WdParagraphAlignment.wdAlignParagraphCenter;    // 水平居中顯示            
                      table.Cell(previousRowIndex, columnIndex).VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter; // 垂直居中        
                  }
                  
                  
          else        
                  
          {            
                      previousText 
          = currentText; // 將對比文字替換為當(dāng)前的內(nèi)容            
                      previousRowIndex = i;   // 檢索到不同的內(nèi)容,將當(dāng)前行下標(biāo)置為先前行下標(biāo),用于合并        
                  }
              
              }

          }


          /// <summary>
          /// 橫向單元格合并
          /// 注意:在合并單元格后必須將縱列數(shù)減去1
          /// 如第一行第一列和第一行第二列合并后,原第一行第三列將變成第一行第二列,這就是在合并后i不加1的原因
          /// </summary>
          /// <param name="WordApp"></param>
          /// <param name="table"></param>
          /// <param name="startColumnIndex"></param>
          /// <param name="rowIndex"></param>

          private static void horizontalCellMerge(Word.Application WordApp, Word.Table table, int startColumnIndex, int rowIndex)
          {    
              
          string previousText = table.Cell(rowIndex, startColumnIndex).Range.Text;    // 保存對比文字    
              int previousColumnIndex = startColumnIndex++;    // 保存先前對比列下標(biāo)    
              int colCount = table.Columns.Count;    
              
          for (int i = startColumnIndex; i <= colCount;) // 遍歷所有行的columnIndex列,發(fā)現(xiàn)相同的合并,從起始行的下一行開始對比    
              {        
                  
          string currentText = table.Cell(rowIndex, i).Range.Text;        
                  
          if (previousText.Equals(currentText))        
                  
          {            
                      table.Cell(rowIndex, previousColumnIndex).Merge(table.Cell(rowIndex, i)); 
          // 合并先前單元格和當(dāng)前單元格            
                      table.Cell(rowIndex, previousColumnIndex).Range.Text = currentText;    // 因?yàn)楹喜⒑蟛]有將單元格內(nèi)容去除,需要手動修改            
                      table.Cell(rowIndex, previousColumnIndex).Select();            
                      WordApp.Selection.ParagraphFormat.Alignment 
          = WdParagraphAlignment.wdAlignParagraphCenter;    // 水平居中顯示            
                      table.Cell(rowIndex, previousColumnIndex).VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter; // 垂直居中            
                      --colCount;        
                  }
                  
                  
          else        
                  
          {            
                      previousText 
          = currentText; // 將對比文字替換為當(dāng)前的內(nèi)容            
                      previousColumnIndex = i++;   // 檢索到不同的內(nèi)容,將當(dāng)前行下標(biāo)置為先前行下標(biāo),用于合并        
                  }
              
              }

          }

          方法注釋已經(jīng)很詳細(xì)就不再贅述。

          最后遇到的問題是無格式的段落檢索,因?yàn)樵谏蓤?bào)告的時(shí)候需要在某些段落后填寫測試的結(jié)論,這下又把我難住了,最終終于發(fā)現(xiàn)了bookmark這個(gè)東東,起始我對word并不熟悉,都不知道它有書簽的功能。順便就愛你個(gè)檢索書簽的方法貼出來:

          /// <summary>
          /// 在整個(gè)文檔中根據(jù)書簽名檢索書簽對象
          /// </summary>
          /// <param name="name"></param>

          private static Word.Bookmark getBookmarkByName(string name)  
          {      
              
          foreach (Word.Bookmark bm in WordDoc.Bookmarks)      
              
          {          
                  
          if (bm.Name.Equals(name))              
                      
          return bm;          
                  }
                    
                  
          return null;      
              }
            


          例:

          Word.Bookmark bm = getBookmarkByName(bookmarkName);  
          bm.Range.Text 
          = "你好"// 將檢索到書簽的內(nèi)容替換為“你好”

          這就是這次用C#做word報(bào)表的全部問題,貌似都是小問題。

          最后需要看具體的word操作demo代碼請?jiān)L問MSDN,貼個(gè)網(wǎng)址:

          http://msdn.microsoft.com/zh-cn/library/78whx7s6(VS.80).aspx

          主站蜘蛛池模板: 鄯善县| 日照市| 石泉县| 会东县| 本溪| 黄骅市| 嘉荫县| 饶阳县| 澳门| 瑞昌市| 灵武市| 若尔盖县| 长泰县| 都安| 商城县| 东辽县| 南部县| 溆浦县| 商南县| 盱眙县| 乐业县| 塘沽区| 宁都县| 定日县| 贡山| 穆棱市| 铅山县| 新化县| 科尔| 南投县| 大宁县| 盱眙县| 通州市| 农安县| 永和县| 库尔勒市| 攀枝花市| 新疆| 海淀区| 宕昌县| 牟定县|