本篇是关于利用FreeMarker导出Word的实现步骤。

优点:采用FreeMarker是导出Word的最佳实现,非常的灵活,能够按照自己指定的样式设置并输出内容,操作简单方便,代码实现也容易。代码量少,样式、内容容易控制,打印不变形,完全符合office标准

缺点:需要提前设计好word模板,把需要替换的地方用特殊标记标出来

下面是实现的效果图:

下面是实现步骤:

1.添加FreeMarker需要的jar包(这里用的是2.3.28版本,从网上的maven仓库中获取的)

org.freemarker

freemarker

2.3.28

2.然后制作需要导出的Word模板。先利用office工具生成导出怎样的word样式,如图是我绘制的模板:

3.制作好了基本的样式之后,然后另存为.xml格式文档,如:

4.打开这个text.xml文件,在相应的地方填入${xx}表达式:

5.填好后,使用其Notepad++或Sublime工具打开文件,能够看到xml的内容如下:

填入后,如果有可能${}与 telephone 分离,则删除分离后${},然后在telephone上添加${}后保存。

另一种最安全的方式是:不删除分离的${},先在telephone上添加${},保存后,用word工具打开test.xml,将原来分离的${}删除即可。

6.成功修改后,将文件重命名为.ftl格式的文件。然后将文件放置在项目中或其他路径。这里我是将其拷贝至包中

7. 接下来是代码层的实现

packagecom.myHelloWorld;importjava.io.BufferedWriter;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStreamWriter;importjava.io.Writer;importjava.util.Map;importfreemarker.core.ParseException;importfreemarker.log.Logger;importfreemarker.template.Configuration;importfreemarker.template.MalformedTemplateNameException;importfreemarker.template.Template;importfreemarker.template.TemplateException;importfreemarker.template.TemplateExceptionHandler;importfreemarker.template.TemplateNotFoundException;importsun.misc.BASE64Encoder;/*** @Description 利用FreeMarker导出Word

* 2018年12月15日 下午10:23:40

* @Author Huang Xiaocong*/

public classExportMyWord {private Logger log = Logger.getLogger(ExportMyWord.class.toString());private Configuration config = null;publicExportMyWord() {

config= newConfiguration(Configuration.VERSION_2_3_28);

config.setDefaultEncoding("utf-8");

}/*** FreeMarker生成Word

*@paramdataMap 数据

*@paramtemplateName 目标名

*@paramsaveFilePath 保存文件路径的全路径名(路径+文件名)

* @Author Huang Xiaocong 2018年12月15日 下午10:19:03*/

public void createWord(MapdataMap, String templateName, String saveFilePath) {//加载模板(路径)数据

config.setClassForTemplateLoading(this.getClass(), "");//设置异常处理器 这样的话 即使没有属性也不会出错 如:${list.name}...不会报错

config.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);

Template template= null;if(templateName.endsWith(".ftl")) {

templateName= templateName.substring(0, templateName.indexOf(".ftl"));

}try{

template= config.getTemplate(templateName + ".ftl");

}catch(TemplateNotFoundException e) {

log.error("模板文件未找到", e);

e.printStackTrace();

}catch(MalformedTemplateNameException e) {

log.error("模板类型不正确", e);

e.printStackTrace();

}catch(ParseException e) {

log.error("解析模板出错,请检查模板格式", e);

e.printStackTrace();

}catch(IOException e) {

log.error("IO读取失败", e);

e.printStackTrace();

}

File outFile= newFile(saveFilePath);if(!outFile.getParentFile().exists()) {

outFile.getParentFile().mkdirs();

}

Writer out= null;

FileOutputStream fos= null;try{

fos= newFileOutputStream(outFile);

}catch(FileNotFoundException e) {

log.error("输出文件时未找到文件", e);

e.printStackTrace();

}

out= new BufferedWriter(newOutputStreamWriter(fos));//将模板中的预先的代码替换为数据

try{

template.process(dataMap, out);

}catch(TemplateException e) {

log.error("填充模板时异常", e);

e.printStackTrace();

}catch(IOException e) {

log.error("IO读取时异常", e);

e.printStackTrace();

}

log.info("由模板文件:" + templateName + ".ftl" + " 生成文件 :" + saveFilePath + " 成功!!");try{

out.close();//web项目不可关闭

}catch(IOException e) {

log.error("关闭Write对象出错", e);

e.printStackTrace();

}

}/*** 获得图片的Base64编码

*@paramimgFile

*@return* @Author Huang Xiaocong 2018年12月15日 下午10:15:10*/

publicString getImageStr(String imgFile) {

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

in= newFileInputStream(imgFile);

}catch(FileNotFoundException e) {

log.error("加载图片未找到", e);

e.printStackTrace();

}try{

data= new byte[in.available()];//注:FileInputStream.available()方法可以从输入流中阻断由下一个方法调用这个输入流中读取的剩余字节数

in.read(data);

in.close();

}catch(IOException e) {

log.error("IO操作图片错误", e);

e.printStackTrace();

}

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

}

}

下面是测试类:

public static voidmain(String[] args) {

ExportMyWord emw= newExportMyWord();

Map dataMap = new HashMap();

dataMap.put("name", "黄xx");

dataMap.put("age", 26);

dataMap.put("blog", "sun_flower火柴客");

dataMap.put("email", "sun_flower@xxxx.com");

dataMap.put("gender", "男");

dataMap.put("imgheader", emw.getImageStr("D:\\picture\\23.jpg"));

dataMap.put("telephone", "123456789101");

dataMap.put("address", "深圳");

dataMap.put("naturework", "全职");

dataMap.put("industry", "IT");

dataMap.put("aplication", "Java开发");

dataMap.put("time", "2013年-2017年");

dataMap.put("schoolname", "南昌大学");

dataMap.put("education", "本科");

dataMap.put("projectname", "电子证照xxxx");

dataMap.put("projecttime", "2017年3月");

dataMap.put("projectcontent", "我们除了有视、听、味、嗅、触这些外感系统之外,人类还有一个非常重要的内感系统,就是我们情绪和情感的世界。"

+ "这种感受是那样地细腻、微妙、强烈、深沉;看不见、摸不着,说不清、道不明。...");

emw.createWord(dataMap,"test.ftl", "E:/简历.doc");

}

7.效果图:

整个过程就是这样。

对于需要多条记录或循环的部分,只要在模板层的代码中添加标签:

${Item.projectname}

#list>

这里说下需要注意的点:

1)很多项目中采用的是Log4j或 Commons Logging日志形式。而Freemarker自带日志类型,即:

若导入的FreeMarker 2.3.x版本以下,可能回抛出Freemarker模版缓存问题:

Compiling FreeMarker template test.ftl[zh_CN,UTF-8,parsed] ....

Could not find template in cache

看官方解释:

2)插入图片的时候格外小心,因为可能导出后是一堆图片代码,那是因为模板未能识别这个图片。说明导出没有问题,而是模板有问题。解决方案就是在原来的地方随便插入一张图片,然后在ftl中删除图片代码就可以了。

同时 希望各位能提出宝贵的意见方便改进 不甚感激!!

ftl文件模板图片_使用Freemarker导出Word文档(包含图片)代码实现及总结相关推荐

  1. 使用freemarker导出word文档包含多张图片

    使用freemarker导出word文档包含多张图片 最近项目中有个需求就是导出word文档并且文档中需要有多张图片,我当时一脸懵逼啊,之前没有搞过这个啊,但是不要灰心,肯定会有很多人搞过的,百度一下 ...

  2. freemarker导出word文档对图片拉伸或拉长的处理

    最近因为java项目中有大量的图片需要导出到word(采用freemarker导出模板),导出的过程中发现一个问题:导出饼图的时候会随着浏览器的大小不同被拉长或者拉伸,查阅很多质料但网上并没有找到相关 ...

  3. java根据 freemarker 生成word文档包含图片和动态表格

    需求 根据提供的模板样式,生成相对应的word文档,之前可以用xdoc生成,但是目前这个需求 是需要动态生成excel表格,有的单元格需要隐藏不展示,所以这边利用freemarker标签解析, 根据数 ...

  4. java doc转图片_使用Java实现word文档转图片 在线预览

    [Java] 纯文本查看 复制代码/** * licence 验证 * @return * @throws Exception */ public static boolean getLicense( ...

  5. java通过freemarker导出word文档带图片并且循环

    转载请标明出处: https://blog.csdn.net/weixin_41965979/article/details/80969287 本文出自付付讶的博客 1:所需jar包:freemark ...

  6. freemarker导出Word文档并在其中插入图片

    先将word转成xml格式,再用notepad将其转为ftl格式(将要填入数据的地方加个占位符,${name}) import java.io.File; import java.io.FileInp ...

  7. java-制作flt模板,导出word文档带图片循环

    java-制作flt模板,导出word文档带图片循环 模板制作 制作xml 编辑xml文档 将xml模板转换为flt 编写工具类 导出word工具类 获取远程图片 使用示例 使用示例--springb ...

  8. freemarker导出word文档

    使用freemarker导出word文档的过程 **************************************************************************** ...

  9. spring使用freemarker生成word文档包含表格、图片(循环插入)

    spring使用freemarker生成word文档包含表格.图片(循环插入) 效果图 因为测试数据是重复的,所以显示都是重复的数据,替换导入map中的数据可以显示不重复的数据. 操作步骤 1,创建一 ...

最新文章

  1. 可视化与遗留系统的微服务改造
  2. Hadoop实战实例
  3. 2021年高考,26地公布高考出分时间
  4. 有限状态机(使用状态模式C++实现)
  5. bootbox显示中文的按钮
  6. linux下离线安装gcc
  7. SpringMVC 上传文件and过滤器
  8. 不同类型的变量在内存中存储的详细情况
  9. JQuery EasyUI之DataGrid列名和数据列分别设置不同对齐方式(转)
  10. Bootstrap 带下拉的导航
  11. 频率副词always,usually,often...用法_16
  12. JavaScript遭嫌弃,“反JS”主义者兴起
  13. Windows Phone 7知识锦分享【第二季】
  14. with 语句的妙用
  15. 动态的顺序表(C语言实现)
  16. 手机能给电脑装系统吗_使用手机给电脑装系统的方法
  17. html怎么隐藏信息,3.2.5 在HTML文件中隐藏信息
  18. Git之git pull【warning】Pulling without specifying how to reconcile divergent branches is
  19. ms10_002(极光漏洞)渗透步骤——MSF搭建钓鱼网站
  20. Android系统启动流程分析之启动应用

热门文章

  1. 如何做一个基于微信教室预约小程序系统毕业设计毕设作品
  2. 【机器学习】基于决策树的隐性眼镜选择
  3. 马:ma一个与代码无关的隐形眼镜的度数换算
  4. 软件提交入口,软件开发者必备
  5. 游戏化︱2022世界杯营销活动思路
  6. 超级课程表导入课表显示服务器繁忙,超级课程表导入不了怎么办 超级课程表怎么导入课程表...
  7. 超级课程表如何导入课程 超级课程表怎么导入课程
  8. SecureCRT 连接AWS ES2
  9. c语言外循环和内循环区别是什么意思,内循环和外循环的区别 内循环和外循环的正确使用方法...
  10. OpenCV中RGB转HSV