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#中操作Word(5)—— 利用BookMark物件寫Word文件
一、引言 本文主要介紹通過Word中的書籤Bookmark來向Word中寫入我們自定義的資料。之前的文章介紹了利用Range物件讀寫word的方法,用這種方法如果處理比較簡單的文件還好,若文件較複雜,就顯得有些力不從心了。 比如有這麼一個文件
C#中操作Excel(4)—— 向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++傳智筆記(5):C++完整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學習筆記(5)CvTrackbar,HSV,通道分割合併
1.CvTrackbarpublic CvTrackbar(string name, string window, CvTrackbarCallback callback); public CvTrackbar(string name, string window, CvTr