用 Freemarker 生成 word 文档

jopen 6年前

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

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

<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></w:p> 
3.       </span></span>用代码生成:
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></div> </div> </span>

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

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

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

然后用代码生成:

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

自定义载入模板

 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://www.cnblogs.com/zhuyoufeng/archive/2011/09/01/2161558.html