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);

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/243126.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VC++中使用OpenCV进行形状和轮廓检测

VC中使用OpenCV进行形状和轮廓检测 在VC中使用OpenCV进行形状和轮廓检测,轮廓是形状分析以及物体检测和识别的有用工具。如下面的图像中Shapes.png中有三角形、矩形、正方形、圆形等,我们如何去区分不同的形状,并且根据轮廓进行检测呢&#…

【Git】常用的Git操作集合

常用的Git操作集合 1. 分支操作1.1 查看本地所有分支git branch 1.2 查看所有分支(包含本地远程仓库)git branch -a 1.3 切换分支git checkout test 2. 常用基本操作2.1 查看 git 各存储区内(文件)状态git status 2.2 查看工作区与暂存区文件差异git dif…

【记录】解决 git 仓库突然出现连接失败

问题描述 今天在 push 代码代码的时候突然发现无法 push(但是我可以正常打开 Gihub),这可不行,我可是 git 的重度使用者😍,我所有的代码都托管在了 Github 上,没有它我的日子怎么活啊!!&#x…

2024最新版Python 3.12.1安装使用指南

2024最新版Python 3.12.1安装使用指南 Installation and Configuration Guide to the latest version Python 3.12.1 in 2024 By Jackson Python编程语言,已经成为全球最受欢迎的编程语言之一;它简单易学易用,以标准库和功能强大且广泛外挂…

C++-类和对象(3)

1. 再谈构造函数 1.1 构造函数体赋值 我们在创建一个对象时,编译器会调用该对象的构造函数对该对象的成员进行初始化。 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;} private:int _year;int _month;int _day…

【SpringCloud Alibaba】 介绍及微服务模块搭建

文章目录 SpringCloud Alibaba 介绍主要功能组件 微服务环境搭建案例准备技术选型模块设计微服务调用 创建父工程创建基础模块1、创建 shop-common 模块2、创建实体类 创建用户微服务1、创建pom.xml2、编写主类3、创建配置文件 创建商品微服务1、创建一个名为 shop-product 的模…

圆的参数方程是如何推导的?

圆的参数方程是如何推导的? 1. 圆的三种参数表示2. 三角函数万能公式3. 回到圆的参数方程1. 圆的三种参数表示 已知圆的第一种参数方程为: x 2 + y 2 = r x^2+y^2=r x2+y2=r   圆的图像如下: 通过上图,不难理解,圆的参数方程还可以用三角函数表示,也就是第二种参数表…

mac 下 通过 docker 安装 es

1、安装 docker a、使用 Homebrew 安装 brew install --cask --appdir/Applications docker b、安装包安装 1、安装包下载地址:Install Docker Desktop on Mac | Docker Docs 根据自己的笔记本型号选择,我这边选择的是 intel chip 2、下载安装即可&…

CPMS靶场练习

关键:找到文件上传点,分析对方验证的手段 首先查看前端发现没有任何上传的位置,找到网站的后台,通过弱口令admin 123456可以进入 通过查看网站内容发现只有文章列表可以进行文件上传;有两个图片上传点 图片验证很严格…

pip install yaml安装失败解决方法

pip install yaml 安装失败 解决方法: pip install PyYAML

kotlin $ (字符串模版)的使用

$ 在kotlin 中当做字符串模版使用,作用就是在字符串里面识别自己定义的字符 例如打印一个字符 这个时候编译就提示我们使用字符串模版的是个 $ 的作用就是识别字符串里面的i 字数有点少了,在写一个demo private fun String.appendArchive(): String …

【蓝桥杯冲冲冲】动态规划初步[USACO2006 OPEN] 县集市

蓝桥杯备赛 | 洛谷做题打卡day13 文章目录 蓝桥杯备赛 | 洛谷做题打卡day13题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示样例说明数据规模与约定 思路:方程: 题解代码我的一些话 [USACO2006 OPEN] 县集市 The County Fair 题目描述 每年…

linux中用户及用户组信息

1,linux通过用户名和口令来验证用户的身份。 2,几个用户可以组成一个用户组。 3,useradd工具添加用户,groupadd命令添加用户组。 4,history 命令查看用户在Shell中执行命令的历史记录。 5,userdel命令删…

基于人工蚁群、蚁群、遗传算法的多目标任务分配

matlab2020a可运行 基于人工蚁群、蚁群、遗传算法的多目标任务分配资源-CSDN文库

搜索引擎优化:利用Python爬虫实现排名提升

什么是搜索引擎优化(SEO) 搜索引擎优化(SEO)是通过优化网站内容和结构,提高网站在搜索引擎中的排名,从而增加网站流量和曝光度的技术和方法。SEO的目标是使网站在搜索引擎结果页面中获得更高这个过程包括吸…

uniapp h5 生成 ubuntu桌面程序 并运行方法

uniapp h5 生成 ubuntu桌面程序 并运行方法,在window环境下开发,发布到ubuntu桌面,并运行 1、安装Nodejs 安装包官方下载地址:https://www.nodejs.com.cn/ 安装完后cmd,如图,即安装成功 2、通过Nodejs安装 electron…

5. 函数调用过程汇编分析

函数调用约定 __cdecl 调用方式 __stdcall 调用方式 __fastcall 调用方式 函数调用栈帧分析 补充说明 不同的编译器实现不一样,上述情况只是VC6.0的编译实现即便是在同一个编译器,开启优化和关闭优化也不一样即便是同一个编译器同一种模式,3…

74.MySQL 分页原理与优化(下)

文章目录 前言一、一次分页查询的演进二、分页数据在不同页反复出现的坑 前言 上一篇文章介绍了分页原理与优化:73.MySQL 分页原理与优化(上) 但分页还有一个“坑”需要注意,本文细细道来,可能很多朋友都踩过这个坑还…

第15届蓝桥杯嵌入式省赛准备第二天总结笔记(使用STM32cubeMX创建hal库工程+按键输入)

一.查看电路图 按键是使用的PB0,PB1,PB2,PA0四个引脚,然后使用CubeMX配置引脚,4个脚都配置为输入模式和上拉。 程序生成之后把不用的删掉,需要的留下,这里我把函数名改了。 然后写按键扫描读取程序,这里参考的正点原子…

ArcGIS初始化软件界面Normal.mxt

ArcGIS有时候永久了,或者呢突然不自觉软件界面乱了,或者一些窗口打开却找不到! 这时候可以去删除arcgis的界面配置文件,Normal.mxt 删除后再打开软件,软件界面就会回到初始化设置了! 文件所在的路径&…