1.ftl文件介绍

ftl是Freemarker模板的文件后缀名
FreeMarker其实是一种比较简单的网页展示技术,说白了就是网页模板和数据模型的结合体。这种结合模式的好处就是,分离了网页界面设计人员和编程人员的工作,让他们各司其职。
FreeMarker大致的工作方式是,网页模板里面嵌入了数据模型中的数据、FreeMarker自定义流程控制语言、FreeMarker自定义的操作函数等等,在装载网页的时候,FreeMarker模板自动从数据模型中提取数据,并解释整个网页为我们熟知的HTML页面。
在B/S程式设计中,常常有美工和程序员二个角色,他们具有不同专业技能:美工专注于表现——创建页面、风格、布局、效果等等可视元素;而程序员则忙于创建程式的商业流程,生成设计页面要显示的数据等等。
模板引擎就是为了解决上面的问题而产生的。在设计HTML的时候,我们加入一些特定指令来指定要插入哪些数据,这些加了特殊指令的HTML或者其他文本,称为模板(Template)。而模板引擎会在输出页面时,用适当的数据替代这些代码,模板和嵌入JSP的HTML是不同的,模板指令只有很有限的编程能力,可以避免混入商业逻辑。

2.word编辑步骤

2.1 word模板编辑

  • word可以把要编辑的部分改为$对象.属性或$属性名转为xml文件,$符号与属性名称分开,去掉多余行,把$属性名称写一起
  • word中含有图片需要模板中传入图片转为xml文件,图片转为文件流,把文件流中的图片替换为$对象.属性或$属性名。
  • 把xml文件改后缀,改为ftl文件。
  • 把ftl文件放在项目指定的路径下。

.doc转为xml文件

文字

图片

图片只要把binaryData中的字符流改为${变量名}就可以。

3.后台代码

package com.model.controller;import freemarker.template.Configuration;
import freemarker.template.Template;import org.apache.commons.lang3.RandomStringUtils;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import sun.misc.BASE64Encoder;
import sun.net.www.protocol.http.HttpURLConnection;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;/*** word 下载* Created by xxx on 2018/11/6.*/
@Controller
@RequestMapping("/project")
public class ProjectController {private static Logger logger=Logger.getLogger(ProjectController.class);/***  下载* @param response*/@RequestMapping(value="/download")public void download(HttpServletResponse response){try{Map<String,Object> map=new HashMap<String,Object>(6);//组装返回数据completeData(map);//建立下载文件名称String fileName = Long.toString(System.currentTimeMillis()) + RandomStringUtils.randomNumeric(10) + ".doc";//修改文件模板File file=writeFileTemplate(fileName,map);//导出文件exportFile(response,file);}catch(Exception e){logger.error(" download file error",e);}}/*** 导出文件* @param response* @param file*/public  void exportFile(HttpServletResponse response,File file){try{ServletOutputStream out=response.getOutputStream();BufferedInputStream in=new BufferedInputStream(new FileInputStream(file));response.setContentType("application/octet-stream;charset=UTF-8");response.setHeader("Content-Disposition", "attachment;filename=" + file.getName());byte[] buffer=new byte[1024];int count=0;while((count=in.read(buffer))!=-1){out.write(buffer,0,count);}out.flush();out.close();}catch(Exception e){logger.error("export word error",e);}finally{file.delete();}}/*** 修改文件模板* @param fileName* @param map* @return* @throws Exception*/public File writeFileTemplate(String fileName,Map<String,Object> map) throws Exception{try{//设置freemarker模板编码、路径、模板名称Configuration configuration=new Configuration();configuration.setDefaultEncoding("utf-8");String tempPath=this.getClass().getResource("").getPath().substring(0,this.getClass().getResource("").getPath().indexOf("WEB-INF"));String templatePath=tempPath+"WEB-INF/exportTemplates/trademark/";configuration.setDirectoryForTemplateLoading(new File(templatePath));Template template=configuration.getTemplate("model.ftl");//设置输出文件路径String outPath=tempPath+"WEB-INF/tempFile/"+fileName;File outFile=new File(outPath);Writer writer=null;try{writer=new OutputStreamWriter(new FileOutputStream(outFile), "utf-8");template.process(map,writer);}catch(Exception e){logger.error("template write data error",e);throw e;}finally{writer.close();}return outFile;}catch(Exception e){logger.error("ProjectController.writeFileTemplate  error",e);throw e;}}/*** 组装返回数据* @param map* @return* @throws Exception*/public Map<String,Object> completeData(Map<String,Object> map)throws Exception{try{map.put("name","张三");map.put("department","技术部");map.put("projectName","灿烂");map.put("year","2018");map.put("month","11");map.put("day","8");File file=saveToFile("http://mm.yh31.com:88/tp/sdj/201712241958292972.jpg");String imageBase64 = encodeBase64File(file);map.put("picture",imageBase64);}catch(Exception e){logger.error("ProjectController.completeData error",e);throw e;}return map;}/*** 通过url获取文件* @param destUrl*/public File saveToFile(String destUrl) {FileOutputStream fos = null;BufferedInputStream bis = null;HttpURLConnection httpUrl = null;URL url = null;int BUFFER_SIZE = 1024;byte[] buf = new byte[BUFFER_SIZE];int size = 0;//在填写文件路径时,一定要写上具体的文件名称(xx.txt),否则会出现拒绝访问。File file = new File("E:\\download\\picture.png");if(!file.exists()){//先得到文件的上级目录,并创建上级目录,在创建文件file.getParentFile().mkdir();try {//创建文件file.createNewFile();} catch (IOException e) {e.printStackTrace();}}try {url = new URL(destUrl);httpUrl = (HttpURLConnection) url.openConnection();httpUrl.connect();bis = new BufferedInputStream(httpUrl.getInputStream());fos = new FileOutputStream(file);while ((size = bis.read(buf)) != -1) {fos.write(buf, 0, size);}fos.flush();} catch (IOException e) {} catch (ClassCastException e) {logger.error("url transfer to http url error",e);throw e;} finally {try {fos.close();bis.close();httpUrl.disconnect();} catch (IOException e) {} catch (NullPointerException e) {}}return file;}/*** 将文件转化为Base64编码* @param file* @return* @throws Exception*/public static String encodeBase64File(File file) throws Exception {//File file = new File(path);;FileInputStream inputFile = new FileInputStream(file);byte[] buffer = new byte[(int) file.length()];inputFile.read(buffer);inputFile.close();return new BASE64Encoder().encode(buffer);}}

4.测试中遇到的问题

4.1 方法public File saveToFile(String destUrl)中的 httpUrl = (HttpURLConnection) url.openConnection();因为HttpUrl与Url引用的java包不一致,Url是.net而HttpURL是apache,为此统一改为.net包

4.2 获取文件路径的问题,详见博文https://blog.csdn.net/weixin_41926301/article/details/83818927

4.3 方法public File writeFileTemplate(String fileName,Map<String,Object> map) throws Exception;其中

   writer=new OutputStreamWriter(new FileOutputStream(outFile), "utf-8")错误的写法
   writer=new OutputStreamWriter(new FileOutputStream(outFile))会造成文件输出的编码不是utf-8的格式,从而造成下载后的文件不可读。

5.运行结果

word转FreeMarker的ftl文件编辑导出编辑后的word相关推荐

  1. Visio直接粘贴进Word的矢量图,采用Adobe导出PDF后图片内容存在缺失的解决方案;  打印生成PDF,字体的加粗效果会很不明显的解决方案;

    问题一    Visio直接粘贴进Word的矢量图,采用Adobe导出PDF后图片内容存在缺失 目标效果: 但是导成PDF后字总是消失,成了 调整Visio内容没用,尝试各种网上办法没用.师妹的福昕可 ...

  2. freemarker ftl java_通过springframework的mvc返回freemarker的ftl文件ModelAndView模板内容代码示例...

    一.前言 这边基于springframework的mvc框架,并通过freemarker的ftl视图渲染文件返回数据,在spring文件中配置对应org.springframework.web.ser ...

  3. Aspose.Words使用word模板中的书签插入图片(导出含有图片的word)

    核心代码为: protected void Button2_Click(object sender, EventArgs e){string templatePath = HttpContext.Cu ...

  4. 在线查看office文件的两种方法word、excel、ppt文件

    目录 一.word.excel.ppt文件在线预览 二.word.excel文件转HTML 1. 使用office软件自带功能转换HTML 2. 使用文件转换API(如Zamzar)转换HTML 一. ...

  5. 图片和Word查阅有什么区别?图片文字怎么转换成word文档

    图片和Word查阅有什么区别?图片文字怎么转换成word文档 在阅读和编辑文档时,许多人会面临一种选择:是使用图片还是使用Word文档.尽管两种方法都有其自身的优点和缺点,但实际上,它们之间存在着一些 ...

  6. 利用word的freemarker模板导出word文件

    前端请求 var url = window.webApi.business.exportYearWord; jQuery('<form action="' + url + '" ...

  7. java 将ftl文件作为模板导出word文档

    因为poi等输出word很麻烦,所以本文使用word编辑好模板,转成xml再转成ftl,在java中导入ftl模板,填充数据再生成为word下载或保存. 一.模板文档 1.在Word中编辑好word模 ...

  8. 记录使用freemarker生成word的模板ftl文件以及word的遍历数据

    2019独角兽企业重金招聘Python工程师标准>>> 生成ftl文件有2种.有循环数据或者无循环数据 没有循环数据的比较简单,在woed模板里,将需要数据库填充的数据写入每个表格, ...

  9. java关于对于word或者pdf文件的批量下载实现,其中包括(Java实现创建word文档模板,根据模板导出word文档)

    本次需求是,pdf是表格类型的文件,我这里使用了word模板进行处理.但由于是多个文件一起导出,因此全部放到一个目录底下进行打包下载. ## 整体思路 /*** 下载思路:* 1.查询出数据后:* 2 ...

最新文章

  1. JavaScript学习与实践(8)
  2. 几个经典的TCP通信函数
  3. python在财务上的应用-致工作党:Python这项技能你一定要会
  4. Java十进制转换为二进制的无符号数
  5. 回溯算法 思路清晰,通俗易懂!!!!!!!
  6. php eureka客户端,Spring Cloud(一)配置Eureka 服务器(示例代码)
  7. 机器学习 深度学习 ai_什么是AI? 从机器学习到决策自动化
  8. Oracle 树状 父子结点 查询方法 倒叙查询
  9. 第三届“传智杯”全国大学生IT技能大赛(初赛B组)
  10. 如何搭建用户画像系统?以保险行业为例
  11. 新建数据库监听端口被占用
  12. Eclipse和JDK版本对应关系
  13. 【速成MSP430f149】电赛期间学习MSP430f149笔记
  14. 超强实用 中国各地特产风味大搜捕
  15. 工作如何避免情绪内耗
  16. android 6g 有必要吗,手机6G运存真的有必要吗?这篇实测告诉你
  17. 【翻译】MED 3D: TRANSFER LEARNING FOR 3D MEDICAL I MAGE ANALYSIS
  18. excel提取工作表名称
  19. widows批处理精选
  20. 用c语言求出1加到100的和

热门文章

  1. 计算机维修知识论文,计算机维修论文2000字
  2. linux hiredis yum,Centos7 安装Redis和Hiredis
  3. 如何使你的项目有国际范
  4. Chrome浏览器插件-Fatkun安装和介绍
  5. nedc和epa续航里程什么意思_新能源汽车续航测试标准EPA 、NEDC、JC08 是什么意思,哪个更严格?...
  6. AR——增强现实技术
  7. 微信小程序引入echarts图表(保姆式)
  8. 深入理解什么是TCP 粘包?粘包警察是什么梗?
  9. iPhone在微信下 输入框失去焦点后屏幕卡住问题处理
  10. 五个了解自己天赋优势的分析工具(三)DISC性格测评