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

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