BizTalk开发系列(三十三)BizTalk之Excel终极解决方案

[>>> 更多<BizTalk开发系列>文章 ]

    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表格关联的截图。

 ExcelMap

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

    Resume

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

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

Schema

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

8

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

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

RecPipe

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发布。欢迎下载使用。如果有什么问题或建议欢迎跟我联系:cbcye@live.com 


 

 

posted on 2008-12-22 01:07 Gary Zhang 阅读(2510) 评论(17) 编辑 收藏

评论

#1楼  回复 引用 查看   

你老最近没咋理我了 = =
2008-12-22 06:27 | 冰の酷龙      

#2楼  回复 引用 查看   

在Excel Component中,如何使Excel Stream根据XML Mapping自动化生成XML Stream呢?这个Process的Key Point是什么,能share吗?
2008-12-22 10:41 | 鸡尾虾的壳      

#3楼  回复 引用 查看   

我想知道,biztalk到底要多少钱一套?
2008-12-22 12:54 | AlexLiu      

#4楼  回复 引用 查看   

biztalk很贵
2008-12-22 14:50 | 亚历山大同志      

#5楼  回复 引用 查看   

不知道Excel还有这个有趣的功能。
跟鸡尾虾同问,怎么从Excel Stream得到xml stream的?是不是Excel组件有能把带有xml映射的excel的workbook导出为xml的功能?
2008-12-22 15:13 | chnking      

#6楼[楼主]  回复 引用 查看   

@冰の酷龙
不好意思哈,公司这边上网很不方便。只有晚上回家才能上网。不过有事的话可以通过Email联系。我每天都会Check邮箱的:) 实在抱歉...
2008-12-22 21:07 | Gary Zhang      

#7楼[楼主]  回复 引用 查看   

@鸡尾虾的壳
这个Solution的Key Point主要是对XML映射的了解和应用。关于Pipeline开发这一块只是BizTalk实现而以。请允许我保留一段时间,准备到时以组件的形式发布。
2008-12-22 21:09 | Gary Zhang      

#8楼[楼主]  回复 引用 查看   

@AlexLiu
微软官方的站点有提供报价信息:http://www.microsoft.com/biztalk/en/us/pricing-licensing.aspx 
2008-12-22 21:13 | Gary Zhang      

#9楼  回复 引用 查看   

研究的越来越广了!(Y)
2008-12-28 15:03 | 西煞魄工人      

#10楼  回复 引用   

如何往xmldocument中添加同级结点?
xml如下
<ns0:Root xmlns:ns0="http://MyTest_OrderItem.OrderItem">
<Header>
<WorkOrderID>10</WorkOrderID>
<ProductID>10</ProductID>
<OrderQty>10</OrderQty>
</Header>
<Details>
<WorkOrderID>10</WorkOrderID>
<ProductID>10</ProductID>
<OperationSequence>10</OperationSequence>
<LocationID>10</LocationID>
</Details>
</ns0:Root>
需要变成:
<ns0:Root xmlns:ns0="http://MyConveyTest.OrderItem">
<Header>
<WorkOrderID>10</WorkOrderID>
<ProductID>10</ProductID>
<OrderQty>10</OrderQty>
</Header>
<Details>
<WorkOrderID>10</WorkOrderID>
<ProductID>10</ProductID>
<OperationSequence>10</OperationSequence>
<LocationID>10</LocationID>
</Details>
<Details>
<WorkOrderID>20</WorkOrderID>
<ProductID>20</ProductID>
<OperationSequence>20</OperationSequence>
<LocationID>20</LocationID>
</Details>
</ns0:Root>
总是出异常,不知道有没有好办法?(使用C#变化)
Details是个maxoccurs为unbound的,header只有一个。
2008-12-30 09:05 | 极度寒[未注册用户]

#11楼[楼主]  回复 引用 查看   

@极度寒
你是要在Map里面做还是?还有是要根据什么来判断要添加几个节点?在Map做的话可以使用脚本来实现复杂的功能。
使用C#做的话添加节点应该可以吧?
2008-12-30 09:55 | Gary Zhang      

#12楼  回复 引用   

我使用C#做的时候,先做的测试。因为有<ns0:Root>,所以会载入失败。
请问如何自动配置FlatFile?
我现在所有的FlatFile的配置都是存在DB里面,和客户约定好的。
有些客户的资料栏位是用','分隔,有些客户的是用'|'分隔。
接收端口不想手动配置,因为在Db里面有关于接收位置的所有信息,想依据配置表自动搜索每个文件夹,找到文件后再做处理。
按照Webmethod的方法是只要提供配置信息,他会自动去轮询每个文件夹,并且把文件的内容读取为string,去除无效的字符(空格,空行之类)
可是biztalk 需要FlatFile管道才能接收txt,管道只能按照Schema接收,所以要实现自动配置,并且要去除无效字符。
能不能实现呢?
2008-12-31 11:32 | 极度寒[未注册用户]

#13楼[楼主]  回复 引用 查看   

@极度寒
如果Flat File Component可以解决你的问题。只是组建的配置问题的话。是否可以从这两个方面去考虑一下。
1. 使用独立的程序通过BizTalk提供的API根据数据库的内容自动创建接受位置的属性包括管道的属性。
2. 如果你还是想在处理过程中在去查找配置信息的话。可以手动编写管道组件,通过继承平面文件拆装类来实现。具体的可以参照帮助文档的Sample.
2009-01-02 19:42 | Gary Zhang      

#14楼  回复 引用 查看   

收藏!@
2009-02-18 14:53 | PENGYQ      

#15楼  回复 引用   

与Excel版本没关系吗?我用的是2003。但输出不了XML。中间生成文件出现部分乱码。
2009-04-11 17:09 | 努力超人[未注册用户]

#16楼[楼主]  回复 引用 查看   

@努力超人
我使用我开发时使用的用例测试的时候是没有问题的,包括Excel 2007和2003. 你可以试一下在Excel导出XML看有没有同样的问题。
2009-04-13 09:35 | Gary Zhang      

#17楼  回复 引用 查看   

强烈建议:Excel + MOSS + BizTalk实现此表单提交过程。
2009-04-21 00:25 | 西煞魄工人      

导航

公告


本Blog所有内容,若无特殊说明,均为原创。如需转载,请注明作者和出处,且保证内容完整!如有其他用途,请联系作者: cbcye@live.com













昵称:Gary Zhang
园龄:4年1个月
粉丝:63
关注:2

我的标签

随笔分类(89)

随笔档案(117)

BizTalk资源

IBM Learning Resource

积分与排名

  • 积分 - 128953
  • 排名 - 773

最新评论

阅读排行榜