非常多的时候,都需要在程序当中生成一些文档,这些文档可能是csv,word,pdf,PPT,xls等文件格式。
生成csv还是比较简单的,但是要生成word,excel就麻烦多了。
当然,Tiny框架也面临这个问题,如何才能帮助开发人员快速生成这些文档呢?
一般来说,现在用java生成Word有如下方式:
POI,iText,当然还有Xml形式。
对于采用POI,iText来说,要生成复杂的Doc文件,其实并不容易。而采用Xml结构生成,去把一个文档生成xml文件,看看里面的内容,估计也会是满头是汗。
Tiny构建者,认为,生成Doc,Xls,PDF等文档类型是管理系统绕不过去的坑,那既然没有办法绕过,那就是说无论如何都要过了?
随便百度Google一下,发现这种方案其实许多人已经做过了,比如在下面的连接中,作者已经有了良好的实践:http://developer.51cto.com/art/201106/270815.htm
本文的解决方案,与之存在类似之处--都是采用模板语言结合xml来生成xml格式Word文件,但是实现模式还是不一样的,本文提供的方案更具有通用性、易用性,易用到像做网站一样生成Word文档。
为此,Tiny框架对于生成文本格式文件的内容进行了抽象,只要是生成文本格式的文件,都可以通过Tiny框架的文档生成框架进行扩展,使得开发人员可以方便快捷的生成文本类型的文档。
由于Office文档已经有了xml格式的存储方式,由于pdf可以通过xml生成,因此,最常用的office文档和pdf文档都可以通过本框架快速生成,当然,有一些基础性工作还是要自己做的(偷偷的透露一下:常用的模板框架中都会包含的)。
角色分配
文档生成框架扩展
文档生成框架扩展是非常简单的,你不用编写代码,只要编写配置文件即可
1.编写Bean文件
1
2
3
4
5
6
7
|
<
bean
id
=
"docTemplateFileProcessor"
scope
=
"singleton"
class
=
"org.tinygroup.docgen.fileresolver.TemplateFileProcessor"
>
<
property
name
=
"fileExtName"
value
=
".doctemplate"
></
property
>
<
property
name
=
"documentType"
value
=
"doc"
></
property
>
</
bean
>
注意:
fileExtName属性是指模板文件的扩展名
documentType属性是指文档类型
|
宏文件编写
文档生成框架本身并不能直接生成各种文档,需要高级开发人员进行模板编写。
这部分主要是定义Velocity模板文件了。
比如:定义下面的宏,可以用来生成word文件中的链接
1
2
3
4
|
#macro(link $url)
$bodyContent
</w:hlink
#end
|
文档模板编写
普通开发利用高级开发人员编写的宏文件,就可以简单快捷的编写文档模板了。
比如下面的代码就可以生成新浪网的链接地址:
#link("http://www.sina.com.cn/") #p("新浪网") #end
是不是不用知道Word文档格式,也可以方便快速的编写Word文档了?
示例
编写下面的模板文件
#@wordDocument()
#@body()
#h("Tiny Framework" 1)
#h("Tiny Framework" 2)
#h("Tiny Framework" 3)
#h("Tiny Framework" 4)
#h("Tiny Framework" 5)
#end
#end
编写下面的java代码:
DocumentGeneraterManager manager = SpringUtil.getBean(DocumentGeneraterManager.MANAGER_BEAN_NAME);
File file=new File("test.xml");
FileOutputStream outputStream=new FileOutputStream(file);
manager.getFileGenerater("doc").generate("/test.docpage", new ContextImpl(), new OutputStreamWriter(outputStream));
outputStream.close();
运行用Word打开生成的test.xml的结果:
当然,框架中已经定义了Word中大量的元素,也就是说大部分都可以像上面的方式来添加表格,样式,等等元素。再结合上各种数据获取,生成各种类型文档都是手到捻来。在Tiny框架就有大量的运行时数据,比如:服务定义,组件定义,插件定义等等,都是直接通过文档生成框架即时生成,保证了文档的可用性及有效性。
当然,不仅仅可以且来生成Word,所有以文本格式的存储的文件都可以通过上述方式生成。