freemarker导出word文件实现动态列合并

发布时间:2024年01月12日


程序员的公众号:源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文件效果:

文章来源:https://blog.csdn.net/feikillyou/article/details/135555826
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。