Excel作为优秀的客户端数据处理程序得到了广泛的应用. 由于其简单又强大的功能在很多公司或个人的数据处理中占用非常重要的位置. 而BizTalk作为微软的SOA主打产品虽然免费提供了很多Adapter支持各种协议及应用程序. 不过非常可惜没有提供对富客户端程序Excel的"原生态"支持. 所以我们只能自己查找解决办法。

应用程序对Excel的支持网上已经有很多解决方案的,一部分是使用ODBC的excel驱动将Excel作为数据源进行处理,对于规范数据表之类的Excel文档这种方法比较适用. Karen之前也发布了一个BizTalk Pipeline 的Excel组件 . 另外对于复杂类型的Excel文档有一种解决方案是使用Excel API操作Excel单元格进行处理. 但是这种方法不能适应快速开发的需求.当客户的Excel模板发生变化的时候就需要编写相应的代码.费时又费力.

那么什么才是好的解决方案呢? 大概列了几项期望:

  • 快速友好的开发方法.
  • 较强的校验功能
  • 保留Excel原有的强大功能.
  • 终端用户良好的体验.

接下来将要请我们的主角上场- “XML 映射”. XML映射允许将自定义的Schema添加到工作薄,提高了对使用本机 XML 的支持。这样可以创建一个 XML 映射,用于在导入或导出数据时使数据变得更有意义。也可以导入符合自定义 XML 词汇或架构的数据,然后使用相同的Schema将该数据写回去。下图是一张将XML Schema节点与Excel表格关联的截图。

了解了XML映射我们以一个案例的形式来更直观的介绍一下在BizTalk在对于Excel的解决方案。我们都知道很多公司都要求新入职的员工要按照公司 统一的简历模板重新填写一份个人简历. 下面是一个通过简历模板填写完的Excel文档.我们希望员工通过邮箱或Web Site提交文档. 然后通过BizTalk系统将简历信息存储到数据库或者发送到相应的目录。

要实现这样的目标,使用ODBC的Excel驱动肯定是不行的,因为它不是有一个规范的数据表。如果使用API对操作单元格的话开发量又太大。而且如果模板需要变动的话那么还得重新开发程序。有了XML映射我们的过程会简单而且有趣很多。

1.首先我们创建一个Schema文档定义我们需要的节点及其结构。如下图所示。

2. 创建一个Excel文档,为了给终端用户更好的使用体验我们还要对文档增加一些必要的说明和提示。创建完之后加载XML Schema并且将Schema的节点与文档的单元格关联起来。下图是一个GIF动画,展示了如何将Schema节点与单元格关联起来的过程。

3. 到此Excel的模板就制作完成了,我们只需要把这个模板分布给用户就可以了。

4. 下面我们就要来在BizTalk服务器上作些开发了。由于BizTalk没有提供对于Excel文档的运行因此我们需要根据Excel API开发一个Pipeline 组件在存储到MessageBox之前将Excel按照XML映射将Excel Stream转为XML Stream. 下图为Excel Component在Receive Pipeline设计时的应用。

5. 部署BizTalk 应用程序之后,我们就可以开始测试我们的程序。首先们还是一样使用发送和接收文档适配器。来简单的实现将Excel处理成XML的过程。当我们把Excel文档拷贝到接收目录之后我们可以在发送目录看到如下内容的XML文档。

生成之后的XML Document

6. OK,我们的最小原型实现了。其他的业务流程和发送目标可以按照实际需要实现。

7. 关于文档内容的校验,我们可以结合Schema的验证功能XML进行校验。这一部分的内容可以参考:BizTalk开发系列(十三) Schema设计之值约束

总结

虽然今天只介绍了XML映射在BizTalk对于Excel文档解析方面的应用,但XML映射不仅可以应用到BizTalk应用程序,也不仅在 BizTalk对于Excel的接收和解析方面。还可以在Asp.NET等其他应用程序和将XML文档输出到Excel等情况。总之在Excel与XML 相关的解决方案中XML映射给我们带来了非常灵活和良好的体验。

[2008.12.28 更新]

本解决方案的Excel管理解析组件BizExcel Alpha版已经在Codeplex发布。欢迎下载使用

BizTalk开发系列(三十三)BizTalk之Excel终极解决方案的更多相关文章

  1. BizTalk开发系列(二十三) BizTalk性能指标参考

    BizTalk项目目前比较少,使用的客户也不多.大多只知道BizTalk是一个不错的产品,是Microsoft SOA平台的核心产品,不过还没有将其应用到生产环境.还有一些客户对BizTalk的性能不 ...

  2. BizTalk 开发系列(四十一) BizTalk 2010 BAM 安装手记

    使用64位系统可以支持更大的内存,现在服务器基本上都使用64位系统.微软从Windows Server 2008 R2开始服务器版的操作系统也只支持64位了,不过对于像BizTalk这种“繁杂的东西” ...

  3. BizTalk开发系列(三十八)微软BizTalk Server定价和许可[解读]

    做BizTalk的项目一段时间了,但是对BizTalk的价格和许可还不是很了解.给客户设计解决方案时大部分产品都是直接按照企业版的功能来设计,很 少考虑到价格和许可方面的因素,以为这个不是我们的事情或 ...

  4. BizTalk开发系列(三) 单机环境下的BizTalk Server 2006 R2安装

    大部分的开发环境都是在单机环境下进行的,今天整理了一下BizTalk Server 2006 R2在单机环境下的安装步骤. 1. 软件需求 在独立服务器中完整安装BizTalk Server 2006 ...

  5. BizTalk 开发系列(三十九) BizTalk Server 2009技术概览

    BizTalk Server 2009已经发布一段时间了,之前Beta版发布的时候也写过一篇文章<BizTalk Server 2009 Beta初体验>, 当时比较了2006 R2与20 ...

  6. BizTalk开发系列(三十七) 性能监视器在BizTalk性能测试中的使用

    BizTalk应用程序的性能测试和分析是一个非常重要的过程,因为BizTalk的应用程序在Run-time时受部署结构.消息请求数量和消息大小等 的影响很大,因此无论是简单还是复杂的的应用都需要在部署 ...

  7. BizTalk开发系列(三十五) TCP/IP 适配器

    BizTalk 的TCP/IP适配器最初是为英国的保健行业开发.该适配器属于BizTalk进程内适配器,将消息通过TCP/IP 套接字符串在BizTalk服务器与远程客户端间进行通讯. TCP/IP适 ...

  8. BizTalk开发系列(三十四) Xpath

    XPath 是在 XML 文档中查找信息的语言,在BizTalk的开发中应用非常广泛,当然你可以不必先学Xpath再去学BizTalk.但是如果对Xpath有一定了解的 话,在很多应用下会使你的开发更 ...

  9. BizTalk开发系列(三十二)浅谈BizTalk主机性能优化

    很多BizTalk的项目都要考虑到性能优化的问题,虽然BizTalk采用多线程处理消息的,大大提高了程序效率.但默认情况下 BizTalk的主机有很多阻止参数会控制BizTalk对服务器的资源使用率, ...

随机推荐

  1. 基于netty的微服务架构

    基于netty的微服务架构 微服务一篇好文章 http://san-yun.iteye.com/blog/1693759 教程 http://udn.yyuap.com/doc/essential-n ...

  2. 泛型容器单元(Generics.Collections)[2]: TQueue<T> 队列列表

    TQueue 和 TStack, 一个是队列列表, 一个是堆栈列表; 一个是先进先出, 一个是先进后出. TQueue 主要有三个方法.一个属性:Enqueue(入列).Dequeue(出列).Pee ...

  3. 疯狂java学习笔记之面向对象(七) - super关键字

    super有以下两大作用: 1.起限定作用:强制去访问父类的成员(Field.方法) 2.起调用作用:指定/显示调用父类的某个构造器 super调用规则: 1.子类构造器总会调用父类构造器一次,默认情 ...

  4. dotnet core 初试两个小问题解决

    1. Setup has detected that visual studio 2015 update 3 may not be completely installed 在安装 DotNetCor ...

  5. [转]Modernizr的介绍和使用

    转载自:http://blog.chinaunix.net/uid-21633169-id-4286857.html 传统浏览器目前不会被完全取代,令你难以将最新的 CSS3 或 HTML5 功能嵌入 ...

  6. BZOJ2679 : [Usaco2012 Open]Balanced Cow Subsets

    考虑折半搜索,每个数的系数只能是-1,0,1之中的一个,因此可以先通过$O(3^\frac{n}{2})$的搜索分别搜索出两边每个状态的和以及数字的选择情况. 然后将后一半的状态按照和排序,$O(2^ ...

  7. BZOJ 1925[Sdoi2010]地精部落 题解

    题目大意: 1~n的排列中,要任意一个数要么比它左右的数都大或小,求所有的方案数. 思路: 主要思路:离散. 三个引理: ①在n->n-1的转化过程中,我们删除了一个点后,我们可以将n-1个点视 ...

  8. BZOJ1798[Ahoi2009]Seq 维护序列seq 题解

    题目大意: 有长为N的数列,有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值. ...

  9. ACM 关于521

    关于521 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 Acm队的流年对数学的研究不是很透彻,但是固执的他还是想一头扎进去. 浏览网页的流年忽然看到了网上有人用玫 ...

  10. jQuery Ajax遍历表格,填充数据,将表格中的数据一条一条拼成Jason数组

    $.ajax({ url: baseURL + "InvoiceSale/OnQuotaInvoiceSale", //点击核销单号时,点击核销时,交互的页面           ...