springMVC项目使用freemarker生成word文档

工作中遇到需要根据模板内容生成word文档需求,特此记录。

一、准备word并转化成xml文件

    1、准备word模板

    springMVC项目使用freemarker生成word文档_第1张图片

    2、使用office打开,并另存为 Word Xml文档格式。

    springMVC项目使用freemarker生成word文档_第2张图片

    3、将生成好的XML文件用工具打开,并格式化,我使用的是Notepad++,并安装了XML Tools插件。

    刚生成好的xml文件如下:

    springMVC项目使用freemarker生成word文档_第3张图片

    此时,格式不利于代码编写,需要格式化,格式化完成后如下,

    springMVC项目使用freemarker生成word文档_第4张图片

    此时,我们可直接将XML文件后缀名改为.doc并打开,发现没有问题,如部分文字位置不对,一般是文档中的空格在转成xml时自动去除了。此时我们可将XML文件调整下。

    如“页眉”两字直接在图片后面了,中间没有了空格,此时,我们在xml文件中搜索“页眉”,找到如下代码:

springMVC项目使用freemarker生成word文档_第5张图片

        这个标签中,添加了xml:space="preserve"属性,xml:space是一个Enumerated类型的属性,它的设置值只能是“default”或“preserve”:“default”表示应用程序可以自行随意处理空格等字符;“preserve”则表示应用程序应把空格等字符当做普通文本字符处理。所以我们可将页眉修改为    页眉,再保存后转为.doc文档,查看,页眉显示和原来一样了。

    至此,前期工作已准备好了。我们开始在项目中实现导出。

二、在项目中相应目录中添加一个ftl文件,将处理后的xml代码拷贝到文件中。

    将xml文件中需要替换的内容写上freemarker标签,如将姓名修改为代码传参。将xml中“张妍”替换为 ${name!''}

三、编写测试代码:

package com.near.demo.word.service;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import freemarker.template.Configuration;
import freemarker.template.Template;

public class ExportWordService {

    private static final Logger logger = LoggerFactory.getLogger(ExportWordService.class);

    public static void main(String[] args) throws Exception {
        String outputFile = "C:\\Users\\Administrator\\Desktop\\word\\test.doc";
        OutputStream out = new FileOutputStream(outputFile);
        Map map = new HashMap<>();
        map.put("name", "李四");
        createWord(out, "/wordTemplate.ftl", map);
    }

    public static void createWord(OutputStream out, String templatePath, Object props) {
        Writer wrter = null;
        Configuration configuration = new Configuration();
        configuration.setDefaultEncoding("utf-8");
        // 模板加载路径
        configuration.setClassForTemplateLoading(ExportWordService.class, "/template");
        Template t = null;
        try {
            t = configuration.getTemplate(templatePath);
            wrter = new OutputStreamWriter(out, "utf-8");
            t.process(props, wrter);
            wrter.flush();
        } catch (Exception ex) {
            logger.error(ex.getMessage());
        } finally {
            if (null != wrter) {
                try {
                    wrter.close();
                } catch (IOException e) {
                    logger.error(e.getMessage());
                }
            }
        }
    }
}

运行后,成功生成word文档。姓名也修改为了李四。后期再加上一些问题解决记录。


你可能感兴趣的:(java)