如何玩转word文档导出???

目前大家所用的word文档导出的方法 大部分应该是

  1. Jacob
    优点:调用微软Office的COM接口,生成的word文件格式规范。
    缺点:服务器只能是windows平台,不支持unix和linux,且服务器上必须安装微软Office。
  2. Apache POI
    优点:跨平台支持windows、unix和linux。
    缺点:相对与对word文件的处理来说,POI更适合excel处理,对于word实现一些简单文件的操作凑合,不能设置样式且生成的word文件格式不够规范。
  3. Java2word
    优点:足够简单,操作起来要比FreeMarker简单的多。
    缺点:没有FreeMarker强大,不能够根据模版生成Word文档,word的文档的样式等信息都不能够很好的操作。
  4. FreeMarker
    优点:比Java2word功能强大,也是纯Java编程。
    缺点:生成的文件本质上是xml,不是真正的word文件格式,有很多常用的word格式无法处理或表现怪异,比如:超链、换行、乱码、部分生成的文件打不开等。
  5. 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 官方文档介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值