1. 程式人生 > >使用FreeMarker生成Word出錯的一點心得

使用FreeMarker生成Word出錯的一點心得

這幾天在維護一個匯出word的一個功能,領導改了word模板,不得不重來一遍。也不過是劉歡歌中所言:“只不過是重頭再來”。廢話少說,直接進入主題。用了FreeMaker這麼多天,也總結出不少規律。FreeMarker報錯就是下面兩種。

情景1:

Expression hello is undefined on line 3, column 85440 in doc.ftl.
The problematic instruction:
----------
==> ${label} [on line 3, column 85438 in doc.ftl]
----------

情景2
Was expecting one of:
    <STRING_LITERAL> ...
    <RAW_STRING> ...
    "false" ...
    "true" ...
    <INTEGER> ...
    <DECIMAL> ...
    "." ...
    "+" ...
    "-" ...
    "!" ...
    "[" ...
    "(" ...
    "{" ...
    <ID> ...

第一種錯誤比較直觀,是因為在ftl中定義的${label} 並沒有賦值。

今天討論的是第二種錯誤,這個錯誤在使用FreeMarker匯出word時,時常出現,若隱若現,飄忽不定,做的好好的就除了這麼一個錯誤,讓人惱火,同時也增加了它的神祕性,在百度後,沒有找到關於它的解決方法。今天研究了很長時間,終於找到出錯原因了。出錯表格部分如下:

由於培訓是兩列,第一次做的時候,直接將第一行寫好的變數直接複製到第二行,

測試了一下當培訓只有一條的情況下,顯示了兩條相同的資料,OK匯出正常。如下圖:

但是,當第二行資料重新命名時候:

會出現第二種情況的錯誤,顯然是標籤錯誤,但仔細檢查後,也沒發現任何問題,奇了怪了。無奈,經多次嘗試,最終刪掉第二行,將第二行的資料重新手打了一遍,沒用複製貼上。然後測試,PASS!  難道還真的是這個問題,又將第二行第一列中的${pxname2}改成了第一行第一列中的${pxname},測試,不出意料,報錯!

由此,在開發中,flt定義好的標籤要更改,要將該標籤刪掉,重新打一次,不要在標籤上直接更改,否則就會報錯。原因呢,也許只有耶穌才知道吧。