最近开发一个导出word模板文件在本机调整一直正常,但是在服务器下载下来的文件老提示xml错误,仔细查看发现出错的word文件以xml形式打开发现在在报错位置有乱码,
刚开始以为是word转xml是出现乱码,单独调试word转xml正常,那应该是向ftl文件中写入变量后以写到文件流中出现乱码。
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
/**
* 导出word
* @author wfy
*
*/
public class FreemarkerUtil
{
private static FreemarkerUtil util;
private static Configuration cfg;
private FreemarkerUtil(){
}
/**
* 获取单例对象
* @param pname ftl模板文件所在路径
* @return
* @throws IOException
*/
public static FreemarkerUtil getInstance(String pname) throws IOException{
if(util==null){
cfg=new Configuration();
cfg.setDefaultEncoding("UTF-8");
//cfg.setClassForTemplateLoading(FreemarkerUtil.class, pname);
cfg.setDirectoryForTemplateLoading(new File(pname));
util=new FreemarkerUtil();
}
return util;
}
/**
* 获取模板对象
* @param fname 模板文件名称
* @return
*/
private Template getTemplate(String fname){
try
{
//return cfg.getTemplate(fname);
return cfg.getTemplate(fname, "UTF-8");
}
catch (IOException e)
{
e.printStackTrace();
}
return null;
}
/**
* 通过标准输出流输出模板的结果
* @param map 数据对象
* @param fname 模板文件名
*/
public void sprint(Map<String,Object>map,String fname){
try
{
getTemplate(fname).process(map, new PrintWriter(System.out));
}
catch (TemplateException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
/**
* 基于文件输出
* @param map 数据对象
* @param fname 模板文件名
* @param outpath 输出文件路径
*/
public void fprint(Map<String,Object> map, String fname, String outpath){
try
{
getTemplate(fname).process(map, new PrintWriter(new File(outpath),"UTF-8"));
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (TemplateException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
解决办法:是在三处标红的位置都加上"UTF-8" 之后所有问题解决
cfg.setDefaultEncoding("UTF-8");
cfg.getTemplate(fname, "UTF-8");
getTemplate(fname).process(map, new PrintWriter(new File(outpath),"UTF-8"));