依據word模板批量生成試卷
阿新 • • 發佈:2018-12-04
java-word-MassProduction
目錄
一.使用方法
1.製造題庫所需Word模板
需要填充資料的地方使用 ${pid} 代替。
將這個word選擇另存為,儲存格式選擇為xml,然後將這個xml放到專案的ftl目錄下,字尾名改為.ftl 。
2.配置資料庫
專案中使用了hibernate,表結構可以自動生成,但前提得先有mysql資料庫環境且建立好資料庫,資料庫連線資訊可以在hibernate.hbm.xml中修改。
對應上面模板例項中的${pid}值,在對應資料庫中選擇題目寫入。
3.執行程式
在程式中選擇要使用的word模板.
寫入輸出的word名稱.
點選生成後,在專案word目錄下:
當然也可以在資料庫中匯入大量題目,在匯入時隨機選擇題目,然後對應相應的pid生成模板。
二.開發流程
1.題目模型
資料庫使用了hibernate,hibernate的相關知識不再做解釋.
Problem中定義了一道題目的資訊。
id資料庫主鍵索引.
pid對應word模板的${id}.
title對應了題目的內容。
IProblemDAO是一個介面,用來實現題目的增刪改查.
public interface IProblemDAO { void save(Problem problem); void update(Problem problem); void delete(Problem problem); Problem get(Integer id); List<Problem> listAll(); }
ProblemDAOImpl實現了IProblemDAO介面.
hibernate的save,delete,update,get等不再闡述.
ProblemDAOImpl的實現中我們使用到的其實只有listAll()方法。至於其他的暫時用不到。
2.Word生成
這裡主要用到了一個叫freemarker的第三方包。
1.什麼是FreeMarker?
FreeMarker是一款模板引擎,一種開源的、基於模板的、用來生成/輸出文字的通用工具。 它不是面向終端使用者的,不是Web應用框架,它是Java的一個類庫,是Web應用框架中的一個實用的元件,是一款可以嵌入開發產品的一款應用程式。 FreeMarker的設計是被用來生成HTML頁面,尤其是通過基於實現了MVC模式的Servlet應用程式。 使用MVC模式的動態網頁的構思,使得你可以將前端設計從程式中分離出來,更加貼合java的各司其職的程式設計思想,使得程式碼更簡潔且便於維護。 儘管FreeMarker也有程式設計能力,但它也不像PHP那樣的一種全面的程式語言。 一般我們只使用FreeMarker的模板生成個文字來呈現早已準備好的資料,它僅僅來生成文字,它也非常適用於非 Web應用環境的開發。 要注意的是,我們使用FreeMarker作為檢視層元件,是為給如 Struts這樣的 Model2框架提供現成的解決方案,已經在一定情況下提高頁面的響應速度。
2.FreeMaker的作用:頁面靜態化
a)JavaEEWeb 開發存在的問題:動態網頁技術建立的網頁相率低,需要把這些動態網頁轉換成靜態網頁,節省程式執行時間
b)是不是把一個系統中所有的網頁都進行靜態化? 什麼樣的頁面需要靜態化?
[1]不是,因為當一個頁面靜態化之後,所有的寫操作都會造成巨大的資源調動,造成更多資源的浪費,
所以我們只將一些修改機率不大或不會修改的頁面靜態化。
[2]例:電子圖書、商品詳情資訊....
c)CMS系統(Content Manager System) 就是把動態網頁靜態化
首先我們需要一個Map,其中是模板中 ${pid}的pid值與題目內容。
Map<String,String> dataMap = new HashMap<String,String>();
讀取模板ftl內容,ftl的格式規範其實是xml,所以我們使用Configuration用於讀取ftl檔案。
Configuration configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
configuration.setDirectoryForTemplateLoading(new File("src\\main\\java\\ftl\\"));
獲取ftl的Template。
Template t = configuration.getTemplate(templateFileName,"utf-8");
利用Map替換模板內容
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("src\\main\\java\\word\\"+outFile+".doc"), "utf-8"),10240);
t.process(dataMap, out);