java 基於freemarker導出word

摘要:
環境基於freemarker模板引擎實現,模板引擎中文文檔參見:http://freemarker.foofun.cn/。實現原理,先將word需要填充的字段填入,格式:${xxx}。然後將word另存爲xml,然後重命名爲xxx.ftl得到模板。
myGitResource: https://github.com/duangYiXia/freemarkerWord 測試通過,可以直接使用

具體步驟:

  1. 引入依賴
<!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.29</version>
</dependency>

  1. 複製FreemarkerUtils,在myGitResource中獲取
  2. 準備好word文檔,如:
    在這裏插入圖片描述
    按途中格式填充。
    對於
    在這裏插入圖片描述
    這一塊不需要每個填充 ,只需要修改ftl,詳見第5步驟
  3. 將word另存爲xml,注意選項
    在這裏插入圖片描述
  4. 調整xml
    1> 首先格式化xml,可在線格式化,地址:https://www.sojson.com/xml.html
    2> 調整${xxx}被分離的部分,如:
                            <w:tc>
                                <w:tcPr>
                                    <w:tcW w:w="1575" w:type="dxa"/>
                                    <w:vAlign w:val="center"/>
                                </w:tcPr>
                                <w:p w:rsidR="003F436A" w:rsidRDefault="00946E62">
                                    <w:pPr>
                                        <w:jc w:val="center"/>
                                        <w:rPr>
                                            <w:b/>
                                            <w:sz w:val="24"/>
                                        </w:rPr>
                                    </w:pPr>
                                    <w:r>
                                        <w:rPr>
                                            <w:rFonts w:hint="eastAsia"/>
                                            <w:b/>
                                            <w:sz w:val="24"/>
                                        </w:rPr>
                                        <w:t>**$**</w:t>
                                    </w:r>
                                    <w:r>
                                        <w:rPr>
                                            <w:b/>
                                            <w:sz w:val="24"/>
                                        </w:rPr>
                                        <w:t>**{name}**</w:t>
                                    </w:r>
                                </w:p>
                            </w:tc>
將分開的$ 和 {name}```寫在一起,如下:

                        <w:tc>
                            <w:tcPr>
                                <w:tcW w:w="1575" w:type="dxa"/>
                                <w:vAlign w:val="center"/>
                            </w:tcPr>
                            <w:p w:rsidR="003F436A" w:rsidRDefault="00946E62">
                                <w:pPr>
                                    <w:jc w:val="center"/>
                                    <w:rPr>
                                        <w:b/>
                                        <w:sz w:val="24"/>
                                    </w:rPr>
                                </w:pPr>
                                <w:r>
                                    <w:rPr>
                                        <w:rFonts w:hint="eastAsia"/>
                                        <w:b/>
                                        <w:sz w:val="24"/>
                                    </w:rPr>
                                    <w:t>**${name}**</w:t>
                                </w:r>
                            </w:p>
                        </w:tc>
幾乎所有$ 、{ 、 xxx 、 }都是分離的,需要全部改完
3> 添加循環填充的代碼,如第3步驟中的  獲獎情況這一欄,可以修改如下:

                            **<#list list as item>**
                                <w:tr w:rsidR="003F436A">
                                    <w:trPr>
                                        <w:cantSplit/>
                                        <w:trHeight w:val="643"/>
                                    </w:trPr>
                                    <w:tc>
                                        <w:tcPr>
                                            <w:tcW w:w="538" w:type="dxa"/>
                                            <w:vMerge/>
                                            <w:vAlign w:val="center"/>
                                        </w:tcPr>
                                        <w:p w:rsidR="003F436A" w:rsidRDefault="003F436A">
                                            <w:pPr>
                                                <w:spacing w:before="72"/>
                                                <w:jc w:val="center"/>
                                                <w:rPr>
                                                    <w:b/>
                                                    <w:sz w:val="24"/>
                                                </w:rPr>
                                            </w:pPr>
                                        </w:p>
                                    </w:tc>
                                    <w:tc>
                                        <w:tcPr>
                                            <w:tcW w:w="875" w:type="dxa"/>
                                            <w:vAlign w:val="center"/>
                                        </w:tcPr>
                                        <w:p w:rsidR="003F436A" w:rsidRDefault="002301BB" w:rsidP="002301BB">
                                            <w:pPr>
                                                <w:spacing w:before="72" w:afterLines="50" w:after="156"/>
                                                <w:rPr>
                                                    <w:b/>
                                                    <w:sz w:val="24"/>
                                                </w:rPr>
                                            </w:pPr>
                                            <w:r>
                                                <w:rPr>
                                                    <w:b/>
                                                    <w:sz w:val="24"/>
                                                </w:rPr>
                                                <w:t>${item.d}</w:t>
                                            </w:r>
                                        </w:p>
                                    </w:tc>
                                    <w:tc>
                                        <w:tcPr>
                                            <w:tcW w:w="3375" w:type="dxa"/>
                                            <w:gridSpan w:val="3"/>
                                            <w:vAlign w:val="center"/>
                                        </w:tcPr>
                                        <w:p w:rsidR="003F436A" w:rsidRDefault="002301BB">
                                            <w:pPr>
                                                <w:spacing w:before="72" w:afterLines="50" w:after="156"/>
                                                <w:ind w:firstLineChars="100" w:firstLine="241"/>
                                                <w:rPr>
                                                    <w:b/>
                                                    <w:sz w:val="24"/>
                                                </w:rPr>
                                            </w:pPr>
                                            <w:r>
                                                <w:rPr>
                                                    <w:rFonts w:hint="eastAsia"/>
                                                    <w:b/>
                                                    <w:sz w:val="24"/>
                                                </w:rPr>
                                                <w:t>${item.prizeName}</w:t>
                                            </w:r>
                                        </w:p>
                                    </w:tc>
                                    <w:tc>
                                        <w:tcPr>
                                            <w:tcW w:w="4275" w:type="dxa"/>
                                            <w:gridSpan w:val="3"/>
                                            <w:vAlign w:val="center"/>
                                        </w:tcPr>
                                        <w:p w:rsidR="003F436A" w:rsidRDefault="002301BB">
                                            <w:pPr>
                                                <w:spacing w:before="72" w:afterLines="50" w:after="156"/>
                                                <w:ind w:firstLineChars="100" w:firstLine="241"/>
                                                <w:rPr>
                                                    <w:b/>
                                                    <w:sz w:val="24"/>
                                                </w:rPr>
                                            </w:pPr>
                                            <w:r>
                                                <w:rPr>
                                                    <w:rFonts w:hint="eastAsia"/>
                                                    <w:b/>
                                                    <w:sz w:val="24"/>
                                                </w:rPr>
                                                <w:t>${item.awardUnit}</w:t>
                                            </w:r>
                                        </w:p>
                                    </w:tc>
                                </w:tr>
                            **</#list>**     
其中list爲傳入的列表引用名。
4>將圖片的字符串編碼刪除,改成  ${image}, image作爲參數傳入
 6. 將調整好的xml重命名爲xxx.ftl格式,作爲模板放入resource下file文件下,cp一個頭像(注意大小).jpg的到file下,代碼使用
 7. 使用如下:

FreemarkerUtils.build(this.getClass(), path).setTemplate(srcFileName).generate(dataMap,
                    httpServletResponse.getOutputStream());

詳見:https://github.com/duangYiXia/freemarkerWord

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章