根据模板生成word文档下载
需求:根据数据库已有字段,填入写好的word并下载
工具 :freemark 一种方便生成word的引擎,内置好大量基础方法
思路:
一.将数据库数据按需求(根据id,根据name......)提取存储在一个map中待用
二.将模板word生成ftl文件,以便freemark来改造
三.将存有数据的map依靠WordUtils工具类传递数据给ftl
四.前台连接,生成word
详解:
步骤一
1.按照需求,根据id查找一个po实例,使用到sql语句查询
mapping:
<select id="findById" parameterType="String"
resultType="com.kanq.ly.pwf.model.PwfContract">
select t.* from PWF_CONTRACT t where t.id = #{id}
</select>
ctrl:
private String downloadWord(HttpServletRequest request,HttpServletResponse response,String id) throws IOException{
//根据id获取一个实例
System.out.println("合同id:"+id);
PwfContract pwfContract=getEntryById(id);
//map中存放需要生成word文档的合同具体信息
Map<String, Object> mapValue = new HashMap<String, Object>();
mapValue.put("cdate", pwfContract.getCdate());
mapValue.put("category", pwfContract.getCategory());
//利用工具类生成文档,需要修改工具类的具体信息
WordUtils.exportMillCertificateWord(request,response,mapValue);
return null;
}
步骤二:
1.把word模板中需要填充的数据进行修改 ,把 a 改成 ${a}
注意!!!此时存在一个问题:当a为空的时候,后台会报一个null的错误,freemark无法自动填充一个null值,需要进行判断,把 a改成 <#if a??> ${(a)!""}</#if>意思为如果a不存在 a的值默认为"",!是默认的意思,
所以最后把a修改成<#if a??> ${(a)!""}</#if>,然后保存文件类型为xml
2.把xml的文件打开,会观察到 <#if a??> ${(a)!""} 这句话会被填充一些字符(这些字符是word文档一些修饰的东西,比如说字体大小颜色粗细之类的),需要把这些填充的字符删除,只留下纯粹的<#if a??> ${(a)!""}这句话,然后保存为ftl的文件
注意!!!freemark这个引擎填充数据的原理是通过对照字段,比如在map中存放的字段为 name 在ftl中就会找name的字段填充进去,如果对应不上,就无法填充,无字段前后顺序要求
步骤三;
1.首先需要一个WordUtils工具类,百度上一大堆,用来查找ftl文件位置以及整合map
package com.kanq.framework.utils.tool;
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.Writer;
import java.net.URLEncoder;
import java.util.Map;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import freemarker.template.Configuration;
import freemarker.template.Template;
public class WordUtils {
//配置信息,代码本身写的还是很可读的,就不过多注解了
private static Configuration configuration = null;
//这里注意的是利用WordUtils的类加载器动态获得模板文件的位置 ,修改ftl文件的位置 类加载器获取数据源 路径 获取路径
private static final String templateFolder = WordUtils.class.getClassLoader().getResource("../../").getPath() + "pages/wordTemplate";
static {
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
try {
//引擎搜索ftl文件的基础路径设置
configuration.setDirectoryForTemplateLoading(new File(templateFolder));
} catch (IOException e) {
e.printStackTrace();
}
}
private WordUtils() {
throw new AssertionError();
}
public static void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map) throws IOException {
//在默认路径上找到相应的ftl文件
Template freemarkerTemplate = configuration.getTemplate("pwf.ftl");
File file = null;
InputStream fin = null;
ServletOutputStream out = null;
try {
// 调用工具类的createDoc方法生成Word文档
file = createDoc(map,freemarkerTemplate);
fin = new FileInputStream(file);
//设置响应类型是文档
response.setCharacterEncoding("utf-8");
response.setContentType("application/msword");
// 设置浏览器以下载的方式处理该文件名
String fileName = "管护合同.doc";
response.setHeader("Content-Disposition", "attachment;filename="
.concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));
out = response.getOutputStream();
byte[] buffer = new byte[512]; // 缓冲区
int bytesToRead = -1;
// 通过循环将读入的Word文件的内容输出到浏览器中
while((bytesToRead = fin.read(buffer)) != -1) {
out.write(buffer, 0, bytesToRead);
}
} finally {
if(fin != null) fin.close();
if(out != null) out.close();
if(file != null) file.delete(); // 删除临时文件
}
}
private static File createDoc(Map<?, ?> dataMap, Template template) {
String name = "管护合同.doc";
File f = new File(name);
Template t = template;
try {
// 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开
Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");
t.process(dataMap, w);
w.close();
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException(ex);
}
return f;
}
}
该工具类的主要方法为:createDoc(map元数据,ftl文件){} 根据map源数据生成doc文件
exportMillCertificateWord(请求,响应,map元数据){} 配置生成doc的环境
2.在ctrl中利用WordUtils中的exportMillCertificateWord生成一个Word
WordUtils.exportMillCertificateWord(request,response,mapValue);
步骤四:
1.html中添加超链传递id
<a href="javascript:void(0)" οnclick="pwfContract.exportWord('{{id}}')">生成合同</a>
2.js中接收id传递给后台
var exportWord = function(id){
window.open("../pwf/pwfContract/downloadWord.do?id="+id);}
3.后台接收id,作为查询po实例关键字
@RequestMapping(value="downloadWord.do")
private String downloadWord(HttpServletRequest request,HttpServletResponse response,String id) throws IOException{
//根据id获取一个实例
System.out.println("合同id:"+id);
PwfContract pwfContract=getEntryById(id);}
根据模板生成word文档下载相关推荐
- 使用word模板生成word文档的各类方案
使用word模板生成word文档的各类方案 生成word的各种方案 word另存xml进行后续处理 2003版本word(.doc)的xml处理并生成word 2007版本word(.docx)的xm ...
- Android 使用模板生成Word文档,支持手机直接查看word
最近在项目工作中,碰到一个很棘手的需求,说是要在手机端根据模板生成word文档,而且不借助第三方的软件可以查看word文档,一开始听这个需求差不多蒙了,这要怎么做,为什么不把生成word文档这个工作放 ...
- 根据标准word模板生成word文档类库(开源)
前言 最近因项目需要要自定义标准word模板,并以编码方式操作word模板.填充数据和生成word文档,于是自己写了条小"内裤"来实现这个功能.该"内裤"只 ...
- JAVA实现模板word文档导入,Java依据word模板生成word文档之后台解析和实现及部分代码(一)...
Java根据word模板生成word文档之后台解析和实现及部分代码(一) 后台主要工作是解析XML定义的标签文件,并获取到数据集,放入到Map中,然后调用Jacob.jar中提供的相关方法来实现替换. ...
- freemarker根据模板生成word文档,换行
freemarker根据模板生成word文档,其它地方已经说的非常清除了,在此简单再说以下. 1.制作word模板,另存为xml文件.在此我另存为的时windows xml,它和windows 200 ...
- 帝国cms把网站文章内容生成word文档下载插件
帝国cms把网站文章内容生成word文档下载插件 插件介绍 jQuery Word Export是一款可以将网页中的文字导出到微软Word文档中的jQuery插件.它通过FileSaver.js文件来 ...
- PHP 使用word模板生成word文档示例
<?php namespace Home\Controller; use PhpOffice\PhpWord\TemplateProcessor; use Think\Controller; c ...
- 纯前端vue利用docxtemplater实现生成word文档下载 word模板,勾选框的默认勾选。。
首先需要下载如下工具: cnpm i docxtemplater pizzip jszip-utils file-saver -S 然后将它们引入: import JSZipUtils from &q ...
- java后台利用模板生成Word文档提供前台下载
2016.12.06更新,java后台利用Apache poi生成Excel文档提供前台下载,博客链接http://blog.csdn.net/u010251278/article/details/5 ...
最新文章
- java for xp_20155328 《Java程序设计》实验三 敏捷开发与XP实践 实验报告
- CodeForces - 1324F Maximum White Subtree(树形dp)
- 数组的连续子数组最大和(首尾相连)
- 滴滴App突发Bug:滴滴一下,千元出发
- mysql数据导入导出 CSV格式_mysql数据一键导出到csv文件
- 为企业量身定制IT资产管理解决方案(一)
- linux mysql 配置root_Linux配置(mysql安装篇)
- 电子商务入门、实操、行业分析及公司案例等精彩系列问答有哪些?
- 24X24 黑体简体中文点阵字库
- Java三大体系JavaSE、JavaEE、JavaME的区别
- 毕业后拉开大家差距的原因
- spring整合WebService入门详解
- Hive 动态分区恢复静态分区表数据
- GreemPlum6.7.1 Centos7部署文档
- 如何使用百度地图API
- 用VSCode打开带图片的.md文件
- Linux的ssh学习与配置(SSH的登录)
- Ubuntu安装NVIDIA 显卡驱动
- ElementUI 整体页面布局
- POI解析Word批注信息
热门文章
- 电容三点式LC振荡器电路组成及工作原理简述
- 狗子的Android学习笔记(二)环境搭建以及配置问题
- CRM客户关系管理系统答辩技术介绍(简答)
- 最新BlOS详解,及UEFi引导重装系统方法
- splash下拉滚动条位置
- linux进程异常退出分析,ECS Linux程序异常退出提示“out of memory”的临时解决办法...
- Build file: no target in no project
- 家居美学新主张——冰箱天然紫晶着色,可绘画面板!
- Hyperspectral Band Selection by Multitask Sparsity Puisuit
- ElasticSearch(十一)Java用ElasticSearch 利用搜索词分词搜索