Java之利用FreeMarker導出Word實例

gavinnu 7年前發布 | 18K 次閱讀 Java開發 FreeMarker

提出問題

Java中如何利用FreeMarker導出word文檔???

解決問題

1.先用word準備一個模板,如下圖:

2.我們把word文檔另存為xml格式的文件,用Notepad++工具打開,一下只截取部分內容.

3.我們開始處理第一個問題:文字處理,Ctrl+F找到XML文檔中文字,將“以下省略一萬字”替換為${textDeal},保存文件,將文件的后綴改為.ftl,自此模板制作成功。

4.編碼實現文本替換:

package com.hwy.test;

import freemarker.template.Configuration; import freemarker.template.Template; import java.io.*; import java.util.HashMap; import java.util.Map; /**

  • word導出
  • Created by Ay on 2016/6/27. */ public class WordDocExportTest {

    public static void main(String[] args) throws Exception{

     /** 初始化配置文件 **/
     Configuration configuration = new Configuration();
     /** 設置編碼 **/
     configuration.setDefaultEncoding("utf-8");
     /** 我的ftl文件是放在D盤的**/
     String fileDirectory = "D:\\";
     /** 加載文件 **/
     configuration.setDirectoryForTemplateLoading(new File(fileDirectory));
     /** 加載模板 **/
     Template template = configuration.getTemplate("FreeMarker中word導出XML.ftl");
     /** 準備數據 **/
     Map<String,String> dataMap = new HashMap<>();
     /** 在ftl文件中有${textDeal}這個標簽**/
     dataMap.put("textDeal","一下省略一萬字");
     /** 指定輸出word文件的路徑 **/
     String outFilePath = "D:\\myFreeMarker.doc";
     File docFile = new File(outFilePath);
     FileOutputStream fos = new FileOutputStream(docFile);
     Writer out = new BufferedWriter(new OutputStreamWriter(fos, "utf-8"),10240);
     template.process(dataMap,out);
    
     if(out != null){
         out.close();
     }
    

    } }</code></pre>

    5.編碼實現圖片的替換

    具體代碼如下:

    package com.hwy.test;
    import freemarker.template.Configuration;
    import freemarker.template.Template;
    import sun.misc.BASE64Encoder;
    import java.io.*;
    import java.util.HashMap;
    import java.util.Map;
    /**

  • word導出
  • Created by Ay on 2016/6/27. */ public class WordDocExportTest {

    public static void main(String[] args) throws Exception{

     /** 初始化配置文件 **/
     Configuration configuration = new Configuration();
     /** 設置編碼 **/
     configuration.setDefaultEncoding("utf-8");
     /** 我的ftl文件是放在D盤的**/
     String fileDirectory = "D:\\";
     /** 加載文件 **/
     configuration.setDirectoryForTemplateLoading(new File(fileDirectory));
     /** 加載模板 **/
     Template template = configuration.getTemplate("FreeMarker中word導出XML.ftl");
     /** 準備數據 **/
     Map<String,String> dataMap = new HashMap<>();
    
     /** 圖片路徑 **/
     String imagePath = "D:\\apple.jpg";
     /** 將圖片轉化為**/
     InputStream in = null;
     byte[] data = null;
     try {
         in = new FileInputStream(imagePath);
         data = new byte[in.available()];
         in.read(data);
         in.close();
     } catch (Exception e) {
         e.printStackTrace();
     }finally {
         if(in != null){
             in.close();
         }
     }
     /** 進行base64位編碼 **/
     BASE64Encoder encoder = new BASE64Encoder();
    
     /** 在ftl文件中有${textDeal}這個標簽**/
     dataMap.put("textDeal","一下省略一萬字");
     /** 圖片數據**/
     dataMap.put("myImage",encoder.encode(data));
    
     /** 指定輸出word文件的路徑 **/
     String outFilePath = "D:\\myFreeMarker.doc";
     File docFile = new File(outFilePath);
     FileOutputStream fos = new FileOutputStream(docFile);
     Writer out = new BufferedWriter(new OutputStreamWriter(fos, "utf-8"),10240);
     template.process(dataMap,out);
    
     if(out != null){
         out.close();
     }
    

    } }</code></pre>

    結果,I love you這張圖片又出現了:

    6.freeMarker表格處理

    1)同樣道理,找到表格的位置,替換成freeMarker標簽,圖片如下:

    具體代碼:

    package com.hwy.test;
    import freemarker.template.Configuration;
    import freemarker.template.Template;
    import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;

/**

  • word導出
  • Created by Ay on 2016/6/27. */ public class WordDocExportTest {

    public static void main(String[] args) throws Exception{

     /** 初始化配置文件 **/
     Configuration configuration = new Configuration();
     /** 設置編碼 **/
     configuration.setDefaultEncoding("utf-8");
     /** 我的ftl文件是放在D盤的**/
     String fileDirectory = "D:\\";
     /** 加載文件 **/
     configuration.setDirectoryForTemplateLoading(new File(fileDirectory));
     /** 加載模板 **/
     Template template = configuration.getTemplate("FreeMarker中word導出XML.ftl");
     /** 準備數據 **/
     Map<String,List<Student>> dataMap = new HashMap<>();
    
     /** 表格數據初始化 **/
     List<Student> studentList = new ArrayList<>();
     studentList.add(new Student("100424060","小毅","男","25"));
     studentList.add(new Student("100424030","小蘭","女","25"));
    
     /** 表格數據 studentList和freemarker標簽要對應**/
     dataMap.put("studentList",studentList);
    
     /** 指定輸出word文件的路徑 **/
     String outFilePath = "D:\\myFreeMarker.doc";
     File docFile = new File(outFilePath);
     FileOutputStream fos = new FileOutputStream(docFile);
     Writer out = new BufferedWriter(new OutputStreamWriter(fos, "utf-8"),10240);
     template.process(dataMap,out);
    
     if(out != null){
         out.close();
     }
    

    } }</code></pre>

    Student類如下: 這里有一個問題,如果Student類寫在WordDocExportTest類中,就會出現問題,很奇怪,只能單獨另啟一個類了。

    package com.hwy.test;

/**

  • Created by Ay on 2016/6/29. */ public class Student{ private String id; private String name; private String sex; private String age;

    public String getId() {

     return id;
    

    }

    public void setId(String id) {

     this.id = id;
    

    }

    public String getName() {

     return name;
    

    }

    public void setName(String name) {

     this.name = name;
    

    }

    public String getSex() {

     return sex;
    

    }

    public void setSex(String sex) {

     this.sex = sex;
    

    }

    public String getAge() {

     return age;
    

    }

    public void setAge(String age) {

     this.age = age;
    

    }

    public Student(String id, String name, String sex, String age) {

     this.id = id;
     this.name = name;
     this.sex = sex;
     this.age = age;
    
    

    } }</code></pre>

    結果如下:

    ![這里寫圖片描述](http://upload-images.jianshu.io/upload_images/2321678-fe12900dbb9277fd?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    7.word中字體樣式調整

    1)我們把四種的字體“這里是字體樣式......”在word中字體樣式改為仿宋_gb2312,大小改為30號如下:

    2)用同樣的方法,把word轉變為 ftl 文件,打開如下

    所有以后word需要什么的樣式,都是在原先word調好樣式,在轉變為ftl文件即可

    8.頁眉頁腳設置

    1)相同道理,在原先word插入頁眉“Hello Freemarker”,另存為xml文件,再后綴為ftl文件即可,既是我們要的文件

     

     

    來自:http://www.jianshu.com/p/f58802a29d8a

     

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