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

作者:麋途知鹿 时间:2023-01-08 15:19:58 

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

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

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

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

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的字符串了, 如下:

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

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

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

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

来源:https://www.cnblogs.com/4king/p/11728575.html

标签:Java,模板,动态生成,word
0
投稿

猜你喜欢

  • Spring Boot统一异常处理最佳实践(拓展篇)

    2023-10-29 16:00:04
  • 基于@RestControllerAdvice与@ControllerAdvice的区别说明

    2022-06-24 21:00:36
  • Java面向对象之抽象类,接口的那些事

    2022-08-25 19:16:30
  • java synchronized关键字的用法

    2022-11-19 13:45:25
  • 浅析Java SPI 与 dubbo SPI

    2021-10-23 16:54:12
  • Springboot WebFlux集成Spring Security实现JWT认证的示例

    2021-06-02 03:24:50
  • 关于Java中Json的各种处理

    2022-06-12 02:37:48
  • Android EditText限制输入字符的方法总结

    2023-04-22 03:16:24
  • 浅析Java中接口和抽象类的七大区别

    2022-01-16 21:09:36
  • Android:Field can be converted to a local varible.的解决办法

    2022-01-23 16:53:14
  • 一文搞懂Java MD5算法的原理及实现

    2023-01-04 21:10:24
  • LINQ排序操作符用法

    2023-10-26 02:19:10
  • 基于json解析神器 jsonpath的使用说明

    2022-06-14 08:57:18
  • Mybatis中的Criteria条件查询方式

    2022-02-21 06:49:46
  • Java NIO Path接口和Files类配合操作文件的实例

    2023-10-20 09:29:01
  • C#中重载与重写区别分析

    2023-11-01 17:43:05
  • 浅谈Servlet开发技术基础

    2023-01-17 04:03:15
  • JAVA 中Spring的@Async用法总结

    2023-11-28 16:35:58
  • C#中使用HttpDownLoadHelper下载文件实例

    2023-05-13 13:13:14
  • IDEA java出现无效的源发行版14解决方案

    2021-06-25 08:50:33
  • asp之家 软件编程 m.aspxhome.com