需求场景

这个需求对于ERP或者银行项目还是比较常见的,用户需要下载word文件or在线预览 -> 打印合同,表格 文件等。

本次需求有 1.文档中的字符串替换 2.表格生成 3. 图片插入替换 4. 批量插入图片

技术方案

  1. 模板 + Word XML 文档(*.xml) -> 生成xml文件后修改后缀为 .doc

  2. docx4j 直接操作 *.docx -> 暂不说明

  3. XWFTemplate -> 暂不说明

实现讲解

技术方案一:

模板 + Word XML 文档(*.xml) -> 生成xml文件后修改后缀为 .doc

技术准备

其中模板语言选用的是freemarker. 也可与使用jsp,velocity,thymeleaf等。 本文选用freemarker的原因在于文档较多,技术也比较老,大家都应该会一点点。

freemarker 语法简介: Freemarker 语法详解

如果需要用到输出转义 -> ${object?html}

步骤一

  1. 编辑word文档,将其中需要动态替换的字符串-> ${xxx}

  2. 需要动态替换的图片处理好(一个位置一个不同的图片哦,如果相同,word只会存储一份)

  3. 表格处理,需要for处理的表格,处理为两行,方便后期用模板语言处理

步骤二

将word文件另存为:

word

步骤三

编辑xml文件,查询${xxx}是否完整,没有错位

  1. 动态替换的图片的内存存储在 binarydata中,进行替换
    public static String getImageStr(InputStream in) {
        byte[] data = null;
        try {
            data = new byte[in.available()];
            in.read(data);
            in.close();
            BASE64Encoder encoder = new BASE64Encoder();
            return encoder.encode(data);
        } catch (IOException e) {
            log.error("获取图片Str失败", e);
        }
        return "";
    }

其中批量插入图片 -> 使用freemarker导出word并动态插入多张图片

  1. 表格需要找到相关对称的地方,用freemarker <#list>语法处理即可

  2. 文件处理完毕 输出为后缀为.doc文件即可

项目中个人Freemarker配置

        configuration.setDefaultEncoding("utf-8");
        //允许对象不存在
        configuration.setClassicCompatible(true);
       //不对数字进行格式化 
        configuration.setNumberFormat("0");

注意点

  1. 比如你用到了 word 华文仿宋GB2312字体,一定要看自己电脑是否装了这个字体,否则符号 数字 等会分割开,${xxx}在xml中会分隔开,达不到替换的目的
  1. 早期的WPS可能不支持 word.doc 升级下wps,而不是单纯的换技术