用 Freemarker 生成 word 文檔

jopen 11年前發布 | 46K 次閱讀 Office文檔處理 FreeMarker

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

    } }</pre></span>

    添加圖片

    如果你需要在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();
    
    

    } }</pre>

    自定義載入模板

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

}</pre>來自:http://www.cnblogs.com/zhuyoufeng/archive/2011/09/01/2161558.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!