java 将ftl文件作为模板导出word文档
因为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/80339414java 将ftl文件作为模板导出word文档相关推荐
- java调用word模板文件_Java使用模板导出word文档
Java使用模板导出word文档 需要导入freemark的jar包 使用word模板,在需要填值的地方使用字符串代替,是因为word转换为xml文件时查找不到要填入内容的位置.尽量不要在写字符串的时 ...
- java关于对于word或者pdf文件的批量下载实现,其中包括(Java实现创建word文档模板,根据模板导出word文档)
本次需求是,pdf是表格类型的文件,我这里使用了word模板进行处理.但由于是多个文件一起导出,因此全部放到一个目录底下进行打包下载. ## 整体思路 /*** 下载思路:* 1.查询出数据后:* 2 ...
- java freemarker word_Java 用Freemarker完美导出word文档(带图片)(示例代码)
Java 用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...
- 用word模板导出word文档
项目需求要把页面上的分析结果导出为word文档,实现的办法是POI.查了一下网上很多方式都采用FreeMark,自己认为比较麻烦,所以还是采取了POI导出.之前的框架是SSH的,现在换成了Spring ...
- jQuery表格导出Excel文件以及网页内容导出Word文档
前言: 我在这里给大家介绍一下我们能用代码实现的最简单的两种转换为Excel文件以及Word文档的方法. jQuery表格导出Excel文件 先来看看我们的层级划分: 如图所示: demo.css 代 ...
- vue前端html页面导出word文件,Vue-纯前端导出word文档
在项目中,我们可以借助后端返回文件流实现文件下载.如果前端有数据,也可以借助前端框架进行下载.本文将介绍如何在前端纯js实现word文档导出. 1. 组件介绍 要实现前端纯js导出word文档,我们需 ...
- Aspose.Words利用Word模板导出Word文档
今天工作中遇到了导出Word文档的问题,但是在搜索Aspose.Words 导出Word文档时发现网上的方法都是有头没尾的,有的只有一小段实例,让人看着摸不着头脑. 利用Aspose.Words导出W ...
- java ftl 模板 输出list_java freemarker .ftl模板导出word文档(含文字,List, 图片)
此处只介绍word模板部分,java代码等请自行百度,都一样. 辅助工具:notepad++,百度在线xml格式化 A.不含遍历的简单处理 不含遍历的简单处理 简单的一个key一个值使用比较简单,主要 ...
- java按照模板导出word 文档
需求导出表格数据到word 文档中 新建word 文档 通过${ValueList1.value1} 来往里面添加数据, ValueList 即每一行数据的集合 保存word 文档,另存为 xml 格 ...
最新文章
- Elasticsearch 参考指南(脚本)
- Windows下创建PXE网络安装Linux[Redhat AS5.5]IBM X3650
- js不停地触发按钮的事件
- iOS中UITableViewCell的重用问题解决方案
- pls-00302: 必须声明 组件_手把手教你开发vue组件库
- 删除有序链表中的重复结点
- SAP CAP 项目 cds watch 生成的 index.html 的模板位置和权限控制
- 使用ABAP代码返回S/4HANA Material上维护的Attachment明细
- 动动手指头, Feed 流系统亿级规模不用愁
- TOP命令及参数解析
- flv 开源 修复_解决开源项目错误和修复的5个步骤
- 自动备份SQL Server数据库中用户创建的Stored Procedures
- android确定工作日,如何确定某个月的最后一个工作日?
- Python学习入门基础教程(learning Python)--5.5 Python写操作详解
- Android之汽车音频
- 【渝粤教育】国家开放大学2018年秋季 0299-22T中国古代文学(1) 参考试题
- CPU负载均衡之cpufreq使用
- 25. 谷粒商城订单系统
- M2Det论文解读和开源代码
- 给元素设置鼠标移入后变为手型的属性