java使用freemarker生成复杂word表格 | 张扎瓦的博客

java使用freemarker生成复杂word表格

本文介绍了使用freemarker生成复杂word表格的具体操作流程


制作模板

创建空word文档,制作表格样式

表1

填入自定义代码

图2

注意:如果有图片,需要先插入图片进行占位,否则会导致插入图片失败.

另存为.xml文件

图3

编辑xml文件

使用文本编辑器打开上一步保存的.xml文件,将自定义代码修改为${xxx}的样式.

图6

注意,有时候会有如下情况:

图7

手动修复后:

图8

图片部分,在xml文件里是一大串base64字符串,直接删除后,手动填入${xxx}(此处为自定义代码)即可.

写入模板

在poi.xml中贴入如下坐标,引入freemarker

1
2
3
4
5
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>

如果不是Maven项目,请自行下载jar包,导入项目即可.

实现代码:

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
@Test
public void test1() throws IOException, TemplateException {
// 配置freemarker模板
Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);
// 模板文件所在目录
cfg.setClassForTemplateLoading(ReadWord2.class, "/");
// 设置编码格式
cfg.setDefaultEncoding("UTF-8");
// 具体模板名称
Template temp = cfg.getTemplate("人员实名登记表.xml");
Map<String, Object> data = new HashMap<>();

String img = "E:\\资料\\壁纸\\1502468435367.jpg";
FileInputStream fis = new FileInputStream(img);

data.put("LB", "");
data.put("XM", "张三");
data.put("IDCARD", "111111111111");
data.put("IMG", ImageUtils.fileToBase64(fis));
data.put("OFFICE", "中国航天集团");
data.put("OFPHONE", "147258369");
data.put("ADDRESS", "常住地址");
data.put("PHONE", "12345678910");
data.put("IMEI", "sfsdfdsfds");
data.put("MAC", "ac:bc:cd:12:18");
data.put("TYPE", "小米");
data.put("EMAIL", "123456@qq.com");
data.put("WEIBO", "123@sina.com");
data.put("QQ", "123456");
data.put("WECHAT", "13123123");
data.put("OTHER", "xxx");



data.put("GX1", "父亲");
data.put("XM1", "大明");
data.put("IDCARD1", "156431561136566846");
data.put("PHONE1", "12345678910");
data.put("JOB1", "iOS工程师");

data.put("GX2", "母亲");
data.put("XM2", "大明老婆");
data.put("IDCARD2", "sdfdsd");
data.put("PHONE2", "12345678910");
data.put("JOB2", "Android工程师");

data.put("GX3", "妹妹");
data.put("XM3", "小明妹妹");
data.put("IDCARD3", "犯得上发射点");
data.put("PHONE3", "12345678910");
data.put("JOB3", "iOS工程师");



data.put("NUM1", "晋A·123456");
data.put("MODEL1", "马自达");
data.put("COLOR1", "红色");

data.put("NUM2", "晋A·654321");
data.put("MODEL2", "路虎");
data.put("COLOR2", "黑色");

data.put("NUM3", "晋A·147258");
data.put("MODEL3", "丰田");
data.put("COLOR3", "白色");

String fileName = "name.doc";
OutputStream fos = new FileOutputStream(new File(fileName));
Writer out = new OutputStreamWriter(fos, "utf-8");
temp.process(data, out);

// 关闭流
fos.flush();
fos.close();
}

文件生成base64字符串的代码:

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
public static String fileToBase64(InputStream is) {
String str = null;

try {
//将InputStream转换为byte数组
ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
byte[] bytes = new byte[1024]; //存放循环读取的临时变量
int i = 0;
while ((i = is.read(bytes)) > 0) {
byteArray.write(bytes, 0, i);
}

//将读取的字节转换为base64格式的字符串
str = new String(Base64.encodeBase64(byteArray.toByteArray()));
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

return str;
}

注意:如果部分参数没有值,请填写为空字符串,否则会报错.

生成的word如下:

图9

如果我的文章对您有所帮助,不妨打赏一杯豆浆以资鼓励(○` 3′○)