Word自动化局部架构设计(转InfoQ)

简介:

前言

虽然企业中多数项目往往通过自定制的界面和数据载体与后台系统交互,但在办公自动化、电子政务领域仍存在大量面向包括Word在内的电子文档操作。区别于Excel、Access和InfoPath等数据为中心的处理,Word更侧重于对于文章段落内容、格式的操作。

实践中,Office自动化开发中往往要面对下列挑战:

  • Office版本更新快,但用户群更新相对较慢,项目中需要同时兼容多个版本,但Office产品不同版本间接口兼容性经常断裂;
  • 单机版Office软件容易因为格式错误导致运行错误,相关进程不妥善清理很容易破坏文档造成无法修复的问题;
  • 面对日益严峻的信息安全问题,很多企业内网安全策略会禁用Office宏、内嵌脚本和客户端渲染的处理;
  • 第三方Office中间件技术支持力量往往无法保障,尤其是部分开源项目其适用性有限,且经常存在无法绕过的“黑盒”By Design问题,最终不得不放弃该中间件并推倒整个设计重做。

但同时我们也要看到Word自动化处理中的特点:

  • Word提供模板机制,可以通过模板完成绝大部分章节段落以及文稿样式的设计;
  • 尽管原始数据类型差别迥异,但实际Word操作中使用的类型主要是string,图形、图表对象则可考虑集成Visio或Excel完成;
  • 文档数据填充形式相对固定,一般是下列三种情况之一或组合:
  • 操作一系列单独的内容区域;
  • 操作一个表格区域;
  • 操作单一区域。

针对上述特点,为便于重复开发量、便于开发人员访问Word文档须进行局部架构设计。

定义书签

但在此之前,为了简化Word编程,本框架针对Bookmark访问并操作Word,定义方法如下:

1、打开word文件,选择显示Bookmark

2、选择位置,然后插入Bookmark。对于需要操作的表格区域可以选择整个区域后插入Bookmark。

局部架构设计

抽象角度看,Word自动化过程可归并为“读”、“处理”和“写”三个主要过程,其基本工作原理如下:

图:局部架构的工作原理

其中:

  • Reader根据数据文件类型及数据内容特点完成数据提取;
  • Writer根据目标文档类型及数据内容特点完成数据写入;
  • Adapter根据文档处理情景选择Reader和Writer,实现数据和文档的合并过程;
  • Task Scheduler根据处理负载通知Adapter执行处理;(该部分用于扩展Word自动化为后台任务时定制处理过程)。

逻辑组件关系如下:

图:Word自动化处理主要组件

其中:

  • Common.dll保存一些公共功能的编译结果;
  • Automation.dll提供对Office对象的(包括Word)的封装;
  • Integration.Interface.dll则提供外部Adapter的规范性要求以及进一步扩展的基础;
  • 而真正的Adapter则独立在框架外,通过配置IoC加载到执行环境中。

适配器部分

考虑不同项目对Word自动化处置的差异性,设计上将Adapter独立于应用之外,同时将每个Adapter需要执行的操作尽量固定,这样对于常规操作只需调用标准Reader和Writer即可。

(注:此外,考虑到自动化处理中文档内容的差异性,根据项目实践为提高数据的扩展性,一般推荐采用XML形式的数据文件。)

设计上,我们先抽象文档操作对象Adapter的行为接口,定义所需的数据与文档合并(Merge)操作:

图:适配器逻辑结构

其中:

  • IDocumentAdapter定义基本的行为,其内容甚至可以在没有Reader和Writer的环境下完成合并工作,所有行为可以由用户程序独立定义;
  • IGenericDocumentAdapter<TData, TString>则提供基本的操作行为,其中通过泛型参数定义Reader反馈的数据类型以及它对应的字符串类型;
  • DocumentAdapterBase作为实际Adapter的抽象类型,不仅提供对应配置节的内容,同时进一步补充Reader所提取实体内容的泛型参数。

这样,通过对Adapter的三层封装,下游程序开发人员可以根据自动化情形的复杂程度选择适合的扩展基础。进一步,我们对Reader和Writer进行扩展,提供标准情景下标准数据类型的读写操作。

图:Reader部分的逻辑结构

其中:

  • Reader部分默认提供针对实体组(Tabular表格)、具有多属性的单个实体(List列表)和单值实体(String)的读取支持,更复杂数据的读取工作可以通过组合上述Reader类型或直接实现IDataReader接口完成;
  • 为了提供对XML数据的内置支持,提供基于XPath的封装类型。

图:Writer部分的逻辑结构

对于Writer部分:

  • 考虑到表格内容和单值内容均可通过一个Bookmark定位,因此抽象出IBookmarkRangeWriter接口用于提供对这两类Writer的定制操做;
  • 对于多值实体(List),由于它的写入需要一组Bookmark定位,因此抽象出IBookmarkListRangeWriter接口对该类Writer的操作;

自动化部分

在完成了外部调用关系的设计后,我们需要完成Word自动化的核心部分——通过Office Primary Interop Assembly(Office PIA)访问Word的基本操作。

图:项目中引用Office的PIA库

实际使用中,Word对象模型如下:

图:Word Object Model(摘自MSDN Microsoft Visual Studio Tools for the Microsoft Office system (version 3.0) 部分)

其中,Application代表一个WinWord.exe进程,对其打开关闭代价较大,频繁的打开、关闭势必会对后台文档自动化带来较大的运行负载,为此,需要集中控制。而每个Word文档可以通过Document获得引用,然后通过Bookmark检索到对应的区域(Range),进而通过Writer操作Range对象,填充、清除、修改该区域的内容。此外,考虑到类似电子表格的合并操作,往往外部数据记录数量超过Word模板(或文档)表格区域的大小,为此还需增加必要的Add Row方法、Add Column方法,本文示例为了简便,只设计了Add Row方法。

综上,Word自动化部分设计如下:

图:Word自动化部分设计

配置

为了减少客户端程序的工作量,常见的操作参数保存在配置文件中,这样我们定义整个模型的自定义配置节如下:

图:配置对象

其他

虽然直接调用Word PIA接口可以较快的完成一个具体Word自动化处理,但随着用户需求的变化,该类项目往往必须面临经常性的修改,为了尽量将修改控制在局部、提高下游开发人员的使用效率,一般可以通过对局部进行架构建模提升自动化框架的灵活性,而额外的工作量主要集中在抽象出Reader、Writer和根据文档操作目标定义相关的Adapter。

示例

完成上述内容后,我们可以通过三个示例验证上述局部架构的适应性。

示例 1:操作单个多值实体

示例2:操作Word中的表格

为了操作word中的表格,Reader往往可以从数据文件中提取一组多值实体。

示例3:操作Word中的单值对象

下载示例代码

点击下载示例代码







 本文转自 jingen_zhou 51CTO博客,原文链接:http://blog.51cto.com/zhoujg/517142,如需转载请自行联系原作者


相关文章
|
运维 监控 Cloud Native
自动化运维的魔法书云原生之旅:从容器化到微服务架构的演变
【8月更文挑战第29天】本文将带你领略自动化运维的魅力,从脚本编写到工具应用,我们将一起探索如何通过技术提升效率和稳定性。你将学会如何让服务器自主完成更新、监控和故障修复,仿佛拥有了一本能够自动翻页的魔法书。
|
机器学习/深度学习 人工智能 运维
自动化运维在现代IT架构中的关键角色
【7月更文挑战第8天】随着技术的快速发展,自动化运维成为企业追求高效、稳定IT服务的重要策略。本文将探讨自动化运维如何优化工作流程、提升系统稳定性和安全性,以及它在现代IT架构中不可或缺的地位。
104 1
|
9月前
|
Serverless 决策智能 UED
构建全天候自动化智能导购助手:从部署者的视角审视Multi-Agent架构解决方案
在构建基于多代理系统(Multi-Agent System, MAS)的智能导购助手过程中,作为部署者,我体验到了从初步接触到深入理解再到实际应用的一系列步骤。整个部署过程得到了充分的引导和支持,文档详尽全面,使得部署顺利完成,未遇到明显的报错或异常情况。尽管初次尝试时对某些复杂配置环节需反复确认,但整体流程顺畅。
190 3
|
10月前
|
运维 监控 安全
自动化运维的利剑:Ansible在现代IT架构中的应用
在数字化浪潮中,企业对IT系统的敏捷性和可靠性要求日益提高。Ansible,一种简单但强大的自动化运维工具,正成为现代IT架构中不可或缺的一部分。它通过声明式编程语言YAM,简化了系统配置、应用部署和任务自动化的过程,显著提升了运维效率和准确性。本文将深入探讨Ansible的核心特性、应用场景以及如何有效整合进现有IT环境,为读者揭示其在自动化运维中的实用价值和未来发展潜力。
|
10月前
|
运维 Devops 应用服务中间件
自动化运维的利剑:Ansible在现代IT架构中的应用
【10月更文挑战第42天】本文旨在揭示自动化运维工具Ansible如何革新现代IT架构,通过简化配置管理和部署流程,提升效率和可靠性。我们将探索Ansible的核心功能、语言特性以及其在DevOps文化中的角色。文章还将展示如何借助Ansible构建模块化和可重用的配置代码,实现快速迭代与部署,并确保系统一致性。通过阅读本文,运维人员将了解如何利用Ansible优化日常任务,加速产品上线速度,同时提高系统的稳健性。
164 5
|
11月前
|
IDE 开发工具 Python
Python自动化操作word--批量替换word文档中的文字
Python自动化操作word--批量替换word文档中的文字
617 0
|
运维 分布式计算 大数据
自动化运维的利剑:Ansible在现代IT架构中的应用
【7月更文挑战第16天】本文深入探讨了Ansible作为自动化运维工具的核心价值及其在现代IT架构中的多维度应用。我们将通过具体案例分析,揭示Ansible如何优化IT运维流程、提升工作效率,并讨论其在云环境、容器化及大数据处理等领域的创新应用。文章旨在为读者提供一套实用的Ansible应用策略,助力企业构建更加高效、稳定的IT运维体系。
|
弹性计算 运维 Kubernetes
自动化运维的新篇章:容器编排与微服务架构
【7月更文挑战第14天】在数字化转型的浪潮中,企业对运维效率和系统可靠性的需求日益增长。本文深入探讨了自动化运维的最新趋势——容器编排和微服务架构,并阐述了如何通过这些技术提升运维效率、降低系统复杂性以及提高服务的可用性和可扩展性。文章不仅介绍了相关技术和工具的选择,还提供了实际案例分析,旨在为读者提供一套完整的解决方案框架,以适应快速变化的市场需求。
|
C# 开发者 Windows
WPF遇上Office:一场关于Word与Excel自动化操作的技术盛宴,从环境搭建到代码实战,看WPF如何玩转文档处理的那些事儿
【8月更文挑战第31天】Windows Presentation Foundation (WPF) 是 .NET Framework 的重要组件,以其强大的图形界面和灵活的数据绑定功能著称。本文通过具体示例代码,介绍如何在 WPF 应用中实现 Word 和 Excel 文档的自动化操作,包括文档的读取、编辑和保存等。首先创建 WPF 项目并设计用户界面,然后在 `MainWindow.xaml.cs` 中编写逻辑代码,利用 `Microsoft.Office.Interop` 命名空间实现 Office 文档的自动化处理。文章还提供了注意事项,帮助开发者避免常见问题。
854 0
|
运维 应用服务中间件 网络安全
自动化运维的新篇章:Ansible在现代IT架构中的应用与实践
【8月更文挑战第30天】随着信息技术的飞速发展,企业对运维效率和可靠性的要求日益增高。传统的手动运维方式已难以应对复杂多变的IT环境,自动化运维因此成为行业新宠。本文将深入探讨Ansible这一流行的自动化工具,如何通过其简洁的配置管理和强大的多节点部署能力,助力现代IT架构实现高效、可靠的运维管理。我们将从Ansible的核心概念入手,逐步解析其在配置管理、任务执行、应用部署等方面的实战应用,并结合代码示例,展示如何利用Ansible简化日常运维工作,提升运维质量和效率。无论你是运维新手还是资深专家,这篇文章都将为你提供宝贵的洞见和实操技巧。

热门文章

最新文章