<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    ice world

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

    C#操作word總結

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

    我主要是將現有的模板填入數據保存文檔即可。主題是TABLE填值,檢索TABLE主要是通過下標,如:

    WordDoc.Tables[6]

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

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

    /// <summary>
    /// 縱向單元格合并 
    /// 說明:如合并了第一行第一列和第二行第一列兩個單元格,則單元格cell(2, 1)已經不存在,繼續操作會有異常, 
    /// 只有通過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;    // 因剛已經+1了,所以再減回去    
        for (int i = startRowIndex; i <= table.Rows.Count; ++i) // 遍歷所有行的columnIndex列,發現相同的合并,從起始行的下一行開始對比    
        {        
            
    string currentText = table.Cell(i, columnIndex).Range.Text;        
            
    if (previousText.Equals(currentText))        
            
    {            
                table.Cell(previousRowIndex, columnIndex).Merge(table.Cell(i, columnIndex)); 
    // 合并先前單元格和當前單元格            
                table.Cell(previousRowIndex, columnIndex).Range.Text = currentText;    // 因為合并后并沒有將單元格內容去除,需要手動修改            
                table.Cell(previousRowIndex, columnIndex).Select();            
                WordApp.Selection.ParagraphFormat.Alignment 
    = WdParagraphAlignment.wdAlignParagraphCenter;    // 水平居中顯示            
                table.Cell(previousRowIndex, columnIndex).VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter; // 垂直居中        
            }
            
            
    else        
            
    {            
                previousText 
    = currentText; // 將對比文字替換為當前的內容            
                previousRowIndex = i;   // 檢索到不同的內容,將當前行下標置為先前行下標,用于合并        
            }
        
        }

    }


    /// <summary>
    /// 橫向單元格合并
    /// 注意:在合并單元格后必須將縱列數減去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++;    // 保存先前對比列下標    
        int colCount = table.Columns.Count;    
        
    for (int i = startColumnIndex; i <= colCount;) // 遍歷所有行的columnIndex列,發現相同的合并,從起始行的下一行開始對比    
        {        
            
    string currentText = table.Cell(rowIndex, i).Range.Text;        
            
    if (previousText.Equals(currentText))        
            
    {            
                table.Cell(rowIndex, previousColumnIndex).Merge(table.Cell(rowIndex, i)); 
    // 合并先前單元格和當前單元格            
                table.Cell(rowIndex, previousColumnIndex).Range.Text = currentText;    // 因為合并后并沒有將單元格內容去除,需要手動修改            
                table.Cell(rowIndex, previousColumnIndex).Select();            
                WordApp.Selection.ParagraphFormat.Alignment 
    = WdParagraphAlignment.wdAlignParagraphCenter;    // 水平居中顯示            
                table.Cell(rowIndex, previousColumnIndex).VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter; // 垂直居中            
                --colCount;        
            }
            
            
    else        
            
    {            
                previousText 
    = currentText; // 將對比文字替換為當前的內容            
                previousColumnIndex = i++;   // 檢索到不同的內容,將當前行下標置為先前行下標,用于合并        
            }
        
        }

    }

    方法注釋已經很詳細就不再贅述。

    最后遇到的問題是無格式的段落檢索,因為在生成報告的時候需要在某些段落后填寫測試的結論,這下又把我難住了,最終終于發現了bookmark這個東東,起始我對word并不熟悉,都不知道它有書簽的功能。順便就愛你個檢索書簽的方法貼出來:

    /// <summary>
    /// 在整個文檔中根據書簽名檢索書簽對象
    /// </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 
    = "你好"// 將檢索到書簽的內容替換為“你好”

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

    最后需要看具體的word操作demo代碼請訪問MSDN,貼個網址:

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

    主站蜘蛛池模板: 亚洲av乱码一区二区三区香蕉| 亚洲看片无码在线视频| 亚洲综合丁香婷婷六月香| 西西人体大胆免费视频| 三年片在线观看免费大全电影| 免费看又爽又黄禁片视频1000| 狠狠亚洲婷婷综合色香五月排名 | 久久亚洲精品专区蓝色区| 无遮挡呻吟娇喘视频免费播放| 香港a毛片免费观看| 凹凸精品视频分类国产品免费| 亚洲成a人片77777老司机| 精品久久久久久久久亚洲偷窥女厕| 国产偷伦视频免费观看| 国产精品公开免费视频| 2022年亚洲午夜一区二区福利| 色视频在线观看免费| 波多野结衣中文字幕免费视频 | 亚洲高清视频免费| 一级做a免费视频观看网站| 性做久久久久久久免费看| 亚洲狠狠婷婷综合久久久久| 亚洲AV无码一区二区三区久久精品| 国产免费网站看v片在线| 国产免费拔擦拔擦8x| 亚洲精品午夜视频| 91成人免费观看在线观看| 国产精品免费看久久久无码| 亚洲精品在线免费看| 视频免费在线观看| 免费少妇a级毛片人成网| 33333在线亚洲| 99在线观看免费视频| 自拍偷自拍亚洲精品情侣| 国产成人精品久久亚洲高清不卡| 黄色网址免费观看| 亚洲A∨无码一区二区三区| 久久国产免费直播| 亚洲一区二区精品视频| 亚洲精品亚洲人成在线| 91麻豆最新在线人成免费观看|