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è)審批表格,然后在需要將來(lái)用戶輸入文字的地方插入格式文本內(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)一步修改模板文件
通過(guò)設(shè)置內(nèi)容控件的一些屬性,用程序進(jìn)行狀態(tài)和內(nèi)容的控制,首先修改如下圖:
選中內(nèi)容控件,點(diǎn)擊開發(fā)工具選項(xiàng)卡中的屬性,自定義標(biāo)記值,并選中無(wú)法編輯內(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);
通過(guò)保護(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的一些變量來(lái)滿足應(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 可訪問(wèn)的值 ov.Delete(); //找到要設(shè)置的變量,刪除 } } //添加WORD變量 WordDoc.Variables.Add("Sys_Custom_DocVar", DocVar_Value);
這些選項(xiàng)都可以根據(jù)實(shí)際的業(yè)務(wù)進(jìn)行擴(kuò)展,我們可以充分發(fā)揮自己的想像來(lái)進(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#設(shè)計(jì)模式之建造者模式生成器模式示例詳解
這篇文章主要為大家介紹了C#設(shè)計(jì)模式之建造者模式生成器模式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08小菜編程成長(zhǎng)記(一 面試受挫——代碼無(wú)錯(cuò)就是好?)
小菜編程成長(zhǎng)記(一 面試受挫——代碼無(wú)錯(cuò)就是好?)...2006-10-10C#?wpf使用DockPanel實(shí)現(xiàn)制作截屏框
做桌面客戶端的時(shí)候有時(shí)需要實(shí)現(xiàn)截屏功能,能夠在界面上框選截屏,本文就來(lái)為大家介紹一下wpf如何使用DockPanel制作截屏框吧,感興趣的可以了解下2023-09-09C# Oracle批量插入數(shù)據(jù)進(jìn)度條的實(shí)現(xiàn)代碼
這篇文章主要介紹了C# Oracle批量插入數(shù)據(jù)進(jìn)度條的實(shí)現(xiàn)代碼,需要的朋友可以參考下2018-04-04