freemarker导出word模板(对象包含list类型属性)
效果预览
这里只展示部分效果,实际根据.ftl模板有所不同。
![在这里插入图片描述](https://img-blog.csdnimg.cn/fee5326ff93048df81d862487423829f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfMTYyNTkyMzM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
准备工作
先准备写好的word模板,xml格式保存,替换文件类型为.flt。
可以使用foxe插件进行.ftl文件编译,设置带插入的值。
值:${}
导出的实体类
public class MarkerEntity {
private String idx;
private String freqName;
private List<MarkerEntity> occupyList;
}
数据集
String markerListJson = request.getParameter("markerListJson");
List<MarkerEntity> markerList = JSONArray.parseArray(markerListJson, MarkerEntity.class);
Map<String, Object> map = new HashMap<String, Object>();
map.put("markerTbs", markerList);
.ftl格式的word模板表格绘制
<#-- 这里省略部分标题等其他模板内容 -->
<#-- 循环生成多个表格 -->
<#list markerTbs as marker>
<#-- 这里可以设置表格的标题等 -->
<w:p wsp:rsidR="000B4DD4" wsp:rsidRPr="005B7F94" wsp:rsidRDefault="000B4DD4">
<w:pPr>
<w:rPr>
<w:rFonts w:ascii="宋体" w:fareast="宋体" w:h-ansi="宋体"/>
<wx:font wx:val="宋体"/>
<w:sz w:val="24"/>
<w:sz-cs w:val="24"/>
</w:rPr>
</w:pPr>
</w:p>
<w:p wsp:rsidR="000B4DD4" wsp:rsidRPr="005B7F94" wsp:rsidRDefault="000B4DD4">
<w:pPr>
<w:rPr>
<w:rFonts w:ascii="宋体" w:fareast="宋体" w:h-ansi="宋体"/>
<wx:font wx:val="宋体"/>
<w:sz w:val="24"/>
<w:sz-cs w:val="24"/>
</w:rPr>
</w:pPr>
<w:r wsp:rsidRPr="005B7F94">
<w:rPr>
<w:rFonts w:ascii="宋体" w:fareast="宋体" w:h-ansi="宋体"/>
<wx:font wx:val="宋体"/>
<w:sz w:val="24"/>
<w:sz-cs w:val="24"/>
</w:rPr>
<w:t>${marker.idx}</w:t>
</w:r>
</w:p>
<#-- 开始绘制表格模板 -->
<w:tbl>
<w:tblPr>
<w:tblW w:w="0" w:type="auto"/>
<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:tblLook w:val="04A0"/>
</w:tblPr>
<w:tblGrid>
<w:gridCol w:w="936"/>
<w:gridCol w:w="926"/>
<w:gridCol w:w="926"/>
<w:gridCol w:w="926"/>
<w:gridCol w:w="926"/>
<w:gridCol w:w="926"/>
<w:gridCol w:w="926"/>
<w:gridCol w:w="936"/>
<w:gridCol w:w="889"/>
</w:tblGrid>
<#-- 这里是表格的首行:每个表格的字段自定义,这里只展示了1*n的表格,属性为"频率:freqName" -->
<w:tr wsp:rsidR="00D060A0" wsp:rsidRPr="00D060A0" wsp:rsidTr="00D060A0">
<w:tc>
<w:tcPr>
<w:tcW w:w="925" w:type="dxa"/>
<w:shd w:val="clear" w:color="auto" w:fill="auto"/>
</w:tcPr>
<w:p wsp:rsidR="000B4DD4" wsp:rsidRPr="00D060A0" wsp:rsidRDefault="000B4DD4" wsp:rsidP="00D060A0">
<w:pPr>
<w:jc w:val="center"/>
<w:rPr>
<w:rFonts w:ascii="宋体" w:fareast="宋体" w:h-ansi="宋体"/>
<wx:font wx:val="宋体"/>
<w:sz w:val="18"/>
<w:sz-cs w:val="18"/>
</w:rPr>
</w:pPr>
<w:r wsp:rsidRPr="00D060A0">
<w:rPr>
<w:rFonts w:ascii="宋体" w:fareast="宋体" w:h-ansi="宋体" w:hint="fareast"/>
<wx:font wx:val="宋体"/>
<w:sz w:val="18"/>
<w:sz-cs w:val="18"/>
</w:rPr>
<w:t>频率</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
<#-- 这里是重点,对象里包含list<T>属性,使用 marker.getOccupyList()继续遍历其中属性 -->
<#list marker.getOccupyList() as col>
<w:tr wsp:rsidR="00D060A0" wsp:rsidRPr="00D060A0" wsp:rsidTr="00D060A0">
<w:tc>
<w:tcPr>
<w:tcW w:w="925" w:type="dxa"/>
<w:shd w:val="clear" w:color="auto" w:fill="auto"/>
</w:tcPr>
<w:p wsp:rsidR="000B4DD4" wsp:rsidRPr="00D060A0" wsp:rsidRDefault="0041128C" wsp:rsidP="00D060A0">
<w:pPr>
<w:jc w:val="center"/>
<w:rPr>
<w:rFonts w:ascii="宋体" w:fareast="宋体" w:h-ansi="宋体"/>
<wx:font wx:val="宋体"/>
<w:sz w:val="18"/>
<w:sz-cs w:val="18"/>
</w:rPr>
</w:pPr>
<w:r wsp:rsidRPr="00D060A0">
<w:rPr>
<w:rFonts w:ascii="宋体" w:fareast="宋体" w:h-ansi="宋体"/>
<wx:font wx:val="宋体"/>
<w:sz w:val="18"/>
<w:sz-cs w:val="18"/>
</w:rPr>
<w:t>${col.freqName}</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
</#list>
</w:tbl>
<w:p wsp:rsidR="000B4DD4" wsp:rsidRDefault="000B4DD4">
<w:pPr>
<w:rPr>
<w:rFonts w:hint="fareast"/>
</w:rPr>
</w:pPr>
</w:p>
</#list>