freemaker导出word

 ftl文件

1.用Microsoft Office Word打开word原件;

2.把需要动态修改的内容替换成***,如果有图片,尽量选择较小的图片几十K左右,并调整好位置;

3.另存为,选择保存类型Word 2003 XML 文档(*.xml)【这里说一下为什么用Microsoft Office Word打开且要保存为Word 2003XML,本人亲测,用WPS找不到Word 2003XML选项,如果保存为Word XML,会有兼容问题,避免出现导出的word文档不能用Word 2003打开的问题】;

4.用Firstobject free XML editor打开文件,选择Tools下的Indent【或者按快捷键F8】格式化文件内容。左边是文档结构,右边是文档内容;

5. 将文档内容中需要动态修改内容的地方,换成freemarker的标识。其实就是Map<String, Object>中key,如${landName};

6.在加入了图片占位的地方,会看到一片base64编码后的代码,把base64替换成${image},也就是Map<String, Object>中key,值必须要处理成base64;

  代码如:<w:binData w:name="wordml://自定义.png" xml:space="preserve">${image}</w:binData>

  注意:“>${image}<”这尖括号中间不能加任何其他的诸如空格,tab,换行等符号。

  如果需要循环,则使用:<#list maps as map></#list>  maps是Map<String, Object>中key,值为数组,map为自定义;

7. 标识替换完之后,模板就弄完了,另存为.ftl后缀文件即可。注意:一定不要用word打开ftl模板文件,否则xml内容会发生变化,导致前面的工作白做了。


function exportDetail1(name,id,type){

   
    var picBase64Info = myChart.getDataURL(); 
    console.log(picBase64Info);
    var picBase64Info1 = myChart1.getDataURL(); 
    var picBase64Info2 = getFullCanvasDataURL("contain2");
   
window.location.href="${root!}/supervision/mainPage/punishMonitorMainPage/exportDetail03?name="+picBase64Info+"&name2="+picBase64Info1+"&name3="+c;
}
    

@SuppressWarnings({ "deprecation", "unused" })

@RequestMapping(value = "/exportDetail03", method = RequestMethod.GET)
public void exportDetail03(HttpServletRequest request,
HttpServletResponse response) throws Exception {


try {

String a = this.getPara("name");
String a2 = this.getPara("name2");
String a3 = this.getPara("name3");
String root = null;
if (root == null) {
root = request.getSession().getServletContext().getRealPath("/");// 服务器路径
}
String dir = "assets/data/";


// Configuration用于读取ftl文件
Configuration configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");

configuration.setDirectoryForTemplateLoading(new File(root+"/data/template"));


Map<String, Object> dataMap = new HashMap<String, Object>();




String nname = "file.doc";
File outFile = new File(root + dir + nname);

//echart直接前台传图片编码到后台
a = a.replaceAll(" ", "+");

String[] arr = a.split("base64,");  
dataMap.put("image", org.apache.commons.lang.StringEscapeUtils.unescapeJava(arr[1]));

a2 = a2.replaceAll(" ", "+");

String[] arr2 = a2.split("base64,"); 
//不转义
dataMap.put("image2", org.apache.commons.lang.StringEscapeUtils.unescapeJava(arr2[1]));



a3 = a3.replaceAll(" ", "+");

String[] arr3 = a3.split("base64,");  
dataMap.put("image3", org.apache.commons.lang.StringEscapeUtils.unescapeJava(arr3[1]));



Template t = null;
t = configuration.getTemplate("baodeyan.ftl", "utf-8");

// Template t =
// configuration.getTemplate("fctestpaper1.ftl","utf-8");
Writer out1 = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(outFile), "utf-8"), 10240);
t.process(dataMap, out1);
out1.close();

// 取得文件名。
String filename1 = outFile.getName();
// 取得文件的后缀名。
String ext = filename1.substring(filename1.lastIndexOf(".") + 1)
.toUpperCase();


// 以流的形式下载文件。
InputStream fis = new BufferedInputStream(new FileInputStream(root
+ dir + filename1));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 设置response的Header
// response.addHeader("Content-Disposition", "attachment;filename="
// + new String(filename1.getBytes()));
response.setHeader(
"Content-Disposition",
"attachment;"
+ (new StringBuilder("filename=").append(encode(
request, filename1)).toString()));
// response.addHeader("Content-Length", "");


response.addHeader("Content-Length", "" + outFile.length());
OutputStream toClient = new BufferedOutputStream(
response.getOutputStream());
response.setContentType("application/octet-stream");
toClient.write(buffer);
toClient.flush();
toClient.close();
// 删除本地文件
boolean del = outFile.delete();


} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值