使用freemarker 导出word

来源:互联网 发布:sql convert 编辑:程序博客网 时间:2024/06/02 23:46
使用过freemarker的肯定其见过如下情况:
Java代码 复制代码 收藏代码
  1. java.io.FileNotFoundException: Template xxx.ftl not found.  


模板找不到。可能你会认为我明明指定了文件,并且文件存在,但是为什么就是说找不到呢?
经过研究官方的API,原来freemarker在加载模板时,建议使用TemplateLoader,通过TemplateLoader指定从哪个目录开始加载模板,并且把模板加载在缓存中。

   API的TemplateLoader是一个接口,他有如下几个实现类:

Java代码 复制代码 收藏代码
  1. ClassTemplateLoader, FileTemplateLoader, MultiTemplateLoader, StringTemplateLoader, URLTemplateLoader, WebappTemplateLoader  


   顾名思义,我们能从类名中猜想到freemarker的模板加载机制,举例说明两个:

1:FileTemplateLoader
  此是文件模板加载器,此即可以通过文件的绝对路径加载模板,如:

Java代码 复制代码 收藏代码
  1. TemplateLoader templateLoader=null;   
  2.            String path="";   
  3.               
  4.            //使用FileTemplateLoader   
  5.           templateLoader=new FileTemplateLoader(new File("项目根路径"));   
  6.           path="/WEB-INF/classes/com/xxx/tag/templates/page/xxx.ftl";   
  7.                           
  8.            cfg.setTemplateLoader(templateLoader);   
  9.            Template t=cfg.getTemplate(path,"UTF-8");  


2:ClassTemplateLoader
  此是通过指定类所在的目录来指定模板所在根路径,即指定类在哪个目录,那么这个目录就是加载模板文件的根目录,如下:

Java代码 复制代码 收藏代码
  1. Configuration cfg = new Configuration();   
  2.                
  3.             TemplateLoader templateLoader=null;   
  4.             String path="";   
  5.                
  6.             templateLoader=new ClassTemplateLoader(PageTag.class,"templates/page/");   
  7.             path="standardd.ftl";   
  8.                
  9.             cfg.setTemplateLoader(templateLoader);   
  10.             Template t=cfg.getTemplate(path,"UTF-8");  


此即表示比PageTag类所在的目录开始找,找这个目录下的templates/page/目录,

其它的加载器原理同上,

如果你是web项目,并且使用了spring,那么。你还可以通过spring来配置你模板文件的根目录,如下:


Java代码 复制代码 收藏代码
  1. <bean id="freemarkerConfig" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">   
  2.     <property name="templateLoaderPath" value="/WEB-INF" />   
  3.      <property name="freemarkerSettings">   
  4.         <props>          
  5.             <prop key="defaultEncoding">UTF-8</prop>          
  6.         </props>          
  7.     </property>   
  8. </bean>  


此即表示从WEB-INF目录下开始找。