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
>
|
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();
}
}
}
|