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

2025-05-29 0 19

最近项目中需要根据模板生成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

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58
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);

}

}

}

}

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19
/***

* 处理图片

* @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并插入图片(水印)功能基本完成。

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

原文链接:https://www.cnblogs.com/4king/p/11728575.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Java模板动态生成word文件的方法步骤 https://www.kuaiidc.com/104892.html

相关文章

发表评论
暂无评论