C#實現(xiàn)一個Word保護(hù)性模板文件
制作一個保護(hù)性模板文件
在類似一些OA的自動化處理或?qū)徟愊到y(tǒng)里,經(jīng)常會用到模板類文件,比如WORD保護(hù)性模板。設(shè)置保護(hù)性,比如文檔打開密碼、保護(hù)性密碼,是為了防止標(biāo)準(zhǔn)化文字內(nèi)容、敏感信息內(nèi)容不被修改,對于可修改內(nèi)容則由程序進(jìn)行控制。
給文件設(shè)置保護(hù)密碼
創(chuàng)建或打開一個WORD文件,選擇左側(cè)菜單欄,信息選項,右側(cè)選擇保護(hù)文檔按鈕,并選擇用密碼進(jìn)行加密菜單項。
設(shè)計模板內(nèi)容
比如設(shè)計一個審批表,我們可能應(yīng)用到WORD里的內(nèi)容控件,使用內(nèi)容控件,需要設(shè)置如下圖:
選擇左側(cè)菜單欄,信息選項,選擇自定義功能區(qū),并選擇右側(cè)列表里的開發(fā)工具菜單項。
這樣在編輯WORD文檔中,會看到設(shè)計開發(fā)工具選項,如下圖:
如圖,我們首先繪制一個審批表格,然后在需要將來用戶輸入文字的地方插入格式文本內(nèi)容控件,如項目名稱、審批事項、經(jīng)辦人、年月日內(nèi)容等。
限制編輯
設(shè)計完成模板內(nèi)容后,我們最后要設(shè)置限制編輯的設(shè)置,即僅允許用戶輸入文本框中的內(nèi)容,設(shè)置如下圖所示:
選擇開發(fā)工具選項、限制編輯按鈕,在限制編輯功能里,我們選擇:
1、限制對選定的樣式設(shè)置格式
2、僅允許在文檔中進(jìn)行此類型的編輯(填寫窗體)
3、是、啟動強(qiáng)制保護(hù)
輸入強(qiáng)制保護(hù)密碼即可,若想停止保護(hù)此文檔,重新進(jìn)行編輯,則可以選擇停止保護(hù),并輸入密碼,如下圖:
當(dāng)修改完成后,可以繼續(xù)進(jìn)行限制保護(hù)。至此一個保護(hù)性WORD模板文件已經(jīng)制作完成。
進(jìn)一步的需求
這種模板文件滿足了基本的設(shè)計要求,但在層級審批實際業(yè)務(wù)中,不能滿足需要,還需要進(jìn)一步的改進(jìn),包括如下功能:
1、以保護(hù)性模板文件為起始流程,僅允許申請者填寫項目名稱、審批事項和提請理由
2、經(jīng)辦人和處理時間由系統(tǒng)自動填寫。
3、備注由審批人填寫。
因此實際操作中,需要用后臺程序?qū)ξ募M(jì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 配置
請參考我的文章《C# 讀取Word表格到DataSet》有對Office DCOM詳細(xì)配置介紹,這里不再贅述。
設(shè)計實現(xiàn)
進(jìn)一步修改模板文件
通過設(shè)置內(nèi)容控件的一些屬性,用程序進(jìn)行狀態(tài)和內(nèi)容的控制,首先修改如下圖:
選中內(nèi)容控件,點擊開發(fā)工具選項卡中的屬性,自定義標(biāo)記值,并選中無法編輯內(nèi)容屬性。
設(shè)置和取消保護(hù)
這是自動化處理的兩個關(guān)鍵方法,Protect 和 Unprotect 方法,示例代碼如下:
string ProtectPassword="111"; int ProtectLevel=3; //3只填寫窗體,可參照列表對應(yīng),理論是1-4 /取得Word文件保存路徑 string _lastfile=""; //模板文件的路徑 object filename = _lastfile; //創(chuàng)建一個名為WordApp的組件對象 Word.Application WordApp = new Word.Application(); //創(chuàng)建一個名為WordDoc的文檔對象 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); //啟動強(qiáng)制保護(hù) WordDoc.Protect((Word.WdProtectionType)ProtectLevel, Type.Missing, ProtectPassword); //停止保護(hù) WordDoc.Unprotect(ProtectPassword);
通過保護(hù)機(jī)制的撤銷與設(shè)置,實現(xiàn)由系統(tǒng)對關(guān)鍵內(nèi)容的修改。
遍歷WORD內(nèi)容控件
ArrayList ranges = new ArrayList(); //備份Range對象 ArrayList rangetexts = new ArrayList(); //備份Range對象的文本內(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對象 rangetexts.Add(cc.Range.Text); //添加range對象的TEXT,在這里可以傳遞需要的值 cc.LockContentControl = false; cc.Delete(true); // 刪除控件 } } int r = 0; foreach(Word.Range ran in ranges) { ran.Text = rangetexts[r].ToString(); //在控件的刪除點替換成需要的文本 r++; }
總結(jié)
以上是實現(xiàn)的一些關(guān)鍵方法和屬性,總體的設(shè)計思路即遵循以下流程:
1、自定義控件的TAG屬性,以標(biāo)識程序控制識別,如TAG1為申請人標(biāo)識,TAG2為審批人標(biāo)識
2、在流程節(jié)點讀取對應(yīng)的標(biāo)識,備份內(nèi)容,然后刪除控件,以防止再次修改填寫的內(nèi)容
3、在刪除控件的光標(biāo)位置,恢復(fù)原錄入內(nèi)容,以保持文件內(nèi)容的完整性,以備下一節(jié)點審批
另外,我們還可以操作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);
這些選項都可以根據(jù)實際的業(yè)務(wù)進(jìn)行擴(kuò)展,我們可以充分發(fā)揮自己的想像來進(jìn)行設(shè)計!
以上就是C#實現(xiàn)一個Word保護(hù)性模板文件的詳細(xì)內(nèi)容,更多關(guān)于C# Word保護(hù)性模板文件的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#?wpf使用DockPanel實現(xiàn)制作截屏框
做桌面客戶端的時候有時需要實現(xiàn)截屏功能,能夠在界面上框選截屏,本文就來為大家介紹一下wpf如何使用DockPanel制作截屏框吧,感興趣的可以了解下2023-09-09C# Oracle批量插入數(shù)據(jù)進(jìn)度條的實現(xiàn)代碼
這篇文章主要介紹了C# Oracle批量插入數(shù)據(jù)進(jìn)度條的實現(xiàn)代碼,需要的朋友可以參考下2018-04-04