目前大家所用的word文档导出的方法 大部分应该是
- Jacob
优点:调用微软Office的COM接口,生成的word文件格式规范。
缺点:服务器只能是windows平台,不支持unix和linux,且服务器上必须安装微软Office。 - Apache POI
优点:跨平台支持windows、unix和linux。
缺点:相对与对word文件的处理来说,POI更适合excel处理,对于word实现一些简单文件的操作凑合,不能设置样式且生成的word文件格式不够规范。 - Java2word
优点:足够简单,操作起来要比FreeMarker简单的多。
缺点:没有FreeMarker强大,不能够根据模版生成Word文档,word的文档的样式等信息都不能够很好的操作。 - FreeMarker
优点:比Java2word功能强大,也是纯Java编程。
缺点:生成的文件本质上是xml,不是真正的word文件格式,有很多常用的word格式无法处理或表现怪异,比如:超链、换行、乱码、部分生成的文件打不开等。 - PageOffice
优点:跨平台支持windows、unix和linux,生成word文件格式标准,支持文本、图片、表格、字体、段落、颜色、超链、页眉等各种格式的操作,支持多word合并,无需处理并发,不耗费服务器资源,运行稳定。
缺点:必须在客户端生成文件(可以不显示界面),不支持纯服务器端生成文件。
以上五种方法, 都有各自的局限性, 要么是文档中间转换问题, 要么是格式问题,要么是兼容性问题,都那么有点稍微的麻烦 . 由此我们想到有没有更加简单的一种技术支持? 比如有手就能操作实现的,当然这个说法有点略微夸大!
度娘是个好东西,一次word文档的导出,接触了一种新的word文档的导出 ,它支持超链接设置,图片插入,表格渲染,图表组合 ,即文章的主题 pol-ti 它是一个免费开源的Java类库,你可以非常方便的加入到你的Java项目中。
依赖及要求 : Apache POI 4.1.2+(必须是4.1.2版本+) JDK 1.8+
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.8.2</version>
</dependency>
poi-tl 导出word文档同freemarker一样也是利用了模板,不过他的模板不必要再进行doc/docx >>xml>> ftl的格式转换,直接利用源文件就可以,但是很可惜 他也有不可避免的局限性, pol-ti 仅支持docx格式的模板文件.
废话过多进入正题 生成文档所需:
1.模板
如上图所示这是一个简单的模板, 首先看下模板的文件名后缀 ,其次看下文本占位标签的使用,其中{{val2}}代表的是一个数组, [val3] 代表的是普通文本填充 ,[@val5]代表的是一个图片填充
下图是生成效果
package com.test.util;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.PictureRenderData;
import com.deepoove.poi.data.TextRenderData;
import com.deepoove.poi.policy.HackLoopTableRenderPolicy;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static java.lang.System.out;
public class PoiTlUtils {
/**
* 生成流信息返回
* @param templateName 模板名称
* @param response 相应信息
* @param config 相关策略配置
* @param data 数据集合
*/
public static void create(String templateName, HttpServletResponse response,Configure config, Map<String, Object> data){
XWPFTemplate template = XWPFTemplate.compile(templateName,config).render(data);
ServletOutputStream out =null;
try {
out = response.getOutputStream();
template.write(out);
} catch (IOException e) {
e.printStackTrace();
}finally {
close(template,out);
}
}
/**
* 生成文件
* @param templateName 模板名称
* @param outfilePath 输出文件到物理位置
* @param config 相关策略配置
* @param data 数据集合
*/
public static void create(String templateName, String outfilePath, Configure config , Map<String, Object> data){
XWPFTemplate template = XWPFTemplate.compile(templateName,config).render(data);
FileOutputStream out =null;
try {
out = new FileOutputStream(outfilePath);
template.write(out);
} catch (IOException e) {
e.printStackTrace();
}finally {
close(template,out);
}
}
public static void close(XWPFTemplate template,OutputStream out){
try {
if (out!=null){
out.flush();
out.close();
}
template.close();
}catch (IOException e){
e.printStackTrace();
}
}
public static void main(String[] args) {
Map map = new HashMap();
map.put("val1","hello poi-ti");
List list = new ArrayList();
Map map1 = new HashMap();
map1.put("val3","李2");
map1.put("val4","李3");
map1.put("val5",new PictureRenderData(80, 100, "G:\\img.jpg"));
map1.put("val6","李5");
map1.put("val7","李6");
list.add(map1);
new TextRenderData("000000", "Sayi");
/声明一个循环列表对象即 val2
HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
//告知poi-ti的配置项
Configure config = Configure.newBuilder().bind("val2",policy).build();
map.put("val2",list);
create("G:\\val1.docx","G:\\"+System.currentTimeMillis()+".docx",config,map);
}
}
Configure 对象出了支持他自有的标签外 还支持spring的EL标签
ConfigureBuilder builder = Configure.newBuilder();
builder.setElMode(Configure.ELMode.SPEL_MODE);
基本使用
{{name}}
{{name.toUpperCase()}} 1
{{name == 'poi-tl'}} 3
{{empty?:'这个字段为空'}} 3
{{sex ? '男' : '女'}} 3
{{new java.text.SimpleDateFormat('yyyy-MM-dd HH:mm:ss').format(time)}} 5
{{price/10000 + '万元'}} 6
{{dogs[0].name}} 7
1. 方法调用,转大写
3. 条件
4. 三目运算符
5. 方法调用,时间格式化
6. 运算符
7. 数组列表使用下标访问
相关参考文献即博客
五种下载介绍 : https://blog.youkuaiyun.com/zi_wu_xian/article/details/80320520
poi-tl 官方文档介绍