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

一、模板文档

1、在Word中编辑好word模板,变量部分用el表达式替代

2、另存为xml文件(2003),打开xml文件,讲 sellerName等改为el表达式:${sellerName!}等,然后将.xml文件后缀改为.ftl,把.ftl模板文件到项目制定目录。加载jar包freemarker.jar然后开始后端代码

二、后台主要代码

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.net.URLEncoder;
import java.util.Map;
import java.util.Properties;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang3.StringUtils;
import org.springframework.util.ClassUtils;import freemarker.template.Configuration;
import freemarker.template.Template;/*** word模板工具类
* <p>Title: WordGenerator</p>
* <p>Description: </p>
* @author terry.peng*/
public class WordGenerator { private static Configuration configuration=null; //private static final String templateFolder = WordGenerator.class.getClass().getResource("").getPath()+"/ftl/";  //private static final String templateFolder = WordGenerator.class.getClass().getResource("/" + ClassUtils.convertClassNameToResourcePath(WordGenerator.class.getPackage().getName())).getFile() + "/ftl";private static final String templateFolder = "D:/ftl";static{ configuration=new Configuration(); configuration.setDefaultEncoding("utf-8"); try { configuration.setDirectoryForTemplateLoading(new File(templateFolder));} catch (IOException e) { e.printStackTrace();//throw new RuntimeException(e); } } private WordGenerator() { throw new AssertionError(); } /*** 下载合同* @param map 要填充的数据模型* @param docName 下载保存的名称(例如:销售合同.doc)* @param ftlFile ftl模板名称(例如:sellerContract.ftl)* @throws Exception*/public static void downContract(HttpServletRequest request, HttpServletResponse response, Map<?, ?> map,String docName,String ftlFile) throws Exception {  File file = null;  FileInputStream fin = null;  ServletOutputStream out = null;  try {setDownloadHeader(request, response, docName);//设置下载头// 调用工具类的createDoc方法生成Word文档  file = createDoc(request,response,map,docName,ftlFile);  fin = new FileInputStream(file.getAbsolutePath());  out = response.getOutputStream();  int len = 0;byte[] buf = new byte[1024];while ((len = fin.read(buf)) != -1) {out.write(buf, 0, len);}out.flush();} catch (Exception e) {response.setStatus(HttpServletResponse.SC_NOT_FOUND);throw new Exception(e.getMessage(), e);} finally {  if(fin != null) {try {fin.close();} catch (Exception e) {e.printStackTrace();}}  if(out != null) {try {out.close();} catch (Exception e) {e.printStackTrace();} } if(file != null) {try {file.delete();// 删除临时文件  } catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}  }  }/*** 导入ftl并创建doc * @param request* @param response* @param dataMap* @param docName* @param ftlFile* @return* @throws IOException*/public static File createDoc(HttpServletRequest request, HttpServletResponse response,Map<?, ?> dataMap, String docName,String ftlFile) throws IOException { Template template = configuration.getTemplate(ftlFile);String name = templateFolder + File.separator + (int) (Math.random() * 100000) + docName; File file = new File(name); try { // 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开 Writer writer = new OutputStreamWriter(new FileOutputStream(file), "utf-8"); template.process(dataMap, writer); // 关闭流writer.flush();writer.close(); } catch (Exception ex) { ex.printStackTrace();} return file; } /** object转map* <p>Title: objectToMap</p>  * <p>Description: </p>  * @param obj* @return*/public static Map<?, ?> objectToMap(Object obj) {if (obj == null) {return null;}return new org.apache.commons.beanutils.BeanMap(obj);}/*** map转Object* <p>Title: mapToObject</p>  * <p>Description: </p>  * @param map* @param beanClass * @return* @throws Exception*/public static Object mapToObject(Map<String, Object> map, Class<?> beanClass)throws Exception {if (map == null)return null;Object obj = beanClass.newInstance();org.apache.commons.beanutils.BeanUtils.populate(obj, map);return obj;}/*** * @param request* @param response* @param fileName*/public static void setDownloadHeader(HttpServletRequest request, HttpServletResponse response, String fileName) {String userAgent = request.getHeader("User-Agent");boolean isIE = (userAgent != null) && (userAgent.toLowerCase().indexOf("msie") != -1);response.setHeader("Pragma", "No-cache");response.setHeader("Cache-Control", "must-revalidate, no-transform");response.setDateHeader("Expires", 0L);response.setContentType("application/x-download");try {if (isIE) {fileName = new String(fileName.getBytes("gb2312"), "iso-8859-1");response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");} else {fileName = new String(fileName.getBytes("gb2312"), "iso-8859-1");response.setHeader("Content-Disposition", "attachment;filename=" + fileName);}} catch (Exception e) {e.printStackTrace();}}}

三、其他

ftl模板中取值可以用el表达式取值${username}

如果要迭代list,String[]、或者在模板中做其他逻辑处理等,可以直接写freemarker的语言,例如:

<![CDATA[<#if goodsAttr?? && (goodsAttr?size > 0)> <#list goodsAttr as g>${g!}<#if g_has_next>]]><w:br/><![CDATA[</#if></#list> </#if>]]>
<![CDATA[<#if tradeRemark?? && (tradeRemark?length gt 0)> <#list tradeRemark?split("\n") as g>${g!}<#if g_has_next>]]><w:br/><![CDATA[</#if></#list> </#if>]]></w:t>

在xml中写freemarker语言要用<![CDATA[   ]]>原样输出

word转成的xml回车符号为<w:br/>

效果为

本文出处:https://blog.csdn.net/pdy8023/article/details/80339414

java 将ftl文件作为模板导出word文档相关推荐

  1. java调用word模板文件_Java使用模板导出word文档

    Java使用模板导出word文档 需要导入freemark的jar包 使用word模板,在需要填值的地方使用字符串代替,是因为word转换为xml文件时查找不到要填入内容的位置.尽量不要在写字符串的时 ...

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

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

  3. java freemarker word_Java 用Freemarker完美导出word文档(带图片)(示例代码)

    Java  用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...

  4. 用word模板导出word文档

    项目需求要把页面上的分析结果导出为word文档,实现的办法是POI.查了一下网上很多方式都采用FreeMark,自己认为比较麻烦,所以还是采取了POI导出.之前的框架是SSH的,现在换成了Spring ...

  5. jQuery表格导出Excel文件以及网页内容导出Word文档

    前言: 我在这里给大家介绍一下我们能用代码实现的最简单的两种转换为Excel文件以及Word文档的方法. jQuery表格导出Excel文件 先来看看我们的层级划分: 如图所示: demo.css 代 ...

  6. vue前端html页面导出word文件,Vue-纯前端导出word文档

    在项目中,我们可以借助后端返回文件流实现文件下载.如果前端有数据,也可以借助前端框架进行下载.本文将介绍如何在前端纯js实现word文档导出. 1. 组件介绍 要实现前端纯js导出word文档,我们需 ...

  7. Aspose.Words利用Word模板导出Word文档

    今天工作中遇到了导出Word文档的问题,但是在搜索Aspose.Words 导出Word文档时发现网上的方法都是有头没尾的,有的只有一小段实例,让人看着摸不着头脑. 利用Aspose.Words导出W ...

  8. java ftl 模板 输出list_java freemarker .ftl模板导出word文档(含文字,List, 图片)

    此处只介绍word模板部分,java代码等请自行百度,都一样. 辅助工具:notepad++,百度在线xml格式化 A.不含遍历的简单处理 不含遍历的简单处理 简单的一个key一个值使用比较简单,主要 ...

  9. java按照模板导出word 文档

    需求导出表格数据到word 文档中 新建word 文档 通过${ValueList1.value1} 来往里面添加数据, ValueList 即每一行数据的集合 保存word 文档,另存为 xml 格 ...

最新文章

  1. Elasticsearch 参考指南(脚本)
  2. Windows下创建PXE网络安装Linux[Redhat AS5.5]IBM X3650
  3. js不停地触发按钮的事件
  4. iOS中UITableViewCell的重用问题解决方案
  5. pls-00302: 必须声明 组件_手把手教你开发vue组件库
  6. 删除有序链表中的重复结点
  7. SAP CAP 项目 cds watch 生成的 index.html 的模板位置和权限控制
  8. 使用ABAP代码返回S/4HANA Material上维护的Attachment明细
  9. 动动手指头, Feed 流系统亿级规模不用愁
  10. TOP命令及参数解析
  11. flv 开源 修复_解决开源项目错误和修复的5个步骤
  12. 自动备份SQL Server数据库中用户创建的Stored Procedures
  13. android确定工作日,如何确定某个月的最后一个工作日?
  14. Python学习入门基础教程(learning Python)--5.5 Python写操作详解
  15. Android之汽车音频
  16. 【渝粤教育】国家开放大学2018年秋季 0299-22T中国古代文学(1) 参考试题
  17. CPU负载均衡之cpufreq使用
  18. 25. 谷粒商城订单系统
  19. M2Det论文解读和开源代码
  20. 给元素设置鼠标移入后变为手型的属性

热门文章

  1. android 9.0 10.0 添加系统字体并且设置为默认字体
  2. 路缘石滑模机脱离预制作业追赶施工效率
  3. 详解ArcGIS中添加经纬网操作步骤
  4. 样本方差公式推导--为什么样本方差的分母是n-1
  5. 周易起名源码|八字起名源码|起名源码PHP附搭建教程
  6. 程序员500字年终总结
  7. 一套有趣的期权套利题目
  8. 天润融通java面试_【天润融通怎么样?】-看准网
  9. 中文汉字和常见英文数字等的unicode编码范围
  10. python bz2模块