先说下大概的步骤
1、先用word文档编辑一个你想生成文件的模板,如图
2、编辑好之后,把该word文档另存为xml文件,如图
3、把生成的xml文件放入你的项目指定的文件夹下,这个路径一会会用到,可放在src目录或webRoot目录下
4、打开xml文件,此时会发现生成的xml文件格式不美观,可百度xml文件格式化进行格式化
5、格式化之后,对test.xml进行重命名,改成test.ftl,用过freemarker的应该会比较熟悉了,之前模板的${name}刚好就用到了
6、在test.ftl中找到进行base64编码后的图片的字符串换成${imageStr},一会能用到
7、下面就可以正式写代码了
工具类:testUtil.java,如下
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sun.misc.BASE64Encoder;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
/**
* @ClassName Test.java
* @Author lina
* @Describtion 测试类
* @Date 创建时间:2017-7-13 上午9:48:50
*
*/
public class TestUtil {
public Configuration configure = null;
private static Logger logger = LoggerFactory.getLogger(TestUtil.class);
public TestUtil () {
configure = new Configuration();
configure.setDefaultEncoding("utf-8");
}
/**
* 根据Doc模板生成word文件
* @param dataMap 需要填入模板的数据
* @param downloadType 文件名称
* @param savePath 保存路径
*/
public void createDoc (Map<String,Object> dataMap,String downloadType,String savePath,
HttpServletRequest request, HttpServletResponse response) {
try {
// 加载需要装填的模板
Template template = null;
/**
* Freemarker提供了3种加载模板目录的方法
* 1、通过文件系统加载 --void setDirectoryForTemplateLoading(File dir);
* 2、通过类的地址 ------void setClassForTemplateLoading(Class cl, String prefix);
* 3、通过Servlet ------void setServletContextForTemplateLoading(Object servletContext, String path);
*/
String path = request.getRealPath("/") + "/WEB-INF/template/admin";
configure.setDirectoryForTemplateLoading(new File(path));
// configure.setClassForTemplateLoading(this.getClass(), "/com/pankebao/entity");
// 设置对象包装器
// configure.setObjectWrapper(new DefaultObjectWrapper());
// 设置异常处理器
configure.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
// 定义Template对象,注意模板类型名字与downloadType要一致
template = configure.getTemplate(downloadType+".ftl");
File outFile = new File(savePath);
Writer out = null;
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"));
template.process(dataMap, out);
out.close();
} catch (IOException e) {
logger.warn("====异常信息====" + e);
e.printStackTrace();
} catch (TemplateException e) {
logger.warn("====异常信息====" + e);
e.printStackTrace();
}
}
/**
* 磁盘图片加密
* 如:D:/test.jpg
*/
public static String getDirImageStr(String imgFile) {
InputStream in = null;
byte[] data = null;
try {
in = new FileInputStream(imgFile);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (FileNotFoundException e) {
logger.warn("====异常信息====" + e);
e.printStackTrace();
} catch (IOException e) {
logger.warn("====异常信息====" + e);
e.printStackTrace();
}
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);
}
public static class Info {
private String name;
private String mobile;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
}
8、下面我们需要写个测试类或接口
a.测试类,在testUtil中请使用通过类文件加载freemarker文件,以上已注释
b.接口,毕竟把ftl文件放在src目录下不合适,通过接口测试
9、写完测试接口后,在ftl文件中找到<w:tr></w:tr>,此处用list数组进行遍历,如图,再把${name}改成${list.name},电话和住址一样要改
10、写了这么多,终于可以测试了