Word文档生成
                            
                            
                            非常多的時候,都需要在程序當中生成一些文檔,這些文檔可能是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文件
宏文件編寫
文檔生成框架本身并不能直接生成各種文檔,需要高級開發人員進行模板編寫。
這部分主要是定義Velocity模板文件了。
比如:定義下面的宏,可以用來生成word文件中的鏈接
文檔模板編寫 普通開發利用高級開發人員編寫的宏文件,就可以簡單快捷的編寫文檔模板了。
比如下面的代碼就可以生成新浪網的鏈接地址:
#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,所有以文本格式的存儲的文件都可以通過上述方式生成。
                        
                        
                        當然,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的結果:
155452_E5li_1245989.jpg (46.96 KB, 下載次數: 0)
下載附件
2015-5-27 21:08 上傳
?當然,框架中已經定義了Word中大量的元素,也就是說大部分都可以像上面的方式來添加表格,樣式,等等元素。再結合上各種數據獲取,生成各種類型文檔都是手到捻來。在Tiny框架就有大量的運行時數據,比如:服務定義,組件定義,插件定義等等,都是直接通過文檔生成框架即時生成,保證了文檔的可用性及有效性。
當然,不僅僅可以且來生成Word,所有以文本格式的存儲的文件都可以通過上述方式生成。
轉載于:https://blog.51cto.com/j2eetop/1665486
總結
 
                            
                        - 上一篇: Composer fails to do
- 下一篇: CentOS系统Kernel panic
