用 Freemarker 生成 word 文档

来源:互联网 发布:单片机 开关机 编辑:程序博客网 时间:2024/04/28 19:34


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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<w:pwsp:rsidR="00D02906"wsp:rsidRDefault="00FA4C58"wsp:rsidP="00FA4C58">
         <w:pPr>
             <w:jcw:val="center"/>
             <w:rPr>
                 <w:rFontsw:hint="fareast"/>
             </w:rPr>
         </w:pPr>
         <w:r>
             <w:t>${year}</w:t>
         </w:r>
         <w:r>
             <w:rPr>
                 <wx:fontwx:val="宋体"/>
             </w:rPr>
             <w:t>年度工作报告</w:t>
         </w:r><spanstyle="line-height:22px;font-family:'Courier New';"class="Apple-style-span"><spanstyle="color:#0000ff;"></</span><spanstyle="color:#800000;">w:p</span><spanstyle="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;
 importfreemarker.template.Template;
  
 importjava.io.*;
 importjava.util.HashMap;
 importjava.util.Map;
  
 /**
  * @Class name:    CreateDoc
  * <p/>
  * Short description on the purpose of the program.
  * @author : youfeng
  * @modified : 8/29/11
  */
 publicclass CreateDoc {
  
     privateConfiguration configuration = null;
  
     publicCreateDoc() {
         configuration =new Configuration();
         configuration.setDefaultEncoding("utf-8");
     }
  
     publicvoid create() throwsException {
         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(newOutputStreamWriter(newFileOutputStream(outFile)));
         t.process(map, out);
     }
  
     publicstatic void main(String[] args) throws Exception {
         newCreateDoc().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;
 importfreemarker.template.Template;
 importsun.misc.BASE64Encoder;
  
 importjava.io.*;
 importjava.util.HashMap;
 importjava.util.Map;
  
 /**
  * @Class name:    CreateDoc
  * @author: youfeng
  * @modified: 8/29/11
  */
 publicclass CreateDocWithImage {
  
     privateConfiguration configuration = null;
  
     publicCreateDocWithImage() {
         configuration =new Configuration();
         configuration.setDefaultEncoding("utf-8");
     }
  
     publicvoid create() throwsException {
         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(newOutputStreamWriter(newFileOutputStream(outFile)));
         t.process(map, out);
     }
  
     privateString 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();
         returnencoder.encode(data);
     }
  
     publicstatic void main(String[] args) throws Exception {
         newCreateDocWithImage().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 {
    privateConfiguration configuration = null;
 
    publicstatic 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");
        newDocumentGenerator().createDoc("","D:/outFile2.doc", map);
    }
 
    publicDocumentGenerator() {
        configuration =new Configuration();
        configuration.setDefaultEncoding("utf-8");
        configuration.setClassicCompatible(true);
        configuration.setTemplateLoader(newByteArrayStreamTemplateLoader(newByteArrayInputStream(
                        getBytesFromFile(newFile("D:/ownProject/freemarkerToDoc/src/main/resources/docTemplate/doc1.ftl"))
                )));
    }
 
    /**
     * @param fileName
     * @param outFileName
     * @param dataMap
     */
    publicvoid 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(newOutputStreamWriter(newFileOutputStream(outFile)));
        }catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }
        try{
            t.process(dataMap, out);
        }catch (TemplateException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    publicbyte[] getBytesFromFile(File f) {
        if(f == null) {
            returnnull;
        }
        try{
            FileInputStream stream =new FileInputStream(f);
            ByteArrayOutputStream out =new ByteArrayOutputStream(1000);
            byte[] b =new byte[1000];
            intn;
            while((n = stream.read(b)) != -1)
                out.write(b,0, n);
            stream.close();
            out.close();
            returnout.toByteArray();
        }catch (IOException e) {
            e.printStackTrace();
        }
        returnnull;
    }
}
 
 
class ByteArrayStreamTemplateLoader implementsTemplateLoader {
 
    InputStream in =null;
 
    publicByteArrayStreamTemplateLoader(ByteArrayInputStream inputStream) {
        in = inputStream;
    }
 
    publicObject findTemplateSource(String name) throwsIOException {
        System.out.println("findTemplateSource");
        returnin;
    }
 
    publiclong getLastModified(Object templateSource) {
        return0;
    }
 
    publicReader getReader(Object templateSource, String encoding)throws IOException {
        System.out.println("getReader");
        returnnew InputStreamReader(in);
    }
 
    publicvoid closeTemplateSource(Object templateSource)throws IOException {
        System.out.println("closeTemplateSource");
        if(in != null) {
            in.close();
        }
    }
}
0 0