Freemaker合并单元格功能实现

1、功能需求

在这里插入图片描述

这是实现的效果,主要的问题是第一列相同的数据合并!!

2、实现思路

合并行需要的属性值:<w:vMerge w:val=‘restart’/>和<w:vMerge/>

3、数据封装

public List<Map<String, Object>> queryChecklistUpload(Map<String, Object> params) {
		List<Map<String, Object>> list = checklistMapper.queryChecklistUpload(params);
		String start = "<w:vMerge w:val='restart'/>";
		String end = "<w:vMerge/>";
		String tmp = (String) list.get(0).get("id");
		for (int i = 0; i < list.size(); i++) {
			if (i == 0) {
				list.get(i).put("start", start);
				continue;
			}else if(!list.get(i).get("id").equals(tmp)){
				list.get(i).put("start", start);
				list.get(i-1).put("end", end);
			}else if(list.get(i).get("id").equals(tmp)){
				list.get(i).put("end", end);
			}
			if(i == list.size()-1){
				list.get(i).put("end", end);
				continue;
			}
			tmp = (String) list.get(i).get("id");
		}
		return list;
	}

4、freemaker获取数据并遍历

**<#list checklist as checks>
<w:tr w:rsidR="007D2DF4" w:rsidRPr="00222630" w:rsidTr="00955DEE">
<w:tc><w:tcPr><w:tcW w:w="710" w:type="dxa"/>
				${checks.start!''}
<w:tcBorders><w:top w:val="single"/><w:left w:val="single"/><w:bottom w:val="single" w:sz="4" w:space="0" w:color="auto"/><w:right w:val="single" w:sz="4" w:space="0" w:color="auto"/></w:tcBorders>
                 ${checks.end!''}
 <w:shd w:val="clear" w:color="auto" w:fill="auto"/></w:tcPr><w:p w:rsidR="008028F4" w:rsidRPr="00955DEE" w:rsidRDefault="00573EBE" w:rsidP="00955DEE"><w:pPr><w:widowControl/><w:spacing w:line="240" w:lineRule="auto"/><w:ind w:leftChars="100" w:left="210" w:firstLineChars="0" w:firstLine="0"/><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体"/><w:kern w:val="0"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体"/><w:kern w:val="0"/></w:rPr><w:t>${checks.testItem}</w:t></w:r></w:p>
 </w:tc>**

<w:tc><w:tcPr><w:tcW w:w="1417" w:type="dxa"/><w:tcBorders><w:top w:val="single"/><w:left w:val="single"/><w:bottom w:val="single" w:sz="4" w:space="0" w:color="auto"/><w:right w:val="single" w:sz="4" w:space="0" w:color="auto"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/></w:tcPr><w:p w:rsidR="008028F4" w:rsidRPr="007D2DF4" w:rsidRDefault="00B22960" w:rsidP="00955DEE"><w:pPr><w:widowControl/><w:spacing w:line="240" w:lineRule="auto"/><w:ind w:leftChars="100" w:left="210" w:firstLineChars="0" w:firstLine="0"/><w:jc w:val="left"/><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体"/><w:kern w:val="0"/></w:rPr></w:pPr><w:r w:rsidRPr="007D2DF4"><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体" w:hint="eastAsia"/><w:kern w:val="0"/></w:rPr><w:t>${checks.checkPoint}</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="1133" w:type="dxa"/><w:tcBorders><w:top w:val="single"/><w:left w:val="single"/><w:bottom w:val="single" w:sz="4" w:space="0" w:color="auto"/><w:right w:val="single" w:sz="4" w:space="0" w:color="auto"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/></w:tcPr><w:p w:rsidR="008028F4" w:rsidRPr="007D2DF4" w:rsidRDefault="007D2DF4" w:rsidP="00955DEE"><w:pPr><w:widowControl/><w:spacing w:line="240" w:lineRule="auto"/><w:ind w:leftChars="100" w:left="210" w:firstLineChars="0" w:firstLine="0"/><w:jc w:val="left"/><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体"/><w:kern w:val="0"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体" w:hint="eastAsia"/><w:kern w:val="0"/></w:rPr><w:t>${checks.preTestResult}</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="1133" w:type="dxa"/><w:tcBorders><w:top w:val="single"/><w:left w:val="single"/><w:bottom w:val="single" w:sz="4" w:space="0" w:color="auto"/><w:right w:val="single" w:sz="4" w:space="0" w:color="auto"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/></w:tcPr><w:p w:rsidR="008028F4" w:rsidRPr="007D2DF4" w:rsidRDefault="007D2DF4" w:rsidP="00955DEE"><w:pPr><w:widowControl/><w:spacing w:line="240" w:lineRule="auto"/><w:ind w:leftChars="100" w:left="210" w:firstLineChars="0" w:firstLine="0"/><w:jc w:val="left"/><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体"/><w:kern w:val="0"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体" w:hint="eastAsia"/><w:kern w:val="0"/></w:rPr><w:t>${checks.chargeStaff}</w:t></w:r></w:p></w:tc>
</w:tr></#list>

其中:
获取数据并遍历:<#list checklist as checks>
防止数据为null程序报错: ${checks.end!’’}

切记:
1、如果合并三行的相同数据,不是在第一行的位置添加<w:vMerge w:val=‘restart’/> 在第三行的位置添加<w:vMerge/>,本人踩坑体会。
要在第一行添加<w:vMerge w:val=‘restart’/>,要合并的第二行及第三行添加<w:vMerge/> ,否则合并失败!!!
2、合并标签放置的位置是有限制的:

<w:tc>
<w:tcPr><w:tcW w:w="710" w:type="dxa"/>
							${checks.start!''}
							<w:tcBorders><w:top w:val="single"/><w:left w:val="single"/><w:bottom w:val="single" w:sz="4" w:space="0" w:color="auto"/><w:right 					  
							w:val="single" w:sz="4" w:space="0" w:color="auto"/></w:tcBorders>${checks.end!''}<w:shd w:val="clear" w:color="auto" w:fill="auto"/>
</w:tcPr>
<w:p w:rsidR="008028F4" w:rsidRPr="00955DEE" w:rsidRDefault="00573EBE" w:rsidP="00955DEE"><w:pPr><w:widowControl/><w:spacing w:line="240" w:lineRule="auto"/><w:ind w:leftChars="100" w:left="210" w:firstLineChars="0" w:firstLine="0"/><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体"/><w:kern w:val="0"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体"/><w:kern w:val="0"/></w:rPr><w:t>${checks.testItem}</w:t></w:r></w:p>
</w:tc>

要在<w:tcPr>标签内,起始标签可放在同一位置!

另外 ,列的合并请参考文章: https://blog.csdn.net/wp4862/article/details/82149451

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值