Java模板动态生成word文件的方法步骤

 更新时间:2021年07月05日 09:25:53   作者:麋途知鹿  
最近项目中需要根据模板生成word文档,模板文件也是word文档。本文使用使用freemarker模板生成word文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

最近项目中需要根据模板生成word文档,模板文件也是word文档。当时思考一下想用POI API来做,但是觉得用起来相对复杂。后来又找了一种方式,使用freemarker模板生成word文件,经过尝试觉得还是相对简单易行的。

使用freemarker模板生成word文档主要有这么几个步骤

1、创建word模板:因为我项目中用到的模板本身是word,所以我就直接编辑word文档转成freemarker(.ftl)格式的。

2、将改word文件另存为xml格式,注意使用另存为,不是直接修改扩展名。

3、将xml文件的扩展名改为ftl

4、编写java代码完成导出

使用到的jar:freemarker.jar (2.3.28) ,其中Configuration对象不推荐直接new Configuration(),仔细看Configuration.class文件会发现,推荐的是 Configuration(Version incompatibleImprovements) 这个构造方法,具体这个构造方法里面传的就是Version版本类,而且版本号不能低于2.3.0

闲言碎语不再讲,直接上代码

 public static void exportDoc() {
        String picturePath = "D:/image.png";
        Map<String, Object> dataMap = new HashMap<String, Object>();
        dataMap.put("brand", "海尔");
        dataMap.put("store_name", "海尔天津");
        dataMap.put("user_name", "小明");

        //经过编码后的图片路径
        String image = getWatermarkImage(picturePath);
        dataMap.put("image", image);

        //Configuration用于读取ftl文件
        Configuration configuration = new Configuration(new Version("2.3.0"));
        configuration.setDefaultEncoding("utf-8");

        Writer out = null;
        try {
            //输出文档路径及名称
            File outFile = new File("D:/导出优惠证明.doc");
            out = new BufferedWriter(new OutputStreamWriter(new
            FileOutputStream(new File("outFile")), "utf-8"), 10240);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        // 加载文档模板
        Template template = null;
        try {
            //指定路径,例如C:/a.ftl 注意:此处指定ftl文件所在目录的路径,而不是ftl文件的路径
            configuration.setDirectoryForTemplateLoading(new File("C:/"));
            //以utf-8的编码格式读取文件
            template = configuration.getTemplate("导出优惠证明.ftl", "utf-8");
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("文件模板加载失败!", e);
        }

        // 填充数据
        try {
            template.process(dataMap, out);
        } catch (TemplateException e) {
            e.printStackTrace();
            throw new RuntimeException("模板数据填充异常!", e);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("模板数据填充异常!", e);
        } finally {
            if (null != out) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    throw new RuntimeException("文件输出流关闭异常!", e);
                }
            }
        }
    }

因为很多时候我们根据模板生成文件需要添加水印,也就是插入图片

/***
 * 处理图片
 * @param watermarkPath 图片路径  D:/image.png
 * @return
 */
private String getWatermarkImage(String watermarkPath) {
    InputStream in = null;
    byte[] data = null;
    try {
        in = new FileInputStream(watermarkPath);
        data = new byte[in.available()];
        in.read(data);
        in.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    BASE64Encoder encoder = new BASE64Encoder();
    return encoder.encode(data);
}

注意点:

插入图片后的word转化为ftl模板文件(ps:水印图片可以在word上调整到自己想要的大小,然后在执行下面的步骤)

1、先另存为xml

2、将xml扩展名改为ftl

3、打开ftl文件, 搜索w:binData 或者 png可以快速定位图片的位置,图片 已经编码成0-Z的字符串了, 如下:

5、 将上述0-Z的字符串全部删掉,写上${image}(变量名随便写,跟dataMap里的key保持一致)后保存

6、也是创建一个Map, 将数据存到map中,只不过我们要把图片用代码进行编码,将其也编成0-Z的字符串,代码请看上边

至此一个简单的按照模板生成word并插入图片(水印)功能基本完成。

到此这篇关于Java模板动态生成word文件的方法步骤的文章就介绍到这了,更多相关Java 模板动态生成word内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • SpringBoot一个非常蛋疼的无法启动的问题解决

    SpringBoot一个非常蛋疼的无法启动的问题解决

    这篇文章主要介绍了SpringBoot一个非常蛋疼的无法启动的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • java如何通过FileOutputStream字节流向文件中写数据

    java如何通过FileOutputStream字节流向文件中写数据

    这篇文章主要介绍了java如何通过FileOutputStream字节流向文件中写数据问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • spring boot 测试单元修改数据库不成功的解决

    spring boot 测试单元修改数据库不成功的解决

    这篇文章主要介绍了spring boot 测试单元修改数据库不成功的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 使用Java DOM解析器修改XML文件内容的操作方法

    使用Java DOM解析器修改XML文件内容的操作方法

    在Java中,XML文件的解析和修改可以通过多种方法实现,其中DOM(Document Object Model)是一种常用的方式,在本文中,我们将介绍如何使用Java DOM解析器修改XML文件中的内容,并给出一个具体的示例,需要的朋友可以参考下
    2024-08-08
  • Java Selenide 简介与用法

    Java Selenide 简介与用法

    Selenium 是目前用的最广泛的Web UI 自动化测试框架,本文给大家介绍下Java Selenide使用,感兴趣的朋友一起看看吧
    2022-01-01
  • Reactive Programming入门概念详解

    Reactive Programming入门概念详解

    这篇文章主要为大家介绍了Reactive Programming入门概念详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 基于springboot的flowable工作流实战流程分析

    基于springboot的flowable工作流实战流程分析

    这篇文章主要介绍了基于springboot的flowable工作流实战流程分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • Spring Boot日志基础使用之如何设置日志级别

    Spring Boot日志基础使用之如何设置日志级别

    这篇文章主要介绍了Spring Boot日志基础使用设置日志级别的方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • 浅析如何在Java应用中优雅的发送短信

    浅析如何在Java应用中优雅的发送短信

    很多业务场景里,我们都需要发送短信,比如登陆验证码、告警、营销通知、节日祝福等等,这篇文章,我们聊聊 Java 应用中如何优雅的发送短信,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2023-11-11
  • IDEA上运行Flink任务的实战教程

    IDEA上运行Flink任务的实战教程

    这篇文章主要介绍了IDEA上运行Flink任务的实战教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10

最新评论