Java使用freemarker导出word文档
通过freemarker,以及JAVA,导出word文档。
共分为三步:
第一步:创建模板文件
第二步:通过JAVA创建返回值。
第三步:执行
分别介绍如下:
第一步:
首先创建word文档,按照想要的格式写好模板,需要替换的位置,使用 ${} 占位,其{}中放入名称,以便执行代码时使用。
例子如下

这个模板只要是报告的格式,包括报告名称,报告时间,报告人。下边的是编号和标题,以及内容。因为标题和内容方面可能存在多个,在后边可以循环输出。
制作完成之后,将该文档另存为xml格式。(注意:尽量选择2003版本的xml,否则可能出现文档太大打不开的问题。)
另存为xml之后,需要对其做简单的修改以便于循环输出。
我使用的结果为Map嵌套的,所以输出的循环语句为
<#assign num= 0>
<#list kejis?keys as key> //kejis为接收map的键。
<#assign num = num+1>
${num}${kejis[key].title} //在这需要找到文档中中对应位置做相应修改。
</#list>
也可以使用list集合输出。
修改完成之后将文件后缀修改为ftl格式。备用
第二步:
1.首先准备工具类,导出用,类中的方法共四个参数,按顺序为 传递的值(Map类型),模板文件,生成word存储路径,生成文件名
package Util;
import freemarker.template.Configuration;
import freemarker.template.Template; import java.io.*;
import java.util.Locale;
import java.util.Map;
public class WordUtil {
public static void createWord(Map dataMap, String templateName, String filePath, String fileName){
try {
//创建配置实例
Configuration configuration = new Configuration(); //设置编码
configuration.setDefaultEncoding("UTF-8");
configuration.setEncoding(Locale.getDefault(), "utf-8");
//ftl模板文件统一放至 com.lun.template 包下面
configuration.setClassForTemplateLoading(WordUtil.class,"/"); //获取模板
Template template = configuration.getTemplate(templateName); //输出文件
File outFile = new File(filePath+File.separator+fileName); //如果输出目标文件夹不存在,则创建
if (!outFile.getParentFile().exists()){
outFile.getParentFile().mkdirs();
} //将模板和数据模型合并生成文件
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8")); //生成文件
template.process(dataMap, out); //关闭流
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
} }
2.准备返回值及调用
public static void main(String[] args) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("time", "2019-4-1");
map.put("name", "报告名称");
map.put("bgname", "wys");
Map<String, Object> kejis=new HashMap<String, Object>();
for(int i=0;i<10;i++) {
Wordout wordout=new Wordout();
wordout.setTitle("标题"+i);
wordout.setContent("内容"+i);
kejis.put(""+i, wordout); //注意此处的第一个参数应保持每次put都是不同的
}
map.put("kejis", kejis);
String filePath = "D:\\policy\\" ;
String filename = "bk.doc";
WordUtil.createWord(map, "bk.ftl", filePath, filename);
}
第三步:执行上边代用主函数的代码生成word成功,结果如下

以上便完成了word文档导出。
总结:
经过多次尝试,导出的word文档大小和xml文件的大小成正比的,所以在xml文件加循环的时候,应该尽量减少循环中的内容,以减小文件的大小,否则,生成的文件会太大导致打开太慢,或者无法打开的问题。
并且另存为xml文件的时候,选择2003版本为宜,因为经过测试,相同的word模板,另存为两种不同xml大小不同,2003版本的较小,所以选择该版本。
假如想入输出带有格式的word,只需要将占位符修改为相应格式即可。字体格式,大小,颜色等属性都会继承过去。
附:
这是经常用到的freemarker的语法
1.if语句(判断是否为空)
<#if target?? >
此处为if为true的内容
</#if>
2.list循环(map循环上文使用过了)
<#list list as t>
${t.title}
</#list>
如果想实现多层嵌套,只需要将返回值也嵌套进去,xml文件也相应的嵌套即可。
这是我首次使用freemarker的过程,如有错误,望指正,我及时修改
Java使用freemarker导出word文档的更多相关文章
- Java用freemarker导出Word 文档
1.用Microsoft Office Word打开word原件: 2.把需要动态修改的内容替换成***,如果有图片,尽量选择较小的图片几十K左右,并调整好位置: 3.另存为,选择保存类型Word 2 ...
- freemarker导出word文档——WordXML格式解析
前不久,公司一个项目需要实现导出文档的功能,之前是一个同事在做,做了3个星期,终于完成了,但是在项目上线之后却发现导出的文档有问题,此时,这个同事已经离职,我自然成为接班者,要把导出功能实现,但是我看 ...
- freemarker导出word文档
使用freemarker导出word文档的过程 **************************************************************************** ...
- java使用freemarker 生成word文档
java 生成word文档 最近需要做一个导出word的功能, 在网上搜了下, 有用POI,JXL,iText等jar生成一个word文件然后将数据写到该文件中,API非常繁琐而且拼出来的 ...
- 使用Freemarker导出Word文档(包含图片)代码实现及总结
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- java使用freemarker生成word文档
1.原料 开源jar包freemarker.eclipse.一份模板word文档 2.首先设计模板word文档 一般,通过程序输出的word文档的格式是固定的,例如建立一个表格,将表格的标题写好,表格 ...
- 使用FreeMarker导出word文档(支持导出图片)
一.添加maven依赖,导入FreeMarker所需要的jar包 <dependency> <groupId>org.freemarker</groupId> &l ...
- java用iText导出word文档
1.需要导入的jar包 2.导出word并下载其实是分两步的. 第一步是将需要导出的数据导出(上传)到服务器上 第二步是将服务器上的文档下载到本地 3. 第一步.上传文档 (1)设置响应信息以及构造上 ...
- Java 用Freemarker完美导出word文档(带图片)
Java 用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...
随机推荐
- 在依赖的框架中已经有统一异常处理的情况下,如何定制自己的统一异常处理spring boot版本
spring boot 环境下的统一异常处理大家已经非常熟悉了,不熟悉的化可以参考 <<Spring Boot中Web应用的统一异常处理>>.公司内部的统一异常处理如下: @E ...
- git(程序员的时光机)
git 是什么 最强大的分布式版本控制系统,没有之一 版本控制: 完成一项任务,最终的成果可能是经过中间修修修改n次得到的,在这n个版本之间的切换就叫版本控制. 集中式的版本控制svn,cvs缺点: ...
- Python报错module 'scipy.misc' has no attribute 'xxx'
Python报错module 'scipy.misc' has no attribute 'imresize' 解决办法: 安装Pillow包,命令如下: pip install Pillow 然后重 ...
- Django学习笔记(二)URL编写规则
先在根目录以及每个app内添加一个空白的urls.py(此处根目录指项目同名文件夹内).程序收到用户请求时,先在根目录的urls.py查找该URL属于哪个app,再从app的urls.py找到具体的U ...
- Django的一些注意事项
不要使用 Python 或 Django 的组件名命名项目.具体而言,不要使用“django”(与 Django 冲 突)或“test”(与 Python 内置的一个包冲突)这样的名称. 在中文版中, ...
- 【神经网络与深度学习】卷积神经网络(CNN)
[神经网络与深度学习]卷积神经网络(CNN) 标签:[神经网络与深度学习] 实际上前面已经发布过一次,但是这次重新复习了一下,决定再发博一次. 说明:以后的总结,还应该以我的认识进行总结,这样比较符合 ...
- CVE-2018-2628
哈哈哈,终于等到我复现一个CVE漏洞了. 漏洞描述 Oracle Fusion Middleware(Oracle融合中间件)是美国甲骨文(Oracle)公司的一套面向企业和云环境的业务创新平台.该平 ...
- 代码: 0x80131500 win10应用商店崩溃了
网上搜索大部分认同的结果如下 1.打开“运行”输入 inetcpl.cpl (“WINDOWS”+“R”键,输入 inetcpl.cpl亦可) 2.点开高级往下拉,勾上"使用TLS 1.2& ...
- 关于Linux文本处理“三剑客”的一些小操作。
Linux文本处理“三剑客”,即grep.sed.awk,这是Linux中最核心 的3个命令. 一.首先做个简单的介绍: 1.awk:linux三剑客老大,过滤,输出内容,一门语言.NR代表行号. 2 ...
- PTA(Basic Level)1032.挖掘机技术哪家强
为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第 1 行给出不超过 105 的正整数 N,即参赛人数.随后 N ...