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

简介: C#实现基于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);

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

相关文章
|
1月前
|
XML C# 开发工具
C# 删除Word文档中的段落
【11月更文挑战第3天】本文介绍了两种方法来操作 Word 文档:一是使用 `Microsoft.Office.Interop.Word` 库,适用于 Windows 环境下操作 Word 文档,需引用相应库并在代码中引入命名空间;二是使用 Open XML SDK,适用于处理 .docx 格式的文档,通过引用 `DocumentFormat.OpenXml` 库实现。文中提供了示例代码,展示了如何打开、删除段落并保存文档。
|
2月前
|
存储 C#
【C#】大批量判断文件是否存在的两种方法效率对比
【C#】大批量判断文件是否存在的两种方法效率对比
43 1
|
2月前
|
XML 存储 缓存
C#使用XML文件的详解及示例
C#使用XML文件的详解及示例
98 0
|
4月前
|
监控 安全 C#
使用C#如何监控选定文件夹中文件的变动情况?
使用C#如何监控选定文件夹中文件的变动情况?
119 19
|
4月前
|
编译器 C# Windows
C#基础:手动编译一个.cs源代码文件并生成.exe可执行文件
通过上述步骤,应该能够高效准确地编译C#源代码并生成相应的可执行文件。此外,这一过程强调了对命令行编译器的理解,这在调试和自动化编译流程中是非常重要的。
307 2
|
4月前
|
C# 图形学 数据安全/隐私保护
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
|
4月前
|
C#
C# 写日志文件
C# 写日志文件
46 0
|
7月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
204 3
|
28天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
32 3
|
3月前
|
API C#
C# 一分钟浅谈:文件系统编程
在软件开发中,文件系统操作至关重要。本文将带你快速掌握C#中文件系统编程的基础知识,涵盖基本概念、常见问题及解决方法。文章详细介绍了`System.IO`命名空间下的关键类库,并通过示例代码展示了路径处理、异常处理、并发访问等技巧,还提供了异步API和流压缩等高级技巧,帮助你写出更健壮的代码。
46 2