1. 程式人生 > >java中使用freemarker匯出word文件

java中使用freemarker匯出word文件

公司專案要求要有一個能匯出成一份word文件的功能,於是就上網搜了一些教程,但我跟著教程使用的時候還是遇到了很多問題,這裡我自己總結一份我作為新手使用freemarker能看懂的文章。可能以後自己還會用到,至少到時候忘了還可以翻看一下。

首先要自己在網上下載一個freemarker的jar包,這個直接百度就有,不贅述了。向自己的專案中匯入剛才下載的freemarker的jar包,然後把自己需要展示資料的文件開啟,例如我的文件是這樣:

因為我的專案需求是要把專案中的錯誤型別及其對應個數匯出成一份word文件,然後展示出來,這個word文件是組長給的文件模板,然後我只要將資料填充到對應的位置就可以了。所以這份模板中其他的東西都是可以不用管的,只要修改你需要填入資料的欄位就可以。這裡我需要填入的欄位是“出廠編號為空”,“熱穩定電流為空”,“裝置引數不準確”,“同型號裝置出廠編號相同”,“總數”等。然後我要修改的是他們分別對應的欄位,也就是後面的數量,這裡需要把數量那裡填入英文,拼音也可以,總之不要用中文,因為在後面我們需要在檔案中修改這些欄位。所以我分別在他們對應的位置中填入了“factoryNull”,“iNull”等等欄位。把欄位改好之後,我們把這份文件另存為xml的檔案格式

然後再次開啟這份xml文件,我是用notepad++開啟的,按下快捷鍵ctrl+f搜尋剛才自己寫的需要填入資料的欄位,比如第一個是“factoryNull”,然後會跳轉xml檔案的這個欄位,我們將其修改為"${factoryNull}",也就是新增一個"${}"在你的欄位外面,當然,裡面也可以不寫你以前填入word文件中的欄位,比如你也可以把他修改成"${a}",這樣也是可以的,就是後面你需要在一個java檔案中使用到你現在"${}"中寫的欄位,所以用一個有意義的單詞能一目瞭然知道是哪個欄位的比較好一點。然後接下來繼續搜尋第二個欄位,這裡是“iNull”,同樣的把這個修改成"${iNull}",接著進行同樣的操作,把剛才word中需要填入資料的欄位全部做以上修改操作,修改完成之後儲存,把你的xml檔案複製貼上到你的專案中的一個包下面

這裡我隨便建立了一個包名為“abc”,沒錯貼上進去之後直接重新命名你的xml檔案,把字尾改成ftl檔案就可以了,這樣模板我們就弄完了。

接下來我們要拷貝一段程式碼:

package com.xxx.test;

import java.io.BufferedWriter;  
import java.io.File;  
import java.io.FileNotFoundException;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.OutputStreamWriter;  
import java.io.Writer;  
import java.util.ArrayList;  
import java.util.HashMap;  
import java.util.List;  
import java.util.Map;  
  
import freemarker.template.Configuration;  
import freemarker.template.Template;  
import freemarker.template.TemplateException;  
  
public class WordTest {  
      
    private Configuration configuration = null;  
      
    public WordTest(){  
        configuration = new Configuration();  
        configuration.setDefaultEncoding("UTF-8");  
    }  
      
    public static void main(String[] args) {  
        WordTest test = new WordTest();  
        test.createWord();  
    }  
      
    public void createWord(){  
        Map<String,Object> dataMap=new HashMap<String,Object>();  
        getData(dataMap);  
        configuration.setClassForTemplateLoading(this.getClass(), "/abc");  //FTL檔案所存在的位置  
        Template t=null;  
        try {  
            t = configuration.getTemplate("count.ftl"); //檔名  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        File outFile = new File("D:/匯出的文件"+Math.random()*10000+".doc");  //匯出文件的存放位置
        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();  
        }  
    }  
  
    private void getData(Map<String, Object> dataMap) {  
        dataMap.put("factoryNull", "121");  
        dataMap.put("iNull", "1");
        dataMap.put("modelPara","222");
        dataMap.put("factorySame","55");
        dataMap.put("AllNum",66");
               
        List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();  
        for (int i = 0; i < 10; i++) {  
            Map<String,Object> map = new HashMap<String,Object>();  
            map.put("number", i);  
            map.put("content", "內容"+i);  
            list.add(map);  
        }  
          
          
        dataMap.put("list", list);  
    }  
}  

這個程式碼不是我寫的,是當時做這個的時候網上看到別人說的,就複製下來用了,發現可以用。然後這個程式碼複製過去後也是放在一個包下面,我也是隨便建了一個包,然後new了一個WordTest類,然後把這個程式碼複製過去,修改一下包名,然後修改一下ftl檔案存放位置,只需要在"/"後面寫下你那個存放的包名就可以,不用加檔名,然後下面接著修改檔名,寫下“你的檔名.ftl”,最後再修改一下你的匯出文件存放位置,這裡我直接存在D盤,這三個修改的地方後面都有註釋,直接可以看到。然後這個檔案修改完成之後,下面有一個getData方法,在這裡面put中就有我們之前在xml檔案中寫入"${}"這個裡面的欄位了,這時候我們就一個欄位一個put,然後put(“xml中欄位”,“你要輸入的資料”)一條一條寫就可以了。然後這些寫完之後直接執行這個java檔案,然後去相應的儲存位置找到匯出的word文件。

雙擊開啟之後就可以看到我們在檔案中填入的資料填入到這份文件中了。