C#實(shí)現(xiàn)一個(gè)Word保護(hù)性模板文件
制作一個(gè)保護(hù)性模板文件
在類似一些OA的自動(dòng)化處理或?qū)徟愊到y(tǒng)里,經(jīng)常會(huì)用到模板類文件,比如WORD保護(hù)性模板。設(shè)置保護(hù)性,比如文檔打開密碼、保護(hù)性密碼,是為了防止標(biāo)準(zhǔn)化文字內(nèi)容、敏感信息內(nèi)容不被修改,對(duì)于可修改內(nèi)容則由程序進(jìn)行控制。
給文件設(shè)置保護(hù)密碼
創(chuàng)建或打開一個(gè)WORD文件,選擇左側(cè)菜單欄,信息選項(xiàng),右側(cè)選擇保護(hù)文檔按鈕,并選擇用密碼進(jìn)行加密菜單項(xiàng)。

設(shè)計(jì)模板內(nèi)容
比如設(shè)計(jì)一個(gè)審批表,我們可能應(yīng)用到WORD里的內(nèi)容控件,使用內(nèi)容控件,需要設(shè)置如下圖:

選擇左側(cè)菜單欄,信息選項(xiàng),選擇自定義功能區(qū),并選擇右側(cè)列表里的開發(fā)工具菜單項(xiàng)。
這樣在編輯WORD文檔中,會(huì)看到設(shè)計(jì)開發(fā)工具選項(xiàng),如下圖:

如圖,我們首先繪制一個(gè)審批表格,然后在需要將來用戶輸入文字的地方插入格式文本內(nèi)容控件,如項(xiàng)目名稱、審批事項(xiàng)、經(jīng)辦人、年月日內(nèi)容等。
限制編輯
設(shè)計(jì)完成模板內(nèi)容后,我們最后要設(shè)置限制編輯的設(shè)置,即僅允許用戶輸入文本框中的內(nèi)容,設(shè)置如下圖所示:

選擇開發(fā)工具選項(xiàng)、限制編輯按鈕,在限制編輯功能里,我們選擇:
1、限制對(duì)選定的樣式設(shè)置格式
2、僅允許在文檔中進(jìn)行此類型的編輯(填寫窗體)
3、是、啟動(dòng)強(qiáng)制保護(hù)

輸入強(qiáng)制保護(hù)密碼即可,若想停止保護(hù)此文檔,重新進(jìn)行編輯,則可以選擇停止保護(hù),并輸入密碼,如下圖:

當(dāng)修改完成后,可以繼續(xù)進(jìn)行限制保護(hù)。至此一個(gè)保護(hù)性WORD模板文件已經(jīng)制作完成。
進(jìn)一步的需求
這種模板文件滿足了基本的設(shè)計(jì)要求,但在層級(jí)審批實(shí)際業(yè)務(wù)中,不能滿足需要,還需要進(jìn)一步的改進(jìn),包括如下功能:
1、以保護(hù)性模板文件為起始流程,僅允許申請(qǐng)者填寫項(xiàng)目名稱、審批事項(xiàng)和提請(qǐng)理由
2、經(jīng)辦人和處理時(shí)間由系統(tǒng)自動(dòng)填寫。
3、備注由審批人填寫。
因此實(shí)際操作中,需要用后臺(tái)程序?qū)ξ募M(jìn)行多次處理
范例運(yùn)行環(huán)境
操作系統(tǒng): Windows Server 2019 DataCenter
操作系統(tǒng)上安裝 Office Word 2016 ,客戶端使用的 Office Word 2019
.net版本: .netFramework4.7.1 或以上
開發(fā)工具:VS2019 C#
Office DCOM 配置
請(qǐng)參考我的文章《C# 讀取Word表格到DataSet》有對(duì)Office DCOM詳細(xì)配置介紹,這里不再贅述。
設(shè)計(jì)實(shí)現(xiàn)
進(jìn)一步修改模板文件
通過設(shè)置內(nèi)容控件的一些屬性,用程序進(jìn)行狀態(tài)和內(nèi)容的控制,首先修改如下圖:

選中內(nèi)容控件,點(diǎn)擊開發(fā)工具選項(xiàng)卡中的屬性,自定義標(biāo)記值,并選中無法編輯內(nèi)容屬性。
設(shè)置和取消保護(hù)
這是自動(dòng)化處理的兩個(gè)關(guān)鍵方法,Protect 和 Unprotect 方法,示例代碼如下:
string ProtectPassword="111";
int ProtectLevel=3; //3只填寫窗體,可參照列表對(duì)應(yīng),理論是1-4
/取得Word文件保存路徑
string _lastfile=""; //模板文件的路徑
object filename = _lastfile;
//創(chuàng)建一個(gè)名為WordApp的組件對(duì)象
Word.Application WordApp = new Word.Application();
//創(chuàng)建一個(gè)名為WordDoc的文檔對(duì)象
WordApp.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone;
Word.Document WordDoc = WordApp.Documents.Open(ref filename, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing);
//啟動(dòng)強(qiáng)制保護(hù)
WordDoc.Protect((Word.WdProtectionType)ProtectLevel, Type.Missing, ProtectPassword);
//停止保護(hù)
WordDoc.Unprotect(ProtectPassword);通過保護(hù)機(jī)制的撤銷與設(shè)置,實(shí)現(xiàn)由系統(tǒng)對(duì)關(guān)鍵內(nèi)容的修改。
遍歷WORD內(nèi)容控件
ArrayList ranges = new ArrayList(); //備份Range對(duì)象
ArrayList rangetexts = new ArrayList(); //備份Range對(duì)象的文本內(nèi)容
//遍歷內(nèi)容控件
foreach (Word.ContentControl cc in WordDoc.ContentControls)
{
//判斷格式文本內(nèi)容控件,并判斷自定義屬性
if (cc.Type == Word.WdContentControlType.wdContentControlText && (cc.Tag=="tag1"))
{
cc.MultiLine = true; //允許多行內(nèi)容
cc.LockContentControl = false; //解除鎖定內(nèi)容
cc.LockContents = false; //解除鎖定控件
cc.Type = Word.WdContentControlType.wdContentControlRichText; //設(shè)置富文本控件
ranges.Add(cc.Range); //添加range對(duì)象
rangetexts.Add(cc.Range.Text); //添加range對(duì)象的TEXT,在這里可以傳遞需要的值
cc.LockContentControl = false;
cc.Delete(true); // 刪除控件
}
}
int r = 0;
foreach(Word.Range ran in ranges)
{
ran.Text = rangetexts[r].ToString(); //在控件的刪除點(diǎn)替換成需要的文本
r++;
}總結(jié)
以上是實(shí)現(xiàn)的一些關(guān)鍵方法和屬性,總體的設(shè)計(jì)思路即遵循以下流程:
1、自定義控件的TAG屬性,以標(biāo)識(shí)程序控制識(shí)別,如TAG1為申請(qǐng)人標(biāo)識(shí),TAG2為審批人標(biāo)識(shí)
2、在流程節(jié)點(diǎn)讀取對(duì)應(yīng)的標(biāo)識(shí),備份內(nèi)容,然后刪除控件,以防止再次修改填寫的內(nèi)容
3、在刪除控件的光標(biāo)位置,恢復(fù)原錄入內(nèi)容,以保持文件內(nèi)容的完整性,以備下一節(jié)點(diǎn)審批
另外,我們還可以操作WORD的一些變量來滿足應(yīng)用的擴(kuò)展,示例代碼如下:
string DocVar_Value = "123";
//遍歷WORD變量
foreach (Word.Variable ov in WordDoc.Variables)
{
if (ov.Name == "Sys_Custom_DocVar") //判斷變量名稱,假設(shè)為 Sys_Custom_DocVar
{
// ov.Value 可訪問的值
ov.Delete(); //找到要設(shè)置的變量,刪除
}
}
//添加WORD變量
WordDoc.Variables.Add("Sys_Custom_DocVar", DocVar_Value);這些選項(xiàng)都可以根據(jù)實(shí)際的業(yè)務(wù)進(jìn)行擴(kuò)展,我們可以充分發(fā)揮自己的想像來進(jìn)行設(shè)計(jì)!
以上就是C#實(shí)現(xiàn)一個(gè)Word保護(hù)性模板文件的詳細(xì)內(nèi)容,更多關(guān)于C# Word保護(hù)性模板文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#使用DropDownList綁定添加新數(shù)據(jù)的方法匯總
這篇文章主要介紹了C#使用DropDownList綁定添加新數(shù)據(jù)的方法匯總的相關(guān)資料,需要的朋友可以參考下2016-03-03
C#使用XmlDocument或XDocument創(chuàng)建xml文件
這篇文章主要為大家詳細(xì)介紹了C#使用XmlDocument或XDocument創(chuàng)建xml文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10
C# 中類型轉(zhuǎn)換方式之顯式轉(zhuǎn)換和 as 運(yùn)算符
在 C# 中,有兩種常見的類型轉(zhuǎn)換方式:顯式轉(zhuǎn)換和as 運(yùn)算符,它們用于在不同類型之間進(jìn)行轉(zhuǎn)換,以下是對(duì)這兩種轉(zhuǎn)換方式的詳細(xì)解釋和示例說明,感興趣的朋友跟隨小編一起看看吧2024-05-05
C#實(shí)現(xiàn)設(shè)置電腦顯示器參數(shù)
這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)設(shè)置電腦顯示器參數(shù),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12
Winform項(xiàng)目中TextBox控件DataBindings屬性
這篇文章介紹了Winform項(xiàng)目中TextBox控件DataBindings屬性的用法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02
C#使用隨機(jī)樞軸實(shí)現(xiàn)快速排序的方法
本文探討了如何使用隨機(jī)樞軸實(shí)現(xiàn)快速排序,介紹了Lomuto和Hoare兩種分區(qū)方案,并提出了一種不使用傳統(tǒng)分區(qū)方案的實(shí)現(xiàn)方法,需要的朋友可以參考下2026-04-04

