本文介绍使用freeMark生成包含表格合并单元的word如何制作模板, 合并单元格主要使用
<w:vmerge w:val='restart'/>和<w:vmerge/>实现。
生成word效果图:
开始
1、编辑word文档,删除重复部分,只保留关键元素
2、把word另存为xml文件
3、简化模板内容
格式化XML(在线工具https://www.sojson.com/xml.html)
删除多余标签, 简化<w:wordDocument>标签为:
<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml"
xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint"
xml:space="preserve">
删除 <o:DocumentProperties>、<w:fonts>、<w:styles>、<w:shapeDefaults>、<w:docPr>
删除 wsp:相关属性(替换为空)
把段落、文本、单元格样式抽离成 freemark macro
<#macro pPrSetting>
<w:pPr>
<w:pPr>
<w:widowControl/>
<w:jc w:val="center"/>
<w:textAlignment w:val="center"/>
</w:pPr>
<#nested>
</w:pPr>
</#macro>
<#macro rPrSetting font="宋体" size="18" bold="false">
<w:rPr>
<w:rFonts w:ascii="${font}" w:fareast="${font}" w:cs="${font}" w:h-ansi="${font}" w:hint="fareast"/>
<#if bold=="true">
<w:b/>
</#if>
<wx:font wx:val="${font}"/>
<#nested>
<w:sz w:val="${size}"/>
<w:sz-cs w:val="${size}"/>
</w:rPr>
</#macro>
<#macro tcPrSetting vmerge="none">
<w:tcPr>
<#if vmerge=="restart">
<w:vmerge w:val="restart"/>
</#if>
<#if vmerge=="end">
<w:vmerge/>
</#if>
<#nested>
<w:vAlign w:val="center"/>
</w:tcPr>
</#macro>
4、循环行,处理合并单元格,填充数据
注:需合并的单元格第一行标注 "<w:vmerge w:val="restart" />",从第二行开始,所有要合并的单元标注"<w:vmerge />"
<#assign count = 0>
<#assign vmerge = "none">
<#setting number_format=",##0.0">
<#assign total = 0>
<w:body>
<wx:sect>
<w:p>
<w:pPr>
<w:spacing w:line="400" w:line-rule="exact"/>
<w:jc w:val="left"/>
</w:pPr>
<w:r>
<@rPrSetting font="宋体" size="21" bold="true"></@rPrSetting>
<w:t>附件4:</w:t>
</w:r>
</w:p>
<w:p>
<w:pPr>
<w:spacing w:line="580" w:line-rule="exact"/>
<w:jc w:val="center"/>
</w:pPr>
<w:r>
<@rPrSetting font="宋体" size="32" bold="true"></@rPrSetting>
<w:t>表1:${name}</w:t>
</w:r>
</w:p>
<w:p>
<w:pPr>
<w:spacing w:line="360" w:line-rule="exact"/>
<w:ind w:first-line-chars="550" w:first-line="1320"/>
</w:pPr>
<w:r>
<@rPrSetting font="方正小标宋简体" size="24"></@rPrSetting>
<w:t></w:t>
</w:r>
<w:r>
<@rPrSetting font="方正小标宋简体" size="24"></@rPrSetting>
<w:t></w:t>
</w:r>
<w:r>
<@rPrSetting font="方正小标宋简体" size="24"></@rPrSetting>
<w:t>金额单位:亿元</w:t>
</w:r>
</w:p>
<w:tbl>
<w:tblPr>
<w:tblW w:w="0" w:type="auto"/>
<w:tblInd w:w="0" w:type="dxa"/>
<w:tblBorders>
<w:top w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/>
<w:left w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/>
<w:bottom w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/>
<w:right w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/>
<w:insideH w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/>
<w:insideV w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/>
</w:tblBorders>
<w:tblLayout w:type="Fixed"/>
<w:tblCellMar>
<w:top w:w="15" w:type="dxa"/>
<w:left w:w="15" w:type="dxa"/>
<w:bottom w:w="15" w:type="dxa"/>
<w:right w:w="15" w:type="dxa"/>
</w:tblCellMar>
</w:tblPr>
<w:tblGrid>
<w:gridCol w:w="544"/>
<w:gridCol w:w="2287"/>
<w:gridCol w:w="1065"/>
<w:gridCol w:w="1136"/>
<w:gridCol w:w="1136"/>
<w:gridCol w:w="1136"/>
<w:gridCol w:w="1122"/>
</w:tblGrid>
<w:tr>
<w:trPr>
<w:trHeight w:val="271"/>
</w:trPr>
<w:tc>
<@tcPrSetting>
<w:shd w:val="clear" w:color="auto" w:fill="C0C0C0"/>
</@tcPrSetting>
<w:p>
<@pPrSetting></@pPrSetting>
<w:r>
<@rPrSetting font="宋体" size="21" bold="true"></@rPrSetting>
<w:t>产业</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<@tcPrSetting>
<w:shd w:val="clear" w:color="auto" w:fill="C0C0C0"/>
</@tcPrSetting>
<w:p>
<@pPrSetting></@pPrSetting>
<w:r>
<@rPrSetting font="宋体" size="21" bold="true"></@rPrSetting>
<w:t>所属行业</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<@tcPrSetting>
<w:shd w:val="clear" w:color="auto" w:fill="C0C0C0"/>
</@tcPrSetting>
<w:p>
<@pPrSetting></@pPrSetting>
<w:r>
<@rPrSetting font="宋体" size="21" bold="true"></@rPrSetting>
<w:t>本年累计</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<@tcPrSetting>
<w:shd w:val="clear" w:color="auto" w:fill="C0C0C0"/>
</@tcPrSetting>
<w:p>
<@pPrSetting></@pPrSetting>
<w:r>
<@rPrSetting font="宋体" size="21" bold="true"></@rPrSetting>
<w:t>占比(%)</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<@tcPrSetting>
<w:shd w:val="clear" w:color="auto" w:fill="C0C0C0"/>
</@tcPrSetting>
<w:p>
<@pPrSetting></@pPrSetting>
<w:r>
<@rPrSetting font="宋体" size="21" bold="true"></@rPrSetting>
<w:t>同比增减额</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<@tcPrSetting>
<w:shd w:val="clear" w:color="auto" w:fill="C0C0C0"/>
</@tcPrSetting>
<w:p>
<@pPrSetting></@pPrSetting>
<w:r>
<@rPrSetting font="宋体" size="21" bold="true"></@rPrSetting>
<w:t>同比增速(%)</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<@tcPrSetting>
<w:shd w:val="clear" w:color="auto" w:fill="C0C0C0"/>
</@tcPrSetting>
<w:p>
<@pPrSetting></@pPrSetting>
<w:r>
<@rPrSetting font="宋体" size="21" bold="true"></@rPrSetting>
<w:t>环比增速(%)</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
<#list list as item>
<#if item.type==0 && item.category==0>
<#list item.contents as content>
<#assign total = content.value>
<w:tr>
<w:trPr>
<w:trHeight w:val="301"/>
</w:trPr>
<w:tc>
<w:tcPr>
<w:tcW w:w="2831" w:type="dxa"/>
<w:gridSpan w:val="2"/>
<w:vAlign w:val="center"/>
</w:tcPr>
<w:p>
<@pPrSetting></@pPrSetting>
<w:r>
<@rPrSetting font="宋体" size="21" bold="true"></@rPrSetting>
<w:t>合计</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<@tcPrSetting></@tcPrSetting>
<w:p>
<@pPrSetting></@pPrSetting>
<w:r>
<@rPrSetting font="宋体" size="21" bold="true"></@rPrSetting>
<w:t>${content.value!}</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<@tcPrSetting></@tcPrSetting>
<w:p>
<@pPrSetting></@pPrSetting>
<w:r>
<@rPrSetting font="宋体" size="21" bold="true"></@rPrSetting>
<w:t>100.0</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<@tcPrSetting></@tcPrSetting>
<w:p>
<@pPrSetting></@pPrSetting>
<w:r>
<@rPrSetting font="宋体" size="21" bold="true"></@rPrSetting>
<w:t>${content.value - content.lastValue}</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<@tcPrSetting></@tcPrSetting>
<w:p>
<@pPrSetting></@pPrSetting>
<w:r>
<@rPrSetting font="宋体" size="21" bold="true"></@rPrSetting>
<w:t>${content.yoy!}</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<@tcPrSetting></@tcPrSetting>
<w:p>
<@pPrSetting></@pPrSetting>
<w:r>
<@rPrSetting font="宋体" size="21" bold="true"></@rPrSetting>
<w:t>${content.mom!}</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
</#list>
</#if>
</#list>
<#list list as item>
<#if item?has_next>
<#if count==0 && item.type==list[item?index+1].type>
<#assign vmerge = "restart">
<#assign count = count+1>
<#elseif count gt 0>
<#assign vmerge = "end">
<#if item.type!=list[item?index+1].type>
<#assign count = 0>
</#if>
</#if>
<#else>
<#if count gt 0>
<#assign vmerge = "end">
</#if>
</#if>
<#if item.type gte 6 && item.type lte 8>
<#list item.contents as content>
<w:tr>
<w:trPr/>
<w:tc>
<@tcPrSetting vmerge="${vmerge}"></@tcPrSetting>
<w:p>
<@pPrSetting></@pPrSetting>
<w:r>
<@rPrSetting font="宋体" size="21" bold="${(item.category==0)? then('true', 'false')}"></@rPrSetting>
<w:t>${item.typeName!}</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<@tcPrSetting></@tcPrSetting>
<w:p>
<@pPrSetting></@pPrSetting>
<w:r>
<@rPrSetting font="宋体" size="22" bold="${(item.category==0)? then('true', 'false')}"></@rPrSetting>
<w:t>${item.name!}</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<@tcPrSetting></@tcPrSetting>
<w:p>
<@pPrSetting></@pPrSetting>
<w:r>
<@rPrSetting font="宋体" size="21" bold="${(item.category==0)? then('true', 'false')}"></@rPrSetting>
<w:t>${content.value!}</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<@tcPrSetting></@tcPrSetting>
<w:p>
<@pPrSetting></@pPrSetting>
<w:r>
<@rPrSetting font="宋体" size="21" bold="${(item.category==0)? then('true', 'false')}"></@rPrSetting>
<w:t>${content.value*100/total!}</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<@tcPrSetting></@tcPrSetting>
<w:p>
<@pPrSetting></@pPrSetting>
<w:r>
<@rPrSetting font="宋体" size="21" bold="${(item.category==0)? then('true', 'false')}"></@rPrSetting>
<w:t>${content.value - content.lastValue}</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<@tcPrSetting></@tcPrSetting>
<w:p>
<@pPrSetting></@pPrSetting>
<w:r>
<@rPrSetting font="宋体" size="21" bold="${(item.category==0)? then('true', 'false')}"></@rPrSetting>
<w:t>${content.yoy!}</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<@tcPrSetting></@tcPrSetting>
<w:p>
<@pPrSetting></@pPrSetting>
<w:r>
<@rPrSetting font="宋体" size="21" bold="${(item.category==0)? then('true', 'false')}"></@rPrSetting>
<w:t>${content.mom!}</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
</#list>
</#if>
</#list>
</w:tbl>
<w:p/>
<w:p/>
<w:p/>
<w:p/>
<w:p/>
<w:p/>
<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>