1. 用word写一个需要导出的word模板,然后存为xml格式。
2. 将xml中需要动态修改内容的地方,换成freemarker的标识符,例如:
1
<
w:p
wsp:rsidR
="00D02906"
wsp:rsidRDefault
="00FA4C58"
wsp:rsidP
="00FA4C58"
>
2 < w:pPr >
3 < w:jc w:val ="center" />
4 < w:rPr >
5 < w:rFonts w:hint ="fareast" />
6 </ w:rPr >
7 </ w:pPr >
8 < w:r >
9 < w:t > ${year} </ w:t >
10 </ w:r >
11 < w:r >
12 < w:rPr >
13 < wx:font wx:val ="宋体" />
14 </ w:rPr >
15 < w:t > 年度工作报告 </ w:t >
16 </ w:r >
2 < w:pPr >
3 < w:jc w:val ="center" />
4 < w:rPr >
5 < w:rFonts w:hint ="fareast" />
6 </ w:rPr >
7 </ w:pPr >
8 < w:r >
9 < w:t > ${year} </ w:t >
10 </ w:r >
11 < w:r >
12 < w:rPr >
13 < wx:font wx:val ="宋体" />
14 </ w:rPr >
15 < w:t > 年度工作报告 </ w:t >
16 </ w:r >
17 </w:p>
3. 用代码生成:
1
import
freemarker.template.Configuration;
2 import freemarker.template.Template;
3
4 import java.io. * ;
5 import java.util.HashMap;
6 import java.util.Map;
7
8 /**
9 * @Class name: CreateDoc
10 * <p/>
11 * Short description on the purpose of the program.
12 * @author : youfeng
13 * @modified : 8/29/11
14 */
15 public class CreateDoc {
16
17 private Configuration configuration = null ;
18
19 public CreateDoc() {
20 configuration = new Configuration();
21 configuration.setDefaultEncoding( " utf-8 " );
22 }
23
24 public void create() throws Exception {
25 Map < String, Object > map = new HashMap < String, Object > ();
26 map.put( " date " , " 2011 " );
27 map.put( " modifyDate " , " 2011/8/29 " );
28 map.put( " modifyUser " , " Zhu You Feng " );
29
30 configuration.setClassForTemplateLoading( this .getClass(), " /docTemplate/ " );
31 Template t = configuration.getTemplate( " doc1.ftl " );
32 File outFile = new File( " D:/outFile.doc " );
33 Writer out = new BufferedWriter( new OutputStreamWriter( new FileOutputStream(outFile)));
34 t.process(map, out);
35 }
36
37 public static void main(String[] args) throws Exception {
38 new CreateDoc().create();
39
40 }
41 }
2 import freemarker.template.Template;
3
4 import java.io. * ;
5 import java.util.HashMap;
6 import java.util.Map;
7
8 /**
9 * @Class name: CreateDoc
10 * <p/>
11 * Short description on the purpose of the program.
12 * @author : youfeng
13 * @modified : 8/29/11
14 */
15 public class CreateDoc {
16
17 private Configuration configuration = null ;
18
19 public CreateDoc() {
20 configuration = new Configuration();
21 configuration.setDefaultEncoding( " utf-8 " );
22 }
23
24 public void create() throws Exception {
25 Map < String, Object > map = new HashMap < String, Object > ();
26 map.put( " date " , " 2011 " );
27 map.put( " modifyDate " , " 2011/8/29 " );
28 map.put( " modifyUser " , " Zhu You Feng " );
29
30 configuration.setClassForTemplateLoading( this .getClass(), " /docTemplate/ " );
31 Template t = configuration.getTemplate( " doc1.ftl " );
32 File outFile = new File( " D:/outFile.doc " );
33 Writer out = new BufferedWriter( new OutputStreamWriter( new FileOutputStream(outFile)));
34 t.process(map, out);
35 }
36
37 public static void main(String[] args) throws Exception {
38 new CreateDoc().create();
39
40 }
41 }
添加图片
如果你需要在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
import
freemarker.template.Configuration;
2 import freemarker.template.Template;
3 import sun.misc.BASE64Encoder;
4
5 import java.io. * ;
6 import java.util.HashMap;
7 import java.util.Map;
8
9 /**
10 * @Class name: CreateDoc
11 * @author : youfeng
12 * @modified: 8/29/11
13 */
14 public class CreateDocWithImage {
15
16 private Configuration configuration = null ;
17
18 public CreateDocWithImage() {
19 configuration = new Configuration();
20 configuration.setDefaultEncoding( " utf-8 " );
21 }
22
23 public void create() throws Exception {
24 Map < String, Object > map = new HashMap < String, Object > ();
25 map.put( " year " , " 2011 " );
26 map.put( " person " , " Zhu You Feng " );
27 map.put( " image " , getImageStr());
28
29 configuration.setClassForTemplateLoading( this .getClass(), " /docTemplate/ " );
30 Template t = configuration.getTemplate( " doc2.ftl " );
31 File outFile = new File( " D:/outFile.doc " );
32 Writer out = new BufferedWriter( new OutputStreamWriter( new FileOutputStream(outFile)));
33 t.process(map, out);
34 }
35
36 private String getImageStr() {
37 String imgFile = " d:/test.jpg " ;
38 InputStream in = null ;
39 byte [] data = null ;
40 try {
41 in = new FileInputStream(imgFile);
42 data = new byte [in.available()];
43 in.read(data);
44 in.close();
45 } catch (IOException e) {
46 e.printStackTrace();
47 }
48 BASE64Encoder encoder = new BASE64Encoder();
49 return encoder.encode(data);
50 }
51
52 public static void main(String[] args) throws Exception {
53 new CreateDocWithImage().create();
54
55 }
56 }
2 import freemarker.template.Template;
3 import sun.misc.BASE64Encoder;
4
5 import java.io. * ;
6 import java.util.HashMap;
7 import java.util.Map;
8
9 /**
10 * @Class name: CreateDoc
11 * @author : youfeng
12 * @modified: 8/29/11
13 */
14 public class CreateDocWithImage {
15
16 private Configuration configuration = null ;
17
18 public CreateDocWithImage() {
19 configuration = new Configuration();
20 configuration.setDefaultEncoding( " utf-8 " );
21 }
22
23 public void create() throws Exception {
24 Map < String, Object > map = new HashMap < String, Object > ();
25 map.put( " year " , " 2011 " );
26 map.put( " person " , " Zhu You Feng " );
27 map.put( " image " , getImageStr());
28
29 configuration.setClassForTemplateLoading( this .getClass(), " /docTemplate/ " );
30 Template t = configuration.getTemplate( " doc2.ftl " );
31 File outFile = new File( " D:/outFile.doc " );
32 Writer out = new BufferedWriter( new OutputStreamWriter( new FileOutputStream(outFile)));
33 t.process(map, out);
34 }
35
36 private String getImageStr() {
37 String imgFile = " d:/test.jpg " ;
38 InputStream in = null ;
39 byte [] data = null ;
40 try {
41 in = new FileInputStream(imgFile);
42 data = new byte [in.available()];
43 in.read(data);
44 in.close();
45 } catch (IOException e) {
46 e.printStackTrace();
47 }
48 BASE64Encoder encoder = new BASE64Encoder();
49 return encoder.encode(data);
50 }
51
52 public static void main(String[] args) throws Exception {
53 new CreateDocWithImage().create();
54
55 }
56 }
自定义载入模板
1 import freemarker.cache.TemplateLoader;
2
import
freemarker.template.Configuration;
3 import freemarker.template.Template;
4 import freemarker.template.TemplateException;
5 import sun.misc.BASE64Encoder;
6
7 import java.io. * ;
8 import java.util.HashMap;
9 import java.util.Map;
10
11 public class DocumentGenerator {
12 private Configuration configuration = null ;
13
14 public static void main(String[] args) throws Exception {
15 Map < String, Object > map = new HashMap < String, Object > ();
16 map.put( " date " , " 2012 " );
17 map.put( " modifyDate " , " 2011/8/29 " );
18 map.put( " modifyUser " , " Zhu You Feng " );
19 new DocumentGenerator().createDoc( "" , " D:/outFile2.doc " , map);
20 }
21
22 public DocumentGenerator() {
23 configuration = new Configuration();
24 configuration.setDefaultEncoding( " utf-8 " );
25 configuration.setClassicCompatible( true );
26 configuration.setTemplateLoader( new ByteArrayStreamTemplateLoader( new ByteArrayInputStream(
27 getBytesFromFile( new File( " D:/ownProject/freemarkerToDoc/src/main/resources/docTemplate/doc1.ftl " ))
28 )));
29 }
30
31 /**
32 * @param fileName
33 * @param outFileName
34 * @param dataMap
35 */
36 public void createDoc(String fileName, String outFileName, Map dataMap) {
37 Template t = null ;
38 try {
39 t = configuration.getTemplate(fileName);
40 } catch (IOException e) {
41 e.printStackTrace();
42 }
43 File outFile = new File(outFileName);
44 Writer out = null ;
45 try {
46 out = new BufferedWriter( new OutputStreamWriter( new FileOutputStream(outFile)));
47 } catch (FileNotFoundException e1) {
48 e1.printStackTrace();
49 }
50 try {
51 t.process(dataMap, out);
52 } catch (TemplateException e) {
53 e.printStackTrace();
54 } catch (IOException e) {
55 e.printStackTrace();
56 }
57 }
58
59 public byte [] getBytesFromFile(File f) {
60 if (f == null ) {
61 return null ;
62 }
63 try {
64 FileInputStream stream = new FileInputStream(f);
65 ByteArrayOutputStream out = new ByteArrayOutputStream( 1000 );
66 byte [] b = new byte [ 1000 ];
67 int n;
68 while ((n = stream.read(b)) != - 1 )
69 out.write(b, 0 , n);
70 stream.close();
71 out.close();
72 return out.toByteArray();
73 } catch (IOException e) {
74 e.printStackTrace();
75 }
76 return null ;
77 }
78 }
79
80
81 class ByteArrayStreamTemplateLoader implements TemplateLoader {
82
83 InputStream in = null ;
84
85 public ByteArrayStreamTemplateLoader(ByteArrayInputStream inputStream) {
86 in = inputStream;
87 }
88
89 public Object findTemplateSource(String name) throws IOException {
90 System.out.println( " findTemplateSource " );
91 return in;
92 }
93
94 public long getLastModified(Object templateSource) {
95 return 0 ;
96 }
97
98 public Reader getReader(Object templateSource, String encoding) throws IOException {
99 System.out.println( " getReader " );
100 return new InputStreamReader(in);
101 }
102
103 public void closeTemplateSource(Object templateSource) throws IOException {
104 System.out.println( " closeTemplateSource " );
105 if (in != null ) {
106 in.close();
107 }
108 }
109 }
3 import freemarker.template.Template;
4 import freemarker.template.TemplateException;
5 import sun.misc.BASE64Encoder;
6
7 import java.io. * ;
8 import java.util.HashMap;
9 import java.util.Map;
10
11 public class DocumentGenerator {
12 private Configuration configuration = null ;
13
14 public static void main(String[] args) throws Exception {
15 Map < String, Object > map = new HashMap < String, Object > ();
16 map.put( " date " , " 2012 " );
17 map.put( " modifyDate " , " 2011/8/29 " );
18 map.put( " modifyUser " , " Zhu You Feng " );
19 new DocumentGenerator().createDoc( "" , " D:/outFile2.doc " , map);
20 }
21
22 public DocumentGenerator() {
23 configuration = new Configuration();
24 configuration.setDefaultEncoding( " utf-8 " );
25 configuration.setClassicCompatible( true );
26 configuration.setTemplateLoader( new ByteArrayStreamTemplateLoader( new ByteArrayInputStream(
27 getBytesFromFile( new File( " D:/ownProject/freemarkerToDoc/src/main/resources/docTemplate/doc1.ftl " ))
28 )));
29 }
30
31 /**
32 * @param fileName
33 * @param outFileName
34 * @param dataMap
35 */
36 public void createDoc(String fileName, String outFileName, Map dataMap) {
37 Template t = null ;
38 try {
39 t = configuration.getTemplate(fileName);
40 } catch (IOException e) {
41 e.printStackTrace();
42 }
43 File outFile = new File(outFileName);
44 Writer out = null ;
45 try {
46 out = new BufferedWriter( new OutputStreamWriter( new FileOutputStream(outFile)));
47 } catch (FileNotFoundException e1) {
48 e1.printStackTrace();
49 }
50 try {
51 t.process(dataMap, out);
52 } catch (TemplateException e) {
53 e.printStackTrace();
54 } catch (IOException e) {
55 e.printStackTrace();
56 }
57 }
58
59 public byte [] getBytesFromFile(File f) {
60 if (f == null ) {
61 return null ;
62 }
63 try {
64 FileInputStream stream = new FileInputStream(f);
65 ByteArrayOutputStream out = new ByteArrayOutputStream( 1000 );
66 byte [] b = new byte [ 1000 ];
67 int n;
68 while ((n = stream.read(b)) != - 1 )
69 out.write(b, 0 , n);
70 stream.close();
71 out.close();
72 return out.toByteArray();
73 } catch (IOException e) {
74 e.printStackTrace();
75 }
76 return null ;
77 }
78 }
79
80
81 class ByteArrayStreamTemplateLoader implements TemplateLoader {
82
83 InputStream in = null ;
84
85 public ByteArrayStreamTemplateLoader(ByteArrayInputStream inputStream) {
86 in = inputStream;
87 }
88
89 public Object findTemplateSource(String name) throws IOException {
90 System.out.println( " findTemplateSource " );
91 return in;
92 }
93
94 public long getLastModified(Object templateSource) {
95 return 0 ;
96 }
97
98 public Reader getReader(Object templateSource, String encoding) throws IOException {
99 System.out.println( " getReader " );
100 return new InputStreamReader(in);
101 }
102
103 public void closeTemplateSource(Object templateSource) throws IOException {
104 System.out.println( " closeTemplateSource " );
105 if (in != null ) {
106 in.close();
107 }
108 }
109 }