最近的项目里遇到这样一个需求:WebForm系统里客户在奖金分配完成后,需要将分配结果导出成纸制,以做备份.一开始这个需求很简单,使用如图-1所示的方式,拼接好htmltable字符串以后,也是可以导成Excel文件,然后客户再打印出来. 这种方式本身有不好的地方,就是生成Excel文件并不是标准的Excel文件.
图-1
结果客户又提出,需要将每个职工的手工签名图片,也一并导出并打印出来.额,想了想,用这种方式恐怕不能实现.改变思路,还好项目组里使用了Lodop的 Web打印控件,顺便给这个控件做下广告,在Web打印控件里,它确实非常强大,推荐大家使用,我的另一篇贴子对此控件有所介绍,欢迎大家阅读
使用这个控件,在拼接htmltable字符串时,只须将图片处理为
这种方式就可以了,也是可以实现图片一并导出的.到此,以为可以清静一段时间了.如图-2所示
图-2
结果过了一个星期,客户又说,能不能再加个Word文档里的页脚,还有最好导出来可以实现编辑.额,客户是不是觉得我们搞软件开发的太闲了,找点事情给我们做呢?
带着这个困惑,继续完善他们提出的需求.如果继续使用这个打印控件的话,页脚的问题可能可以解决,但要实现可再编辑,比如修改标题之类的,恐怕就不可以了.不如直接导成Word文件,让他们自己调整布局,修改标题之类的,岂不是一劳永逸.
微软提供一个DLL文件,是非可视化操作Word文档的,看了一遍代码,感觉比较复杂,而且它在进程控制方面也不是很好,继续寻找.
还好,最后还是找到了另外一个控件,就是我今天要推荐给大家使用的控件Aspoe.Word控件,简单说,它也是一款非可视化的操作Word文档的类库,功能确实非常强大,而且,它可以在不安装Office的情况下,也可以实现对Office文档进行编辑.
好了,废话不多说了.我们首先还是要制作一个模板,模板制作是有规则的,如图-3所示
图-3
说明
1. 表格里表示多条数据,图标列表示可以将图片导进来
2. 每个关键字,都是以{MERGEFIELD开头,以MERGEFORMAT}结尾的
3. TableStart:toolbar关键字,表示toolbar表开始循环
4. TableEnd:toolbar关键字,表示toolbar表结束循环
5. 图标中的Image:picname,表示导出的是图片,picname是图片的完整路径就可以,类库本身会将图片自动读进来的.我们也不必先将图片转进二进制再导进来
6. 操作员和操作日期的关键字,是处理单个字段的
OK,现在我们来看看代码如何编写?如图-4和图-5所示
图-4
图-5
说明
1. 首先要读取Word模板文件,就是如图-3所示的文件
2. 取待导出数据,本示例中是select buttonname,button,picname from ad_toolbar,注意生成的DataTable对象,它的TableName就是模板文件中的toolbar,它是通过这个识别的.
3. picname的路径要填写完整
4. 使用doc.MailMerge.ExecuteWithRegions()方法即可,它有几个重载方法,可加载DataSet或DataTable
5. 加载单条栏目值的方式也比较简单,直接替换即可
6. 增加页脚的方式,代码这样写就可以了,最后保存即可.注意doc.Save()方法的最后一个参数,SaveFormat,它是一个枚举,支持很多种文件格式
看下最终导出的文档,如图-6所示
图-6
园子里有几篇类似的文件,大家也可以参考下,地址如下,它使用的是书签方式,而且这个地址里提供的这个类库的破解版下载,嘿嘿.这里偶就不提供了
http://www.cnblogs.com/sendrylee/archive/2010/04/01/1702463.html
至此Word文档的导出已经介绍完了,导出就需要有导入,接下来我们再使用这个控件实现导入Word文档,其他也比较简单,我们先看看要导入的文档内容.如图-7所示
图-7
文档内容比较典型,有多行文字,也有表格,表格里也有文字.当然图片也是可以导进来,需要二进制转换一下才可以,本示例中没有提供.我们直接看导入的代码好了,如图-8所示
图-8
从这个类库提供的类来看,有点html dom操作的意思,这种方式比较简单,大家只要注意ChildNodes结点的类型就可以了,看下导进来的数据,如图-9所示