博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用 Freemarker 生成 word 文档
阅读量:6894 次
发布时间:2019-06-27

本文共 6730 字,大约阅读时间需要 22 分钟。



阅读目录

1.       word写一个需要导出的word模板,然后存为xml格式。

2.       xml中需要动态修改内容的地方,换成freemarker的标识符,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<
w:p
wsp:rsidR
=
"00D02906"
wsp:rsidRDefault
=
"00FA4C58"
wsp:rsidP
=
"00FA4C58"
>
         
<
w:pPr
>
             
<
w:jc
w:val
=
"center"
/>
             
<
w:rPr
>
                 
<
w:rFonts
w:hint
=
"fareast"
/>
             
</
w:rPr
>
         
</
w:pPr
>
         
<
w:r
>
             
<
w:t
>${year}</
w:t
>
         
</
w:r
>
         
<
w:r
>
             
<
w:rPr
>
                 
<
wx:font
wx:val
=
"宋体"
/>
             
</
w:rPr
>
             
<
w:t
>年度工作报告</
w:t
>
         
</
w:r
><
span
style
=
"line-height:22px;font-family:'Courier New';"
class
=
"Apple-style-span"
><
span
style
=
"color:#0000ff;"
></</
span
><
span
style
=
"color:#800000;"
>w:p</
span
><
span
style
=
"color:#0000ff;"
>></
span
></
span
>
3.
      
用代码生成:
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
import
freemarker.template.Configuration;
 
import
freemarker.template.Template;
  
 
import
java.io.*;
 
import
java.util.HashMap;
 
import
java.util.Map;
  
 
/**
  
* @Class name:    CreateDoc
  
* <p/>
  
* Short description on the purpose of the program.
  
* @author : youfeng
  
* @modified : 8/29/11
  
*/
 
public
class
CreateDoc {
  
     
private
Configuration configuration =
null
;
  
     
public
CreateDoc() {
         
configuration =
new
Configuration();
         
configuration.setDefaultEncoding(
"utf-8"
);
     
}
  
     
public
void
create()
throws
Exception {
         
Map<String, Object> map =
new
HashMap<String, Object>();
         
map.put(
"date"
,
"2011"
);
         
map.put(
"modifyDate"
,
"2011/8/29"
);
         
map.put(
"modifyUser"
,
"Zhu You Feng"
);
  
         
configuration.setClassForTemplateLoading(
this
.getClass(),
"/docTemplate/"
);
         
Template t = configuration.getTemplate(
"doc1.ftl"
);
         
File outFile =
new
File(
"D:/outFile.doc"
);
         
Writer out =
new
BufferedWriter(
new
OutputStreamWriter(
new
FileOutputStream(outFile)));
         
t.process(map, out);
     
}
  
     
public
static
void
main(String[] args)
throws
Exception {
         
new
CreateDoc().create();
  
     
}
 
}

添加图片

如果你需要在word中添加图片,那你就在第一步制作模板时,加入一张图片占位,然后打开xml文档,可以看到如下的一片base64编码后的代码:

1 
<
w:binData 
w:name
="wordml://03000001.png"
 xml:space
="preserve"
>
iVBORw0…(很省略很省略)…CC
</
w:binData
>

只要将base64的代码替换成例如:${image},如下:

1 
<
w:binData 
w:name
="wordml://03000001.png"
 xml:space
="preserve"
>
${image}
</
w:binData
>

这里要注意>${image}<这尖括号中间不能加任何其他的诸如空格,tab,换行等符号。

然后用代码生成:

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
import
freemarker.template.Configuration;
 
import
freemarker.template.Template;
 
import
sun.misc.BASE64Encoder;
  
 
import
java.io.*;
 
import
java.util.HashMap;
 
import
java.util.Map;
  
 
/**
  
* @Class name:    CreateDoc
  
* @author: youfeng
  
* @modified: 8/29/11
  
*/
 
public
class
CreateDocWithImage {
  
     
private
Configuration configuration =
null
;
  
     
public
CreateDocWithImage() {
         
configuration =
new
Configuration();
         
configuration.setDefaultEncoding(
"utf-8"
);
     
}
  
     
public
void
create()
throws
Exception {
         
Map<String, Object> map =
new
HashMap<String, Object>();
         
map.put(
"year"
,
"2011"
);
         
map.put(
"person"
,
"Zhu You Feng"
);
         
map.put(
"image"
, getImageStr());
  
         
configuration.setClassForTemplateLoading(
this
.getClass(),
"/docTemplate/"
);
         
Template t = configuration.getTemplate(
"doc2.ftl"
);
         
File outFile =
new
File(
"D:/outFile.doc"
);
         
Writer out =
new
BufferedWriter(
new
OutputStreamWriter(
new
FileOutputStream(outFile)));
         
t.process(map, out);
     
}
  
     
private
String getImageStr() {
         
String imgFile =
"d:/test.jpg"
;
         
InputStream in =
null
;
         
byte
[] data =
null
;
         
try
{
             
in =
new
FileInputStream(imgFile);
             
data =
new
byte
[in.available()];
             
in.read(data);
             
in.close();
         
}
catch
(IOException e) {
             
e.printStackTrace();
         
}
         
BASE64Encoder encoder =
new
BASE64Encoder();
         
return
encoder.encode(data);
     
}
  
     
public
static
void
main(String[] args)
throws
Exception {
         
new
CreateDocWithImage().create();
  
     
}
 
}

自定义载入模板

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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import
freemarker.cache.TemplateLoader;
import
freemarker.template.Configuration;
import
freemarker.template.Template;
import
freemarker.template.TemplateException;
import
sun.misc.BASE64Encoder;
 
import
java.io.*;
import
java.util.HashMap;
import
java.util.Map;
 
public
class
DocumentGenerator {
    
private
Configuration configuration =
null
;
 
    
public
static
void
main(String[] args)
throws
Exception {
        
Map<String, Object> map =
new
HashMap<String, Object>();
        
map.put(
"date"
,
"2012"
);
        
map.put(
"modifyDate"
,
"2011/8/29"
);
        
map.put(
"modifyUser"
,
"Zhu You Feng"
);
        
new
DocumentGenerator().createDoc(
""
,
"D:/outFile2.doc"
, map);
    
}
 
    
public
DocumentGenerator() {
        
configuration =
new
Configuration();
        
configuration.setDefaultEncoding(
"utf-8"
);
        
configuration.setClassicCompatible(
true
);
        
configuration.setTemplateLoader(
new
ByteArrayStreamTemplateLoader(
new
ByteArrayInputStream(
                        
getBytesFromFile(
new
File(
"D:/ownProject/freemarkerToDoc/src/main/resources/docTemplate/doc1.ftl"
))
                
)));
    
}
 
    
/**
     
* @param fileName
     
* @param outFileName
     
* @param dataMap
     
*/
    
public
void
createDoc(String fileName, String outFileName, Map dataMap) {
        
Template t =
null
;
        
try
{
            
t = configuration.getTemplate(fileName);
        
}
catch
(IOException e) {
            
e.printStackTrace();
        
}
        
File outFile =
new
File(outFileName);
        
Writer out =
null
;
        
try
{
            
out =
new
BufferedWriter(
new
OutputStreamWriter(
new
FileOutputStream(outFile)));
        
}
catch
(FileNotFoundException e1) {
            
e1.printStackTrace();
        
}
        
try
{
            
t.process(dataMap, out);
        
}
catch
(TemplateException e) {
            
e.printStackTrace();
        
}
catch
(IOException e) {
            
e.printStackTrace();
        
}
    
}
 
    
public
byte
[] getBytesFromFile(File f) {
        
if
(f ==
null
) {
            
return
null
;
        
}
        
try
{
            
FileInputStream stream =
new
FileInputStream(f);
            
ByteArrayOutputStream out =
new
ByteArrayOutputStream(
1000
);
            
byte
[] b =
new
byte
[
1000
];
            
int
n;
            
while
((n = stream.read(b)) != -
1
)
                
out.write(b,
0
, n);
            
stream.close();
            
out.close();
            
return
out.toByteArray();
        
}
catch
(IOException e) {
            
e.printStackTrace();
        
}
        
return
null
;
    
}
}
 
 
class
ByteArrayStreamTemplateLoader
implements
TemplateLoader {
 
    
InputStream in =
null
;
 
    
public
ByteArrayStreamTemplateLoader(ByteArrayInputStream inputStream) {
        
in = inputStream;
    
}
 
    
public
Object findTemplateSource(String name)
throws
IOException {
        
System.out.println(
"findTemplateSource"
);
        
return
in;
    
}
 
    
public
long
getLastModified(Object templateSource) {
        
return
0
;
    
}
 
    
public
Reader getReader(Object templateSource, String encoding)
throws
IOException {
        
System.out.println(
"getReader"
);
        
return
new
InputStreamReader(in);
    
}
 
    
public
void
closeTemplateSource(Object templateSource)
throws
IOException {
        
System.out.println(
"closeTemplateSource"
);
        
if
(in !=
null
) {
            
in.close();
        
}
    
}
}

转载地址:http://ebudl.baihongyu.com/

你可能感兴趣的文章
memcached简介
查看>>
Ubuntu 更改 Gun Make 版本
查看>>
Service学习笔记
查看>>
idea配置git、GitHub
查看>>
Cocopods安装和升级备忘录
查看>>
如何用Python写一个贪吃蛇AI
查看>>
nginx全局变量
查看>>
今日一练习
查看>>
Kylin 在 58 集团的实践和应用
查看>>
javascript性能优化
查看>>
41. First Missing Positive
查看>>
sql的行转列(PIVOT)与列转行(UNPIVOT)
查看>>
sbt配置——数据源问题解决
查看>>
框架模式与设计模式之区别
查看>>
AngularJS+Satellizer+Node.js+MongoDB->Instagram-13
查看>>
CSS 实现打字效果
查看>>
jquery 根据已知值来修改单选框的被选中项
查看>>
html5 aside
查看>>
并发线程学习001(volatile 使用)
查看>>
JSONArray().fromObject(); 出现org.apache.catalina.core.StandardWrapperValve invoke错误的解决办法...
查看>>