C#实现基于Word保护性模板文件的修改

2024-01-22 19:04

本文主要是介绍C#实现基于Word保护性模板文件的修改,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

目录

制作一个保护性模板文件

给文件设置保护密码 

设计模板内容

限制编辑

进一步的需求

范例运行环境

Office DCOM 配置

设计实现

进一步修改模板文件 

设置和取消保护

遍历WORD内容控件

总结 


制作一个保护性模板文件

在类似一些OA的自动化处理或审批类系统里,经常会用到模板类文件,比如WORD保护性模板。设置保护性,比如文档打开密码、保护性密码,是为了防止标准化文字内容、敏感信息内容不被修改,对于可修改内容则由程序进行控制。

给文件设置保护密码 

创建或打开一个WORD文件,选择左侧菜单栏,信息选项,右侧选择保护文档按钮,并选择用密码进行加密菜单项。

设计模板内容

比如设计一个审批表,我们可能应用到WORD里的内容控件,使用内容控件,需要设置如下图:

选择左侧菜单栏,信息选项,选择自定义功能区,并选择右侧列表里的开发工具菜单项。

这样在编辑WORD文档中,会看到设计开发工具选项,如下图:

如图,我们首先绘制一个审批表格,然后在需要将来用户输入文字的地方插入格式文本内容控件,如项目名称、审批事项、经办人、年月日内容等。

限制编辑

设计完成模板内容后,我们最后要设置限制编辑的设置,即仅允许用户输入文本框中的内容,设置如下图所示:

选择开发工具选项、限制编辑按钮,在限制编辑功能里,我们选择:

1、限制对选定的样式设置格式

2、仅允许在文档中进行此类型的编辑(填写窗体)

3、是、启动强制保护

输入强制保护密码即可,若想停止保护此文档,重新进行编辑,则可以选择停止保护,并输入密码,如下图:

当修改完成后,可以继续进行限制保护。至此一个保护性WORD模板文件已经制作完成。 

进一步的需求

这种模板文件满足了基本的设计要求,但在层级审批实际业务中,不能满足需要,还需要进一步的改进,包括如下功能:

1、以保护性模板文件为起始流程,仅允许申请者填写项目名称、审批事项和提请理由

2、经办人和处理时间由系统自动填写。

3、备注由审批人填写。

因此实际操作中,需要用后台程序对文件进行多次处理

范例运行环境

操作系统: Windows Server 2019 DataCenter

操作系统上安装 Office Word 2016 ,客户端使用的 Office Word 2019

.net版本: .netFramework4.7.1 或以上

开发工具:VS2019  C#

Office DCOM 配置

请参考我的文章《C# 读取Word表格到DataSet》有对Office DCOM详细配置介绍,这里不再赘述。 

设计实现

进一步修改模板文件 

通过设置内容控件的一些属性,用程序进行状态和内容的控制,首先修改如下图: 

选中内容控件,点击开发工具选项卡中的属性,自定义标记值,并选中无法编辑内容属性。 

设置和取消保护

这是自动化处理的两个关键方法,Protect 和 Unprotect 方法,示例代码如下:

string ProtectPassword="111";
int ProtectLevel=3;  //3只填写窗体,可参照列表对应,理论是1-4/取得Word文件保存路径
string _lastfile="";  //模板文件的路径object filename = _lastfile;//创建一个名为WordApp的组件对象Word.Application WordApp = new Word.Application();//创建一个名为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);//启动强制保护
WordDoc.Protect((Word.WdProtectionType)ProtectLevel, Type.Missing, ProtectPassword);//停止保护WordDoc.Unprotect(ProtectPassword);

 通过保护机制的撤销与设置,实现由系统对关键内容的修改。

遍历WORD内容控件

ArrayList ranges = new ArrayList();  //备份Range对象
ArrayList rangetexts = new ArrayList(); //备份Range对象的文本内容
//遍历内容控件
foreach (Word.ContentControl cc in WordDoc.ContentControls)
{
//判断格式文本内容控件,并判断自定义属性if (cc.Type == Word.WdContentControlType.wdContentControlText && (cc.Tag=="tag1")){cc.MultiLine = true;             //允许多行内容cc.LockContentControl = false;   //解除锁定内容cc.LockContents = false;         //解除锁定控件cc.Type = Word.WdContentControlType.wdContentControlRichText;  //设置富文本控件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++;
}

总结 

以上是实现的一些关键方法和属性,总体的设计思路即遵循以下流程:

1、自定义控件的TAG属性,以标识程序控制识别,如TAG1为申请人标识,TAG2为审批人标识

2、在流程节点读取对应的标识,备份内容,然后删除控件,以防止再次修改填写的内容

3、在删除控件的光标位置,恢复原录入内容,以保持文件内容的完整性,以备下一节点审批

另外,我们还可以操作WORD的一些变量来满足应用的扩展,示例代码如下:

string DocVar_Value = "123";
//遍历WORD变量foreach (Word.Variable ov in WordDoc.Variables){if (ov.Name == "Sys_Custom_DocVar")  //判断变量名称,假设为 Sys_Custom_DocVar{// ov.Value  可访问的值ov.Delete();   //找到要设置的变量,删除}}
//添加WORD变量WordDoc.Variables.Add("Sys_Custom_DocVar", DocVar_Value);

这些选项都可以根据实际的业务进行扩展,我们可以充分发挥自己的想像来进行设计,这里仅作参考,欢迎大家评论指教!

这篇关于C#实现基于Word保护性模板文件的修改的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/633939

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n