1. 程式人生 > >C#中操作Word(5)—— 利用BookMark物件寫Word文件

C#中操作Word(5)—— 利用BookMark物件寫Word文件

一、引言

        本文主要介紹通過Word中的書籤Bookmark來向Word中寫入我們自定義的資料。之前的文章介紹了利用Range物件讀寫word的方法,用這種方法如果處理比較簡單的文件還好,若文件較複雜,就顯得有些力不從心了。

        比如有這麼一個文件,內容如下:


        要求我們在程式裡面動態的生成這些資料然後補充進word文件裡面,此時如果我們再用range進行這些資訊的填寫,就顯得無從下手了。這種文件的格式和排版都是固定的,我們可以稱之為模板。如果按照range進行寫入的思路,先要讀取range,然後在記憶體中修改資料,最後寫入文件時還要針對每個欄位進行格式化,以保證排版和操作之前一致。如果遇到比較複雜的排版,這種方案几乎是不可能實現的。

        此時,就需要我們引入書籤Bookmark了。通過書籤進行word文件寫入的思路是:在模板需要填入資料的位置我們預先編寫若干書籤,而對於其他我們不關係的文字內容我們不用理會,在程式中我們只需要先讀取書籤,然後再針對每個書籤填充即可。這樣做的好處就是整個word文件的排版可以事先做好,而我們不必再關心那些煩人的格式問題。

        好,接下來就分步驟介紹下書籤Bookmark在開發中的應用。

二、編寫帶有書籤的模板

         首先,我們要做的是在模板中插入書籤。開啟模板文件,把滑鼠放到需要我們填寫資料的“姓名”欄位之後,然後從word的“插入”工具欄標籤中,找到書籤按鈕,點選調出增加書籤的介面:


        在彈出的“書籤”對話方塊中我們填入為書籤的命名name,然後點選新增按鈕。


        此時會在文件中我們的滑鼠所在的位置插入一箇中括號的一個符號,這就是書籤:


        如果你沒看到類似的符號,請勾選word選項->高階->顯示書籤,如下圖所示:


        接下來我們將剩餘的3個欄位分別加入書籤,書籤名稱分別為six,job,date這樣,整個模板就設定完成了,接下來我們在專案中實現對模板的填充。

        

三、填充模板

3.1 載入模板文件

        在“測試”按鈕的點選事件處理函式中我們,先利用app.documents.add()的方式開啟該文件,程式碼如下:

 private void button1_Click(objectsender, EventArgs e)
        {
            Microsoft.Office.Interop.Word.Application app = newMicrosoft.Office.Interop.Word.Application();
            Documentdoc = app.Documents.Add("D:\\Test.docx");
            doc.ActiveWindow.Visible = true;
        }

        此時如果我們用斷點除錯,檢視載入後的doc物件,你會發現我們所做的書籤已經被成功獲取,接下來我們就可以遍歷書籤進行相關操作了:


3.2 遍歷書籤填充內容

         Document物件的Bookmarks是所有書籤Bookmark的一個集合,我們可以用foreach對其進行迴圈,然後在呼叫每個Bookmark的range屬性,通過range寫入我們的資料:

  private void button1_Click(object sender, EventArgs e) 
	{
            Microsoft.Office.Interop.Word.Application app = newMicrosoft.Office.Interop.Word.Application();
            stringversion = app.Version;
            Console.WriteLine(version);
            Documentdoc = app.Documents.Add("D:\\Test.docx");
            doc.ActiveWindow.Visible = true;
            foreach(Bookmark bk indoc.Bookmarks)
            {
                bk.Range.Text =GetStrByBookmarkName(bk.Name);
           }
 
        }
 
        privatestring GetStrByBookmarkName(string name)
        {
            stringstr = string.Empty;
            switch(name)
            {
                case"name":
                    str = "Hyman";
                    break;
                case"six":
                    str="男";
                    break;
                case"job":
                    str = "軟體工程師";
                    break;
                case"date":
                    str = DateTime.Now.ToString();
                    break;
            }
            returnstr;
        }

        我們把通過書籤名稱獲取資料的功能封裝在了GetStrByBookmarkName函式中,這樣迴圈過後,成功在模板中填充了我們關心的資料。

 

Github位置:

克隆本專案:

git clone [email protected]:HymanLiuTS/OfficeTestByC-.git

獲取本文原始碼:

git checkout L05

相關推薦

C#操作Word5—— 利用BookMark物件Word

一、引言         本文主要介紹通過Word中的書籤Bookmark來向Word中寫入我們自定義的資料。之前的文章介紹了利用Range物件讀寫word的方法,用這種方法如果處理比較簡單的文件還好,若文件較複雜,就顯得有些力不從心了。         比如有這麼一個文件

C#操作Excel4—— 向Excel插入兩種圖表以及設定圖表格式

一、引言         本文主要討論下向Excel中插入圖表的兩種方式。在Excel中圖表是有兩種級別的,一種是和sheet同級別的圖表,也就是說整個excel的標籤頁就是一個圖表;還有一種就是我們最常使用的在一個sheet中插入的圖表,我們姑且叫它sheet子圖表。這

Kubernetes多master部署5---創建Node節點kubeconfig

spa boot pro .sh str conf rap embed ont 在Master01上執行kubeconfig.sh腳本 cd /opt/ssl #cat kubeconfig.sh # 創建 TLS Bootstrapping Token

樹莓派5利用 AWS IoT Greengrass 進行 IoT 邊緣計算

  IoT 的諸多場景中,邊緣計算有很多需求。比如,不是每個物聯網裝置都能連線到網際網路,從而連線雲上物聯網服務。還比如有一些資料安全考慮,不允許將某些資料發到雲上。因此,AWS 釋出了 Greengrass 服務,用於支援物聯網場景中的邊緣計算。  1. AWS IoT Greengr

C#對字元的各種操作函式及其使用

!!!此部落格僅作為本人的學習記錄使用,若有出現雷同的部分或許是緣分!!若有發現錯誤或遺漏的部分,歡迎評論區補充,謝謝!! 1,ToUpper() & ToLower():字串的大小寫轉換          主體結構:字串名.ToUpper() / 字串名.ToL

C++傳智筆記5C++完整demo

內部 urn else clas spa char log getx system MyPoint.h #pragma once class MyPoint { private: double x0, y0; //點坐標 public: void setPoint(d

C#的struct結構為值類型,struct類型全接觸

line 輸出 其他 重要 影響 初始化 最大 cat type類 眾所周知,struct類型和class類型非常相似,尤其是在C++中,class可以辦到的事struct幾乎都可以實現。在C#中struc類型依然存在,它的用處相對來說已經顯得越來越不重要,這裏主要講述一下

C++的常量 const限定符

無法 簡單的 對象 可能 函數重載 struct 理解 變量 必須 最近在重新看<<C++ Primer>>,第一遍的時候const和constexpr看得並不太懂,這次又有了些更新的理解,當然可能仍然有許多不對的地方... 首先,const限定符即

C程序設計導引5

宋體 span 格式 沒有 class div 第7章 限制 說了 第6章 數組 雖然數組放到很靠後的位置,但實際上它與int,double等在難度上沒有本質區別。我們可以把一個數組理解為一組格子,格子的名稱就是數組的名字。 定義一個一維數組的格式為: <類型>

C++重載overload、覆蓋override與隱藏oversee

acl 普通 evc dft war srx rpo 成員 avt body, table{font-family: 微軟雅黑; font-size: 10pt} table{border-col

C語言學習筆記5—— 語句1

  c程式常見結構大概有選擇結構,迴圈結構,順序結構。c程式由一個一個的函式構成,而構成函式的則是語句,語句包含賦值語句,迴圈語句,條件語句,分支語句。賦值語句對與我們來說是很熟悉的。條件語句,分支語句與迴圈語句則會在後面一一介紹到。   順序結構對於我們來說是很熟悉的,它可以是這個樣子。 &nbs

C語言學習筆記5—— 語句2

  在介紹過順序結構和選擇結構以後,我們能通過c語言做的事依舊很少,比如換硬幣問題。將一元的人民幣換成一分,兩分,五分的硬幣共50枚。如何解決這樣的問題呢?我們可以把它化解成一個求解線性方程組的問題。   可以設需要一分的硬幣x枚,兩分的硬幣y枚,五分的硬幣z枚。於是,我們可以得到一個方程組,像這樣:x+y

C++的回車\n和換行(\r)

‘\n’ 換行,游標移到下一行的開頭; '\r' 回車,游標移到當前行的開頭,不會換到下一行,如果接著輸出的話,本行以前的內容會被逐一覆蓋; #include <iostream> using namespace std;  

C語言程式設計:現代方法第2版K.N.King 著》學習筆記六:C語言基本概念5

問與答 GCC 最初是 GNU C Compiler 的簡稱。現在指 GNU Compiler Collection,這是因為最新版本的 GCC 能夠編譯用 Ada、C、C++、Fortran、Ja

我與C語言的點滴5-迴圈3選擇

猜數字遊戲 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <time.h> void menu() {

c#的delegate委託和event事件

一、delegate到底是什麼東西   孩子,C語言總學過吧,如果你學得不像我那麼差的話,函式指標總用過吧,就算沒用過總聽說過吧,嗯,大膽的告訴你,你完全可以把delegate理 解成C中的函式指標,它允許你傳遞一個類A的方法m給另一個類B的物件,使得類B的物件能夠呼叫這個方法m,

以太坊學習5利用Web3.js與節點互動【1】

利用Web3.js與節點互動  一、環境配置 【寫在最前:本文用到的主要工具:node.js+geth+ web3.js 1.0.0-beta.18】 1、確保已經安裝node.js 個人在debian9上安裝nodejs的經歷比較坎坷,但是據說ubuntu上安裝方便

C++的tab\t

#include <iostream> using namespace std;     int main()   {   int i;  for(i=0;i<80;i++)   if(i%10==0)cout<<i/10;

git操作總結5:遠端倉庫

1.連結本地庫和遠端倉庫 git remote add origin [email protected]:michaelliao/learngit.git 2.推送到遠端 git push -u origin testbranch 3.建立遠端分支 git

c# opencvsharp學習筆記5CvTrackbar,HSV,通道分割合併

1.CvTrackbarpublic CvTrackbar(string name, string window, CvTrackbarCallback callback); public CvTrackbar(string name, string window, CvTr