=Start=
缘由:
在处理一个需求的时候碰到的问题,觉得以后可能会用到这个或者类似的知识点,所以在此记录一下,方便以后参考。
正文:
参考解答:
常规的单行HTML表格生成比较简单,可以参考一下之前记录的文章《如何让邮件中展示的table表格更顺眼?》,大致效果是:

用Python或是其它编程语言的代码实现方式就是——先创建一个list,然后循环组装每一列的内容作为元素append到list里面,然后str.join把list的内容连接起来作为内容即可。
但是,现在有个需求就是部分行相同的内容要合并展示,比如:

这就不太好处理了,但也不是完全处理不了,只不过相对于之前的for循环来说还是要复杂一些,需要:
- 先排序,将相同的item分组;
- 再根据分组的大小来设置组内第一行的rowspan属性值;
- 组内其它行的td个数要酌情减少,否则会出现越界的情况。
下面先放测试过程中产生的各种table样式对比:

再放对应的HTML源文件来分析原因:

最后再放相应的Python代码:
#!/usr/bin/env python
# coding=utf-8
table_style = """
<style>
table {
border-collapse: collapse;
}
table, td, th {
border: 1px solid black;
text-align: center;
}
th {
background-color: #e0e0e0;
color: black;
}
tr:hover {background-color: #f5f5f5;}
tr:nth-child(even) {background-color: #f2f2f2;}
</style>
"""
result_list = [
'2018-05-02 11:27:43,operate_user1,target_user1',
'2018-05-02 11:47:33,operate_user1,target_user2',
'2018-05-02 11:53:06,operate_user2,target_user2',
'2018-05-03 17:23:28,operate_user3,target_user3',
]
result = {
'operate_user1': [
'2018-05-02 11:27:43,operate_user1,target_user1',
'2018-05-02 11:47:33,operate_user1,target_user2',
],
'operate_user2': [
'2018-05-02 11:53:06,operate_user2,target_user2',
],
'operate_user3': [
'2018-05-03 17:23:28,operate_user3,target_user3',
],
}
# '{0},{1},{2}'.format(_datetime, operate_name, target_name)
result_content = [ table_style ]
result_content.append('<div>\n<table>\n<tr><th>日期</th><th>时间</th><th>操作人</th><th>操作类型</th><th>被操作对象</th><th>操作字段</th><th>总操作次数</th></tr>\n')
for k, v in sorted(result.items()):
if len(v) > 1:
_date, _time, _operate, _target = v[0].replace(' ', ',').split(',')
result_content.append('<tr><td>{0}</td><td>{1}</td><td rowspan="{4}">{2}</td><td rowspan="{4}">查询</td><td>{3}</td><td>字段A</td><td rowspan="{4}">{4}</td></tr>\n'.format(_date, _time, _operate, _target, len(v)))
for item in v[1:]:
_date, _time, _operate, _target = item.replace(' ', ',').split(',')
# result_content.append('<tr><td>{0}</td><td>{1}</td><td>{2}</td><td>查询</td><td>{3}</td><td>字段A</td><td>{4}</td></tr>\n'.format(_date, _time, _operate, _target, len(v)))
result_content.append('<tr><td>{0}</td><td>{1}</td><td>{3}</td><td>字段A</td></tr>\n'.format(_date, _time, _operate, _target))
else:
_date, _time, _operate, _target = v[0].replace(' ', ',').split(',')
result_content.append('<tr><td>{0}</td><td>{1}</td><td>{2}</td><td>查询</td><td>{3}</td><td>字段A</td><td>{4}</td></tr>\n'.format(_date, _time, _operate, _target, 1))
result_content.append('</table>\n</div>')
with open('display.html', 'w') as fp:
fp.write(''.join(result_content))
参考链接:
=END=