Java使用RTFTemplate.dot生成word文件

根据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);

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值