1. 程式人生 > >依據word模板批量生成試卷

依據word模板批量生成試卷

java-word-MassProduction

目錄

一.使用方法

1.製造題庫所需Word模板

img0

需要填充資料的地方使用 ${pid} 代替。

將這個word選擇另存為,儲存格式選擇為xml,然後將這個xml放到專案的ftl目錄下,字尾名改為.ftl 。

2.配置資料庫

專案中使用了hibernate,表結構可以自動生成,但前提得先有mysql資料庫環境且建立好資料庫,資料庫連線資訊可以在hibernate.hbm.xml中修改。

對應上面模板例項中的${pid}值,在對應資料庫中選擇題目寫入。

img6

3.執行程式

在程式中選擇要使用的word模板.

img1

img2

寫入輸出的word名稱.

img3

點選生成後,在專案word目錄下:

img4

img5

當然也可以在資料庫中匯入大量題目,在匯入時隨機選擇題目,然後對應相應的pid生成模板。

二.開發流程

1.題目模型

資料庫使用了hibernate,hibernate的相關知識不再做解釋.

img7

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