呼呼ozZ 2014-03-07
工作中经常用到各种导出WORD、EXCEL、PPT所以做出了通用半自动化的功能,由实施人员去实施这些,可以不写代码实现所需业务的导出,下面简单介绍一下设计思路poi+freemarker+jacob+xml。
导出word设计思路:将word模板里需要插入动态数据的位置用_____(横线)代替,如果数据是图片的话需要插入一个空图片,然后另存为xml,打开xml,在使用${}参数的形式替换相应的横线,在程序里通过sql查询出数据,根据sql列别名使用freemarker将数据替换到模板的参数中。这种方式可以处理包含图片的多页复杂表格。
导出excel设计思路:将excel中需要插入动态数据的位置清空,然后在第一行的第一列中以逗号分割写入一个或是多个sql语句别名,然后隐藏第一行,在导出时候使用poi读入模板文件,将sql结果根据要插入位置的首行和首列以矩形的方式插入到excel中,实现导出结果,支持多个sheet页和一个sheet中的多个表格。
导出ppt设计思路:将ppt模板里需要插入动态数据的位置用${}参数替换,通过poi读入ppt模板,将普通${}参数通过poi来替换为sql查询的真实数据,针对包含excel数据表和图表的情况有2种解决方案,首先在ppt中插入excel对象做好图表模板:1.poi+aspose组件实现,将sql查询结果数据通过poi存入模板中,然后需要用aspose将数据集转换为图片流,再通过poi的刷新图片api存入。这样就可以完成正常的导出操作了,这种方式优点:支持线程并发、跨平台、性能好,缺点:java版收费、显示的图片内容偏小。2.poi+jacob+office宏组件实现,将sql查询结果数据通过poi存入模板中,然后通过jacob调用预先写好的office宏,宏内容就是自动点击ppt每个页面的图表相当于利用office自带的点击图片就能刷新图片功能实现图像的更新。这种方式的优点:免费、图片大小一致,缺点:只支持win系统、不支持多线程、服务器端需安装office2013并做一些设置、性能差。宏代码需要自己录制。
整合设计思路:可以将以上3个功能进行整合,做一个文件上传下载管理功能模块,然后每种导出模板文件对应的是2个文件,其中一个是word、excel、ppt其中一个模板,另外一个是写sql语句的xml文件,这个可以和valuelist组件整合或是自定义bean通过spring和xml整合,将1个模板对应的多个sql语句写在xml文件里,如果需要额外的一些设置可以扩展xml文件标签和对应的类属性。可以根据不同分类目录下上传的不同模板,根据数据库上传记录实现自动生成相对的导出页面功能。最终实现只需要改好导出的模板文件以及在xml模板中写sql就可以实现各种自已定义导出功能。省去了开发成本。