word、excel文档内容更新技术方案

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

需求背景

惯例先说下背景。
生产、研发业务上往往使用大量word和excel文档来作为资料载体如操作规程、控制手册、卡片……这些文档会反复使用到一些设备、工艺等参数数据。参数属性主要是名称、编码、正常范围、报警上下限、单位等这些参数对应的属性值是会发生变化的。
文档中使用参数的地方中文的表达方式多种多样人来阅读文档没啥问题。但是引用参数的文档实际没有存在“物理”上的关联关系。当参数属性值调整时需要更新相应的文档这时候就出现问题了。因为没有关联关系没有技术手段自动识别只能人工一点点改文档这工作量是相当大找到需要修改的地方就不容易并且很容易发生漏改、误改问题从而导致不一致的问题。

解决方案

软件系统实现

很明显这是一个模板技术的应用场景。解决该问题常见的方案是通过软件系统来实现实现思路如下
1.对参数进行统一管理作为管理的基础数据。实现上没什么好说的常规的应用开发增删改查加其他必要的逻辑处理可通过工作流实现参数的修订与审批可通过平台实现数据权限控制。
2.对文档进行规范化处理形成文档模板通过模板技术将参数数据填充进模板生成最终的文档。简单点说就是把文档中的使用参数的部分使用约定好的标记来占位如${HABC1234.name},然后程序替换。HABC1234是参数的唯一性编码name是参数对应的名称。
3.引入全文搜索技术使用elastic search对文档建立索引实现按参数编码检索该参数被哪些文档文档使用到了这里实际检索的是文档模板而不是最终的文档模板里有参数编码信息最终文档已经被数据替换了。

以上基本能解决需求了在这基础上还可以做一些小工作让业务用户使用起来更方便例如通过扩展参数属性方式对参数的基本属性进行组合如将常用的两个属性名称和编码组合到一块去文档中使用时直接引用这个新属性 H A B C 1234. n a m e A n d C o d e , 而不需要在文档里写 {HABC1234.nameAndCode},而不需要在文档里写 HABC1234.nameAndCode,而不需要在文档里写{HABC1234.name} {HABC1234.code}。
同理可以进一步设置一些预置的格式化片段如
编码HABC1234
名称风机温度
范围20-50摄氏度

同样的也可以对属性进行运算例如求合理范围的平均值。

office方案

通过软件系统解决有诸多优点比如使用简单、管理规范、可扩展性高。但不得不说软件系统也有一些缺点比如成本高交付周期比较长。上面提到软件系统是常见方案但放到特定的背景下未必是最优方案。这里说一种轻量级的解决方案即通过office自身功能来实现。

开始的思路依然是采用模板使用office自带的脚本语言 vba来实现占位符的替换。在word中占位符如何生成找了下域对象发现对应的对象。看来下标签也不是干这事用的。经过长时间的搜索发现word的一个生僻功能-链接可以比较好的解决数据引用、关联和更新功能。说实话这个功能以前从没用过并且在word的菜单里找了半天居然没有菜单与之对应。

实现思路如下
1.使用excel作为参数的数据存储相当于软件系统中的“数据库”。
2.引用到参数的文档通过office自身功能链接到excel的单元格。
3.参数数据更新后通过office文档的更新链接功能来实现文档同步更新。

下面来说说具体链接怎么用。

先做一个存储参数数据的excel表命名为“工艺参数清单.xls”,输入示例数据如下
在这里插入图片描述
选中其中A1单元格复制。
然后新建一个word文档命名为“操作规程说明.docx”打开在word工具栏中选择“选择性粘贴”

在这里插入图片描述

在弹出窗口中将默认选中的“粘贴”变更为“粘贴链接”选择“无格式文本”确定效果如下
在这里插入图片描述

这时候excel单元格内容已经输出到word文档中了并且关联了源数据默认设置是自动更新当excel里内容变化后excel和word都处于打开状态word文档会自动更新。不过当word文档处于关闭状态这个更新还是需要一个触发打开word文档后会自动检测是否有链接如有则弹出对话框选择选择是即可完成更新。
在这里插入图片描述

按照上述操作在word文档中已经建立了到excel单元格中数据的关联这个连接实际保存在word文档中也就是单向链接excel中不知道被哪些文档引用过但word中知道自己引用的数据源是哪个。

在链接上右键点击可出现菜单“更新链接”以及“链接的工作表对象”前者作用是看名字即可后者可继续展开二级菜单选择编辑链接 或 打开链接 会自动打开对应的excel表。选择“链接…”则会显示本文档使用的所有链接清单。

在这里插入图片描述

从上图可以看出链接的实现机制是关联了磁盘上的excel文件并且使用了绝对路径单元格的引用遵循了sheet名+行号+列号的方式。

以上操作也适用于excel类型的文件链接到另外一个excel文件的单元格操作上略有差异比如选择性粘贴的时候弹出的对话框中粘贴链接在左下角如下图

在这里插入图片描述

粘贴后可看到该链接的形式如下
在这里插入图片描述

查看所有链接在工具栏里找到了对应功能按钮来打开对话框。

在这里插入图片描述

通过以上方式实际已经实现了维护参数基础数据并保持文档自动更新的目的。
但是仅仅做这些其实还不够需要一些额外的工作来弥补这种轻量级实现方式的一些不足。

首先关联是引用了绝对路径因此要求作为数据源的excel文件磁盘位置和文件名均需要保持不变。特别是多人协作的时候需要每个人的磁盘存放位置也一致比如都在C盘或D盘建一个根目录来统一存放这点需要从管理上来规范。

其次关联是单向的如果是参数文件修改了其实并不知道哪些文档引用了这些参数总不能把文档全部手工打开一遍来完成更新吧文档数量如果是几千份是不是就疯掉了这时候就需要使用vba脚本写个循环遍历所有文档调用更新链接操作这个脚本我没有实际写但关键的技术问题做了个验证。

Sub updateField()
    Dim aField As Field
    Dim aStory As Range
    ''' Update all fields in the document
    For Each aStory In ActiveDocument.StoryRanges
    For Each aField In aStory.Fields
    aField.Update
    MsgBox (aField.Code)
    Next aField
    Next aStory

End Sub

以上测试代码能正常完成数据更新结合目录文件遍历就能实现一个完整的脚本了。从这里也可以看出链接本质上是word中域的概念跟目录、页码等是一回事。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6