引入jar包,freemarker.jar、apache-ant-zip-1.8.0.jar(制作压缩包使用)

或者maven

org.freemarker

freemarker

2.3.23

org.apache.ant

ant

1.8.0

1、准备ftl模板,先在一个word中模板排版好,然后另存为-保存成“Word 2003 XML文档” 后缀名是.xml的文件

注:模板中的值要使用占位符进行填充 ,如下图所示,“name”名称是根据后台代码来的,这里可以换成自己的

然后生成.xml文件后,可以利用网上格式化工具格式化看下 生成的模板文件是否正确,占位符“${name}”必须是完整的,中间不能含有其他字符

如果word模板中含有图片,图片在xml文件中展现的形式是Base64格式的 ,包含在和中,把Base64删掉,替换成占位符,我这里使用的是“${photo}”(和中除了占位符不能有其他代码,也不能换行,主要是下面两个标签内都不能有其他标签)

如果没有和标签的话,就是在模板中没有把图片放进去,需要把图片也放进去模板中,然后生成xml文件

${photo}

如果是多张图片的时候,就在模板文档里面放多张图片,然后看生成的模板样子,内容都是可以循环的,把共同部分拿出来,然后使用标签进行循环遍历,有些字段循环也是不一样,如下图所示,每个人可能模板不一样。

2、然后把保存的wordExport.xml文件 后缀名改成.ftl文件

3、后台代码

导出word工具类

WordUtils.javapackagetestword;

import java.io.*;importjava.util.Map;importjavax.servlet.ServletOutputStream;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importfreemarker.template.Configuration;importfreemarker.template.Template;importsun.misc.BASE64Encoder;public classWordUtils {//配置信息,代码本身写的还是很可读的,就不过多注解了

private static Configuration configuration = null;//这里注意的是利用WordUtils的类加载器动态获得模板文件的位置//private static final String templateFolder = WordUtils.class.getClassLoader().getResource("../../").getPath() + "WEB-INF/templetes/";

public File exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map,String title,String templateFolder,String toDirFloder) throwsIOException {

configuration= newConfiguration();

configuration.setDefaultEncoding("utf-8");//模板所在文件夹

configuration.setDirectoryForTemplateLoading(newFile(templateFolder));//wordExport.ftl为模板文件名称

Template freemarkerTemplate = configuration.getTemplate("wordExport.ftl");

File file= null;

InputStream fin= null;

ServletOutputStream out= null;//调用工具类的createDoc方法生成Word文档

file =createDoc(map,freemarkerTemplate,title,toDirFloder);returnfile;

}private static File createDoc(Map, ?>dataMap, Template template,String filename,String toDirFloder) {

File f= new File(toDirFloder+"/"+filename+".doc");

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 newRuntimeException(ex);

}returnf;

}publicString getImageBase(String src) {if(src==null||src==""){return "";

}

File file= newFile(src);if(!file.exists()) {return "";

}

InputStream in= null;byte[] data = null;try{

in= newFileInputStream(file);

}catch(FileNotFoundException e1) {

e1.printStackTrace();

}try{

data= new byte[in.available()];

in.read(data);

in.close();

}catch(IOException e) {

e.printStackTrace();

}

BASE64Encoder encoder= newBASE64Encoder();returnencoder.encode(data);

}

}

导出压缩包工具类

Zipper.java

packagetestword;importorg.apache.commons.lang.StringUtils;importorg.apache.tools.zip.ZipEntry;importorg.apache.tools.zip.ZipOutputStream;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.util.Assert;import java.io.*;importjava.util.List;/*** 用于制作zip压缩包*/

public classZipper {private static final Logger log = LoggerFactory.getLogger(Zipper.class);/*** 制作压缩包

**/

public static void zip(OutputStream out, ListfileEntrys,

String encoding) {newZipper(out, fileEntrys, encoding);

}/*** 制作压缩包

**/

public static void zip(OutputStream out, ListfileEntrys) {new Zipper(out, fileEntrys, null);

}/*** 创建Zipper对象

*

*@paramout

* 输出流

*@paramfilter

* 文件过滤,不过滤可以为null。

*@paramsrcFilename

* 源文件名。可以有多个源文件,如果源文件是目录,那么所有子目录都将被包含。*/

protected Zipper(OutputStream out, ListfileEntrys,

String encoding) {

Assert.notEmpty(fileEntrys);long begin =System.currentTimeMillis();

log.debug("开始制作压缩包");try{try{

zipOut= newZipOutputStream(out);if (!StringUtils.isBlank(encoding)) {

log.debug("using encoding: {}", encoding);

zipOut.setEncoding(encoding);

}else{

log.debug("using default encoding");

}for(FileEntry fe : fileEntrys) {

zip(fe.getFile(), fe.getFilter(), fe.getZipEntry(), fe

.getPrefix());

}

}finally{

zipOut.close();

}

}catch(IOException e) {throw new RuntimeException("制作压缩包时,出现IO异常!", e);

}long end =System.currentTimeMillis();

log.info("制作压缩包成功。耗时:{}ms。", end -begin);

}/*** 压缩文件

*

*@paramsrcFile

* 源文件

*@parampentry

* 父ZipEntry

*@throwsIOException*/

private voidzip(File srcFile, FilenameFilter filter, ZipEntry pentry,

String prefix)throwsIOException {

ZipEntry entry;if(srcFile.isDirectory()) {if (pentry == null) {

entry= newZipEntry(srcFile.getName());

}else{

entry= new ZipEntry(pentry.getName() + "/" +srcFile.getName());

}

File[] files=srcFile.listFiles(filter);for(File f : files) {

zip(f, filter, entry, prefix);

}

}else{if (pentry == null) {

entry= new ZipEntry(prefix +srcFile.getName());

}else{

entry= new ZipEntry(pentry.getName() + "/" +prefix+srcFile.getName());

}

FileInputStream in;try{

log.debug("读取文件:{}", srcFile.getAbsolutePath());

in= newFileInputStream(srcFile);try{

zipOut.putNextEntry(entry);intlen;while ((len = in.read(buf)) > 0) {

zipOut.write(buf,0, len);

}

zipOut.closeEntry();

}finally{

in.close();

}

}catch(FileNotFoundException e) {throw new RuntimeException("制作压缩包时,源文件不存在:"

+srcFile.getAbsolutePath(), e);

}

}

}private byte[] buf = new byte[1024];privateZipOutputStream zipOut;public static classFileEntry {privateFilenameFilter filter;privateString parent;privateFile file;privateString prefix;publicFileEntry(String parent, String prefix, File file,

FilenameFilter filter) {this.parent =parent;this.prefix =prefix;this.file =file;this.filter =filter;

}publicFileEntry(String parent, File file) {this.parent =parent;this.file =file;

}publicFileEntry(String parent, String prefix, File file) {this(parent, prefix, file, null);

}publicZipEntry getZipEntry() {if(StringUtils.isBlank(parent)) {return null;

}else{return newZipEntry(parent);

}

}publicFilenameFilter getFilter() {returnfilter;

}public voidsetFilter(FilenameFilter filter) {this.filter =filter;

}publicString getParent() {returnparent;

}public voidsetParent(String parent) {this.parent =parent;

}publicFile getFile() {returnfile;

}public voidsetFile(File file) {this.file =file;

}publicString getPrefix() {if (prefix == null) {return "";

}else{returnprefix;

}

}public voidsetPrefix(String prefix) {this.prefix =prefix;

}

}

}

使用控制器类

packagetestword;importorg.springframework.web.bind.annotation.RequestMapping;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.File;importjava.io.IOException;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;public classTestWord {

@RequestMapping("/o_export")public voidexport(HttpServletRequest request, HttpServletResponse response) {

WordUtils wordUtils= newWordUtils();

List flist = new ArrayList();//这里要获取要导出的数据列表集合

List list = null;//模板所在文件夹路径

String tplDir = null;

//模板word临时存储的位置

String toDirFloder=null

//文件夹不存在,创建文件夹

File dirFile=new File(toDirFloder);

if (!dirFile.exists()){

dirFile.mkdirs();

}

//要循环遍历的数据

for(Object e : list) {//导出的word文件名称

String filename = null;try{

File file=wordUtils.exportMillCertificateWord(request, response, enrollToMap(e, wordUtils), filename, tplDir, toDirFloder);//这里表示压缩包下会有一个文件夹,名称是“学生信息表”,所有的word文件会放到这个文件夹底下

Zipper.FileEntry entry = new Zipper.FileEntry("学生信息表", file);//把文件放到压缩包中

flist.add(entry);

}catch(IOException e1) {

e1.printStackTrace();

}

}

response.setContentType("application/x-download;charset=UTF-8");try{//这里的“学生信息表”是压缩包文件名

response.addHeader("Content-disposition", "filename=" + new String("学生信息表".getBytes("gb2312"), "iso8859-1") + ".zip");

Zipper.zip(response.getOutputStream(), flist,"GBK");

//删除word临时保存的文件和文件夹

File[] files=dirFile.listFiles();

for (File f:files){

f.delete();

}

dirFile.delete();

}catch(IOException e) {

e.printStackTrace();

}

}publicMap enrollToMap(Student s, WordUtils wordUtils) {

Map map= newHashMap();//这里的name和sex为模板中占位符的名称 我模板中用的占位符是“${name}”,所以这里map集合的key是name

map.put("name", s.getName());

map.put("sex", s.getSex());//获取图片URL地址后,调用方法生成BASE64格式

String photoBase64 = wordUtils.getImageBase("图片URL绝对地址");

map.put("photo", photoBase64);returnmap;

}

}

ftl文件模板图片_JAVAWEB使用FreeMarker利用ftl把含有图片的word模板生成word文档,然后打包成压缩包进行下载...相关推荐

  1. springboot中使用freemarker生成word文档并打包成zip下载(简历)

    一.设计出的简历模板图以及给的简历小图标切图         二.按照简历模板图新建简历word文件 :${字段名},同时将图片插入到word中,并将建好的word文件另存为xml文件:    三.直 ...

  2. 利用OpenXml生成Word2007文档

    一.OpenXml简介 利用C#生成Word文档并非一定要利用OpenXml技术,至少可以使用微软提供的Office相关组件来编程,不过对于Office2007(确切的说是Word.Excel和Pow ...

  3. 利用OpenXml生成Word2007文档(转)

    转自:http://blog.csdn.net/francislaw/article/details/7568317 一.OpenXml简介 利用C#生成Word文档并非一定要利用OpenXml技术, ...

  4. Freemarker 生成work文档图片

    一.简介 通过freemarker生成work文档,其实原理很简单,先生成一个work的xm模板,然后替换文档中的内容为自己需要的内容就可以了. 二.生成work文档 1.生成ftl模板 把自己要修改 ...

  5. qt 利用 HTML 生成PDF文档,不能显示jpg图片

    利用 QPrinter 和html 生成 pdf文档 其中用html语句有显示图片的语句 但只能显示png格式的图片,不能显示jpg格式图片. 经过排查:语法,文件路径等都正确,最终在stack ov ...

  6. Springboot通过模板生成pdf文档带图片

    Springboot通过模板生成pdf文档带图片 环境:springboot2.3.10.RELEASE + itextpdf5.5.13.2 依赖 <dependency><gro ...

  7. 前端批量下载文件、图片、打包成压缩包,JZip和file-saver

    一.安装JZip和file-saver cnpm install file-saver jszip --save 二.导入 import { saveAs } from 'file-saver' im ...

  8. java后台处理excel_java后台利用Apache poi 生成excel文档提供前台下载示例

    之前在项目中会用到在java在后台把数据填入Word文档的模板来提供前台下载,为了自己能随时查看当时的实现方案及方便他人学习我写了这篇博客,访问量已经是我写的博客里第一了.于是乎我在学会用Java在后 ...

  9. freemarker mysql 生成bean_基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.6.6版)...

    TableGo_20191026 v6.6.6 正式发布,此次版本更新如下: 1.新增通过自定义模板生成Word文档的功能,可以使用FreeMarker模板生成自定义格式的数据库文档. 2.新增 Sw ...

  10. java-使用 flying-saucer 通过 xhtml 生成 pdf 文档支持 css 和 图片

    java-使用 flying-saucer 通过 xhtml 生成 pdf 文档支持 css 和 图片 重要说明: 1.使用 xhtml 生成 pdf ,对于 xhtml 的语法要求非常严格: 2.中 ...

最新文章

  1. 问号和星号 php,星号和问号两个通配符
  2. R显卡VR性能如何?AMD发布 VRMark Cyan Room 测试结果
  3. python远程创建linux用户_如何设置远程访问的Jupyter Notebook服务器-02:如何创建Linux用户?...
  4. LVS、Nginx、HAProxy工作环境中选择
  5. Spark 编程模型(上)
  6. Ubuntu 15.04 安装 boost-python
  7. socket 编程:回射客户/服务程序
  8. jQuery 入门教程(5): 显示/隐藏内容
  9. 进程之间的通信方式-共享内存
  10. zz -- QQ圈子感想
  11. puppet 学习总结(1)——puppet 入门详解
  12. cocoapods 总结
  13. (JavaScript)Mixin 模式
  14. 有一部电影用计算机回到未来,《复联4》调侃《回到未来》,1985年的这部穿越片,到底讲了什么...
  15. oracle数据库中的系统自带表情_教你如何让数据库支持emoji表情符存储
  16. illumina不愧是二代测序无冕之王
  17. Qt[每日一言|每日诗词]API调用
  18. 2013年图灵奖--莱斯利·兰波特简介
  19. Cocos2d-x 窗口大小调整
  20. opencv颜色识别-红色

热门文章

  1. 计算机word设置信纸,一分钟教你学会用Word做信纸和公章!
  2. 【Ware】C++编程软件
  3. html页面布局实例,div布局实例
  4. 【Jmeter】Jmeter使用教程
  5. Redis 菜鸟教程学习笔记- 概念
  6. protues8.0仿真视频教程 51单片机教程
  7. python微信api_python调用企业微信API
  8. 破解校园网“一人一号” 高校学子必备秘籍
  9. 饿汉式单例模式,懒汉式单例模式
  10. java jsp中文乱码怎么解决_分享JSP中文乱码解决方法