程序员的公众号:源1024,获取更多资料,无加密无套路!
最近整理了一份大厂面试资料《史上最全大厂面试题》,Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等
获取方式: 关注公众号并回复 666 领取,更多内容持续奉上
?以上图片来自AI:Gnomic-智能体平台
添加依赖
<!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.32</version>
</dependency>
word文件内容
另存为xml格式,然后修改后缀为ftl,关键模板内容如下:
<w:body>
<wx:sect>
<w:p>
<w:pPr>
<w:spacing w:line="360" w:line-rule="auto"/>
<w:ind w:first-line="880" w:first-line-chars="200"/>
<w:rPr>
<w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="default"/>
<w:sz w:val="24"/>
<w:lang w:val="EN-US" w:fareast="ZH-CN"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:cs="宋体" w:hint="fareast"/>
<w:sz w:val="44"/>
<w:sz-cs w:val="44"/>
<w:lang w:val="EN-US" w:fareast="ZH-CN"/>
</w:rPr>
<w:t>Freemarker 合并</w:t>
</w:r>
</w:p>
<w:p>
<w:pPr>
<w:spacing w:line="360" w:line-rule="auto"/>
<w:ind w:first-line="480" w:first-line-chars="200"/>
<w:rPr>
<w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/>
<w:sz w:val="24"/>
<w:lang w:fareast="ZH-CN"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:cs="宋体" w:hint="fareast"/>
<w:sz w:val="24"/>
</w:rPr>
<w:t>一、</w:t>
</w:r>
<w:r>
<w:rPr>
<w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:cs="宋体" w:hint="fareast"/>
<w:sz w:val="24"/>
<w:lang w:val="EN-US" w:fareast="ZH-CN"/>
</w:rPr>
<w:t>描述</w:t>
</w:r>
</w:p>
<w:p>
<w:pPr>
<w:spacing w:line="360" w:line-rule="auto"/>
<w:ind w:first-line="480" w:first-line-chars="200"/>
<w:rPr>
<w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:cs="宋体" w:hint="default"/>
<w:sz w:val="24"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:cs="宋体" w:hint="fareast"/>
<w:sz w:val="24"/>
<w:lang w:val="EN-US" w:fareast="ZH-CN"/>
</w:rPr>
<w:t>${desc}</w:t>
</w:r>
</w:p>
<w:p>
<w:pPr>
<w:spacing w:line="360" w:line-rule="auto"/>
<w:ind w:first-line="480" w:first-line-chars="200"/>
<w:rPr>
<w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/>
<w:sz w:val="24"/>
<w:lang w:val="EN-US" w:fareast="ZH-CN"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:cs="宋体" w:hint="fareast"/>
<w:sz w:val="24"/>
</w:rPr>
<w:t>二、</w:t>
</w:r>
<w:r>
<w:rPr>
<w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:cs="宋体" w:hint="fareast"/>
<w:sz w:val="24"/>
<w:lang w:val="EN-US" w:fareast="ZH-CN"/>
</w:rPr>
<w:t>数据</w:t>
</w:r>
</w:p>
<w:p/>
<w:p>
<w:pPr>
<w:pStyle w:val="a2"/>
</w:pPr>
</w:p>
<w:p>
<w:pPr>
<w:spacing w:line="360" w:line-rule="auto"/>
<w:ind w:first-line="480" w:first-line-chars="200"/>
<w:rPr>
<w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:cs="宋体" w:hint="default"/>
<w:sz w:val="24"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:cs="宋体" w:hint="fareast"/>
<w:sz w:val="24"/>
<w:lang w:val="EN-US" w:fareast="ZH-CN"/>
</w:rPr>
<w:t>${col?if_exists}</w:t>
</w:r>
</w:p>
<w:tbl>
<w:tblPr>
<w:tblW w:w="4955" w:type="dxa"/>
<w:jc w:val="center"/>
<w:tblInd w:w="0" w:type="dxa"/>
<w:tblBorders>
<w:top w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/>
<w:left w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/>
<w:bottom w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/>
<w:right w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/>
<w:insideH w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/>
<w:insideV w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/>
</w:tblBorders>
<w:tblLayout w:type="Fixed"/>
<w:tblCellMar>
<w:top w:w="0" w:type="dxa"/>
<w:left w:w="108" w:type="dxa"/>
<w:bottom w:w="0" w:type="dxa"/>
<w:right w:w="108" w:type="dxa"/>
</w:tblCellMar>
</w:tblPr>
<w:tblGrid>
<w:gridCol w:w="709"/>
<w:gridCol w:w="1276"/>
<w:gridCol w:w="1275"/>
<w:gridCol w:w="1695"/>
</w:tblGrid>
<w:tr>
<w:tblPrEx>
<w:tblBorders>
<w:top w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/>
<w:left w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/>
<w:bottom w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/>
<w:right w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/>
<w:insideH w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/>
<w:insideV w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/>
</w:tblBorders>
<w:tblCellMar>
<w:top w:w="0" w:type="dxa"/>
<w:left w:w="108" w:type="dxa"/>
<w:bottom w:w="0" w:type="dxa"/>
<w:right w:w="108" w:type="dxa"/>
</w:tblCellMar>
</w:tblPrEx>
<w:trPr>
<w:trHeight w:val="403" w:h-rule="atLeast"/>
<w:jc w:val="center"/>
</w:trPr>
<w:tc>
<w:tcPr>
<w:tcW w:w="709" w:type="dxa"/>
<w:shd w:val="clear" w:color="auto" w:fill="auto"/>
<w:noWrap w:val="0"/>
<w:vAlign w:val="center"/>
</w:tcPr>
<w:p>
<w:pPr>
<w:adjustRightInd w:val="off"/>
<w:snapToGrid w:val="off"/>
<w:spacing w:line="260" w:line-rule="exact"/>
<w:jc w:val="center"/>
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman" w:fareast="楷体_GB2312"
w:hint="fareast"/>
<w:b/>
<w:snapToGrid w:val="off"/>
<w:kern w:val="0"/>
<w:sz w:val="24"/>
<w:sz-cs w:val="32"/>
<w:lang w:fareast="ZH-CN"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman" w:fareast="楷体_GB2312"
w:hint="fareast"/>
<w:b/>
<w:snapToGrid w:val="off"/>
<w:kern w:val="0"/>
<w:sz w:val="24"/>
<w:sz-cs w:val="32"/>
<w:lang w:val="EN-US" w:fareast="ZH-CN"/>
</w:rPr>
<w:t>序号</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:w="1276" w:type="dxa"/>
<w:shd w:val="clear" w:color="auto" w:fill="auto"/>
<w:noWrap w:val="0"/>
<w:vAlign w:val="center"/>
</w:tcPr>
<w:p>
<w:pPr>
<w:adjustRightInd w:val="off"/>
<w:snapToGrid w:val="off"/>
<w:spacing w:line="260" w:line-rule="exact"/>
<w:jc w:val="center"/>
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman" w:fareast="楷体_GB2312"
w:hint="fareast"/>
<w:b/>
<w:snapToGrid w:val="off"/>
<w:kern w:val="0"/>
<w:sz w:val="24"/>
<w:sz-cs w:val="32"/>
<w:lang w:fareast="ZH-CN"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman" w:fareast="楷体_GB2312"
w:hint="fareast"/>
<w:b/>
<w:snapToGrid w:val="off"/>
<w:kern w:val="0"/>
<w:sz w:val="24"/>
<w:sz-cs w:val="32"/>
<w:lang w:val="EN-US" w:fareast="ZH-CN"/>
</w:rPr>
<w:t>姓名</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:w="1275" w:type="dxa"/>
<w:shd w:val="clear" w:color="auto" w:fill="auto"/>
<w:noWrap w:val="0"/>
<w:vAlign w:val="center"/>
</w:tcPr>
<w:p>
<w:pPr>
<w:adjustRightInd w:val="off"/>
<w:snapToGrid w:val="off"/>
<w:spacing w:line="260" w:line-rule="exact"/>
<w:jc w:val="center"/>
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman" w:fareast="楷体_GB2312"
w:hint="fareast"/>
<w:b/>
<w:snapToGrid w:val="off"/>
<w:kern w:val="0"/>
<w:sz w:val="24"/>
<w:sz-cs w:val="32"/>
<w:lang w:fareast="ZH-CN"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman" w:fareast="楷体_GB2312"
w:hint="fareast"/>
<w:b/>
<w:snapToGrid w:val="off"/>
<w:kern w:val="0"/>
<w:sz w:val="24"/>
<w:sz-cs w:val="32"/>
<w:lang w:val="EN-US" w:fareast="ZH-CN"/>
</w:rPr>
<w:t>年龄</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:w="1695" w:type="dxa"/>
<w:shd w:val="clear" w:color="auto" w:fill="auto"/>
<w:noWrap w:val="0"/>
<w:vAlign w:val="center"/>
</w:tcPr>
<w:p>
<w:pPr>
<w:adjustRightInd w:val="off"/>
<w:snapToGrid w:val="off"/>
<w:spacing w:line="260" w:line-rule="exact"/>
<w:jc w:val="center"/>
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman" w:fareast="楷体_GB2312"
w:hint="fareast"/>
<w:b/>
<w:snapToGrid w:val="off"/>
<w:kern w:val="0"/>
<w:sz w:val="24"/>
<w:sz-cs w:val="32"/>
<w:lang w:val="EN-US" w:fareast="ZH-CN"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman" w:fareast="楷体_GB2312"
w:hint="fareast"/>
<w:b/>
<w:snapToGrid w:val="off"/>
<w:kern w:val="0"/>
<w:sz w:val="24"/>
<w:sz-cs w:val="32"/>
<w:lang w:val="EN-US" w:fareast="ZH-CN"/>
</w:rPr>
<w:t>成绩</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
<#assign index = 0>
<#list colList as col>
<#if col?is_last>
<w:tr>
<w:tblPrEx>
<w:tblBorders>
<w:top w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/>
<w:left w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/>
<w:bottom w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/>
<w:right w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/>
<w:insideH w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/>
<w:insideV w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/>
</w:tblBorders>
<w:tblCellMar>
<w:top w:w="0" w:type="dxa"/>
<w:left w:w="108" w:type="dxa"/>
<w:bottom w:w="0" w:type="dxa"/>
<w:right w:w="108" w:type="dxa"/>
</w:tblCellMar>
</w:tblPrEx>
<w:trPr>
<w:trHeight w:val="261" w:h-rule="atLeast"/>
<w:jc w:val="center"/>
</w:trPr>
<w:tc>
<w:tcPr>
<w:tcW w:w="709" w:type="dxa"/>
<w:shd w:val="clear" w:color="auto" w:fill="auto"/>
<w:noWrap w:val="0"/>
<w:vAlign w:val="center"/>
<#--合并两列-->
<w:gridSpan w:val="3"/>
</w:tcPr>
<w:p>
<w:pPr>
<w:adjustRightInd w:val="off"/>
<w:snapToGrid w:val="off"/>
<w:jc w:val="center"/>
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"
w:fareast="仿宋_GB2312"
w:hint="default"/>
<w:b/>
<w:b-cs/>
<w:snapToGrid w:val="off"/>
<w:kern w:val="0"/>
<w:sz-cs w:val="21"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"
w:fareast="仿宋_GB2312"
w:hint="default"/>
<w:b/>
<w:b-cs/>
<w:snapToGrid w:val="off"/>
<w:kern w:val="0"/>
<w:sz-cs w:val="21"/>
</w:rPr>
<#assign index = index + 1>
<w:t>合计</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:w="1276" w:type="dxa"/>
<w:shd w:val="clear" w:color="auto" w:fill="auto"/>
<w:noWrap w:val="0"/>
<w:vAlign w:val="center"/>
</w:tcPr>
<w:p>
<w:pPr>
<w:widowControl/>
<w:jc w:val="center"/>
<w:textAlignment w:val="center"/>
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"
w:fareast="仿宋_GB2312"
w:hint="default"/>
<w:b/>
<w:b-cs/>
<w:snapToGrid w:val="off"/>
<w:kern w:val="0"/>
<w:sz-cs w:val="21"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"
w:fareast="仿宋_GB2312"
w:hint="default"/>
<w:kern w:val="0"/>
<w:sz-cs w:val="21"/>
<w:lang w:bidi="AR-SA"/>
</w:rPr>
<w:t>${col.score?if_exists}</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
<#else>
<w:tr>
<w:tblPrEx>
<w:tblBorders>
<w:top w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/>
<w:left w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/>
<w:bottom w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/>
<w:right w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/>
<w:insideH w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/>
<w:insideV w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/>
</w:tblBorders>
<w:tblCellMar>
<w:top w:w="0" w:type="dxa"/>
<w:left w:w="108" w:type="dxa"/>
<w:bottom w:w="0" w:type="dxa"/>
<w:right w:w="108" w:type="dxa"/>
</w:tblCellMar>
</w:tblPrEx>
<w:trPr>
<w:trHeight w:val="261" w:h-rule="atLeast"/>
<w:jc w:val="center"/>
</w:trPr>
<w:tc>
<w:tcPr>
<w:tcW w:w="709" w:type="dxa"/>
<w:shd w:val="clear" w:color="auto" w:fill="auto"/>
<w:noWrap w:val="0"/>
<w:vAlign w:val="center"/>
</w:tcPr>
<w:p>
<w:pPr>
<w:adjustRightInd w:val="off"/>
<w:snapToGrid w:val="off"/>
<w:jc w:val="center"/>
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"
w:fareast="仿宋_GB2312"
w:hint="default"/>
<w:b/>
<w:b-cs/>
<w:snapToGrid w:val="off"/>
<w:kern w:val="0"/>
<w:sz-cs w:val="21"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"
w:fareast="仿宋_GB2312"
w:hint="default"/>
<w:b/>
<w:b-cs/>
<w:snapToGrid w:val="off"/>
<w:kern w:val="0"/>
<w:sz-cs w:val="21"/>
</w:rPr>
<#assign index = index + 1>
<w:t>${index}</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:w="1276" w:type="dxa"/>
<w:shd w:val="clear" w:color="auto" w:fill="auto"/>
<w:noWrap w:val="0"/>
<w:vAlign w:val="center"/>
</w:tcPr>
<w:p>
<w:pPr>
<w:widowControl/>
<w:jc w:val="center"/>
<w:textAlignment w:val="center"/>
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"
w:fareast="仿宋_GB2312"
w:hint="default"/>
<w:b/>
<w:b-cs/>
<w:snapToGrid w:val="off"/>
<w:kern w:val="0"/>
<w:sz-cs w:val="21"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"
w:fareast="仿宋_GB2312"
w:hint="default"/>
<w:kern w:val="0"/>
<w:sz-cs w:val="21"/>
<w:lang w:bidi="AR-SA"/>
</w:rPr>
<w:t>${col.name?if_exists}</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:w="1276" w:type="dxa"/>
<w:shd w:val="clear" w:color="auto" w:fill="auto"/>
<w:noWrap w:val="0"/>
<w:vAlign w:val="center"/>
</w:tcPr>
<w:p>
<w:pPr>
<w:widowControl/>
<w:jc w:val="center"/>
<w:textAlignment w:val="center"/>
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"
w:fareast="仿宋_GB2312"
w:hint="default"/>
<w:b/>
<w:b-cs/>
<w:snapToGrid w:val="off"/>
<w:kern w:val="0"/>
<w:sz-cs w:val="21"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"
w:fareast="仿宋_GB2312"
w:hint="default"/>
<w:kern w:val="0"/>
<w:sz-cs w:val="21"/>
<w:lang w:bidi="AR-SA"/>
</w:rPr>
<w:t>${col.age?if_exists}</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:w="1276" w:type="dxa"/>
<w:shd w:val="clear" w:color="auto" w:fill="auto"/>
<w:noWrap w:val="0"/>
<w:vAlign w:val="center"/>
</w:tcPr>
<w:p>
<w:pPr>
<w:widowControl/>
<w:jc w:val="center"/>
<w:textAlignment w:val="center"/>
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"
w:fareast="仿宋_GB2312"
w:hint="default"/>
<w:b/>
<w:b-cs/>
<w:snapToGrid w:val="off"/>
<w:kern w:val="0"/>
<w:sz-cs w:val="21"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"
w:fareast="仿宋_GB2312"
w:hint="default"/>
<w:kern w:val="0"/>
<w:sz-cs w:val="21"/>
<w:lang w:bidi="AR-SA"/>
</w:rPr>
<w:t>${col.score?if_exists}</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
</#if>
</#list>
</w:tbl>
<w:p>
<w:pPr>
<w:pStyle w:val="a2"/>
</w:pPr>
</w:p>
<w:sectPr>
<w:pgSz w:w="11906" w:h="16838"/>
<w:pgMar w:top="1440" w:right="1800" w:bottom="1440" w:left="1800" w:header="851" w:footer="992"
w:gutter="0"/>
<w:cols w:space="720"/>
<w:docGrid w:type="lines" w:line-pitch="312"/>
</w:sectPr>
</wx:sect>
</w:body></w:wordDocument>
关键模板代码说明:
判空:变量为空会报错
${col.score?if_exists}
合并列:
<#if col?is_last> 判断如果是最后一行进行合并
w:gridSpan,合并几列由w:val确定
<w:tcPr>
<w:tcW w:w="709" w:type="dxa"/>
<w:shd w:val="clear" w:color="auto" w:fill="auto"/>
<w:noWrap w:val="0"/>
<w:vAlign w:val="center"/>
<#--合并两列-->
<w:gridSpan w:val="3"/>
</w:tcPr>
controller:
@Controller
public class FreemarkerController {
@GetMapping("/word")
public void wordFreemarker(HttpServletResponse response) {
HashMap<String, Object> map = new HashMap<>();
map.put("desc","这里是描述段落。。。");
map.put("col","这里是动态列合并。。。");
List<StudentInfo> list = getData();
map.put("colList",list);
FreeMakerUtil.generate("merge.ftl","word文件",map,response);
System.out.println("success");
}
public List<StudentInfo> getData(){
List<StudentInfo> list = new ArrayList<>();
list.add(new StudentInfo("一班","李白","12",99));
list.add(new StudentInfo("一班","阿珂","11",98));
list.add(new StudentInfo("一班","剑圣","13",100));
list.add(new StudentInfo("一班","药神","11",99));
int sum = list.stream().mapToInt(StudentInfo::getScore).sum();
list.add(new StudentInfo("","","",sum));
return list;
}
}
工具类
@Slf4j
public class FreeMakerUtil {
public static void generate(String templateName, String fileName, Map<String,Object> dataMap, HttpServletResponse response) {
//freeMarker配置实例
Configuration configuration = new Configuration(Configuration.VERSION_2_3_0);
String templatePath = "/templates/";
Writer out = null;
try {
//获取模版路径
configuration.setClassForTemplateLoading(FreeMakerUtil.class, templatePath);
//加载模版文件
Template template = configuration.getTemplate(templateName);
response.setHeader("Content-disposition",
"attachment;filename=" + URLEncoder.encode(fileName + ".doc", StandardCharsets.UTF_8.name()));
//输出类型
response.setContentType("application/msword");
out = new BufferedWriter(new OutputStreamWriter(response.getOutputStream()));
template.process(dataMap, out);
} catch (Exception ex) {
log.error("生成word文件发生异常",ex);
} finally {
try {
if (null != out) {
out.flush();
out.close();
}
} catch (Exception ex) {
log.error("关闭文件流异常",ex);
}
}
}
}
最后生成word文件效果: