java freemarker 通过ftl模板文件导出word文件发现在有中文地方出现在乱码,打开word文件提示xml错误解决办法

最近开发一个导出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"));


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值