根据http://zhaozhi3758.iteye.com/blog/1164375文章,稍微补充了一下
一、模板的制作
1.下载RTFTemplate.zip文件,解压到要制作模板的文件夹下(和模板的路径一致),解压后的文件名“RTFTemplate.dot”。
2.新建“名称.fields.xml”文件,代码如下
<?xml version="1.0" encoding="ISO-8859-1"?> <fields> <description><![CDATA[]]></description> <bookmark> <type>START_LOOP</type> <name>START_LOOP_{i}</name> <description><![CDATA[]]></description> </bookmark> <bookmark> <type>END_LOOP</type> <name>END_LOOP_{i}</name> <description><![CDATA[]]></description> </bookmark> <mergefield> <list>false</list><!--false代表本次输出是单个值--> <listInfo>$shorts</listInfo><!--去除$符号,shorts要和后台javabean里面的名称一致--> <name>$shorts</name><!--方便查看,name和listInfo保持一致--> <description><![CDATA[]]></description> </mergefield> <mergefield> <list>true</list><!--true代表本次输出是个集合--> <listInfo>$[lines].Content</listInfo> <name>$lines.Content</name> <description><![CDATA[]]></description> </mergefield> </fields>
3.打开RTFTemplate.dot,具体操作如附件“操作步骤”
4.后台代码
struts配置
<global-results> <result type="stream" name="download"> <param name="contentType">application/octet-stream;charset=utf-8</param> <param name="inputName">inputStream</param> <!--fileName下载后的文件名称--> <param name="contentDisposition">attachment;filename="${fileName}"</param> <param name="bufferSize">4096</param> </result> </global-results>
spring配置
<bean id="freeMarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="freemarkerSettings"> <props> <prop key="template_update_delay">0</prop> <prop key="default_encoding">utf-8</prop> <prop key="locale">no_NO</prop> <prop key="template_update_delay">5</prop> <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop> <prop key="date_format">yyyy-MM-dd</prop> <prop key="number_format">#</prop> </props> </property> </bean>
javabean中初始map
public Map<String, Object> buildWordMap() { Map<String, Object> map = super.buildWordMap(); map.put("shorts", this.shorts); map.put("years", this.years); return map; }
自己写的一个帮助类
package com.safetys.nbxzzf.util; import java.util.Map; import java.util.UUID; import org.apache.struts2.ServletActionContext; public class RTFUtil { static String REALPATH = "/template/book_rtf/"; static String OUT_REALPATH = "template/book_word"; /** * 获取文书RTF格式模板 * @param RTFName 模板名称 * @return */ public static String getBookRTFPath(String RTFName){ return ServletActionContext.getServletContext().getRealPath(REALPATH + RTFName); } /** * 获取文书模板生成路径 * @param name 文件名 * @return */ public static String getBookRTFOutPath(String name){ String path = ServletActionContext.getServletContext().getRealPath(OUT_REALPATH); String filePath = path + "\\" + name; return filePath; } /** * 新建文书word * @param map 数据容器 * @param RTFName 模板完整名称 * @return word路径 * @throws Exception */ public static String newBookWord(Map<String, Object> map, String RTFName) throws Exception{ String RTFPath = getBookRTFPath(RTFName); //文件重命名 RTFName = UUID.randomUUID().toString() + ".doc"; String filePath = getBookRTFOutPath(RTFName); // 生成RTF RTFGenerator generator = new RTFGenerator(); generator.setContextMap(map); generator.run(RTFPath, filePath); //文件相对路径 String path = OUT_REALPATH + "/" + RTFName; return path; } }
设置InputStream的get方法
public InputStream getInputStream() { InputStream is = null; try { is = new FileInputStream(filestr); } catch (FileNotFoundException e) { e.printStackTrace(); } return is; }
注意事项:如果生成的文件有乱码,用记事本打开模板,查找到如下代码
\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;
替换成
\f0\dbch\charset0\fprq2 宋体;
如果模板中使用了lines(集合的话),数据为空时,生成word报错,必须创建一个空对象给他
如:
BookWordLine line = new BookWordLine();
lines.add(line);