博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
table的td合并
阅读量:6212 次
发布时间:2019-06-21

本文共 4018 字,大约阅读时间需要 13 分钟。

js网盘位置:http://pan.baidu.com/s/1nvv3seP

1、用法:最低要求:jq1.8

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>导出table</title>
<link rel="stylesheet" href="../../common/bootstrap/3.3.7/css/bootstrap.min.css">  
<script src="../../common/js/jquery/1.11.1/jquery.min.js"></script>
<script src="../../common/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<div class="table-responsive">
  <table class="table table-bordered" id="content_info">
    <caption>导出Excel头信息</caption>
    <thead>
      <tr>
        <th>列头1</th>
        <th>列头2</th>
        <th>列头3</th></tr>
    </thead>
    <tbody>
      <tr>
        <td>A</td>
        <td>B1</td>
        <td>C1</td></tr>
      <tr>
        <td>A</td>
        <td>B2</td>
        <td>C2</td></tr>
      <tr>
        <td>A3</td>
        <td>B3</td>
        <td>C3</td></tr>
      <tr>
        <td>A3</td>
        <td>B4</td>
        <td>C4</td></tr>
    </tbody>
  </table>
</div>
</body>
<script type="text/javascript" src="../../common/layer/3.0.3/layer.js"></script>
<script type="text/javascript" src="../../common/js/common/tablesMergeCell.js"></script>
<script type="text/javascript">
$(function(){
    $('#content_info').tablesMergeCell({
        cols: [0,1]//合并的列从0开始,按内容合并,相同的内容自动合并
    });
});

</script>

</html>

2、tablesMergeCell.js

;(function($) {

    $.fn.tablesMergeCell = function(options) {
        var defaultsettings= {
            automatic:true,
            cols: null,        // 用数组表示列的索引,从0开始,然后根据指定列来处理(合并)相同内容单元格
            rows: null
        };
        var opts = $.extend(defaultsettings, options);
        return this.each(function() {
            var cols = opts.cols,
                rows = opts.rows;
            if(rows==null){
                for ( var i = cols.length - 1; cols[i] != undefined; i--) {
                    tablesMergeCell($(this), cols[i]);
                }
            }else{
                for ( var i = cols.length - 1,k=opts.rows.length-1; cols[i] != undefined; i--,k--) {
                    tablesMergeCell($(this), cols[i],k);
                }
            }

            dispose($(this));

        });

        // 如果对javascript的closure和scope概念比较清楚, 这是个插件内部使用的private方法

        function tablesMergeCell($table, colIndex,rowIndex) {
            $table.data('col-content', '');     // 存放单元格内容
            $table.data('col-rowspan', 1);      // 存放计算的rowspan值 默认为1
            $table.data('col-td', $());         // 存放发现的第一个与前一行比较结果不同td(jQuery封装过的), 默认一个"空"的jquery对象
            $table.data('trNum', $('tbody tr', $table).length);     // 要处理表格的总行数, 用于最后一行做特殊处理时进行判断之用
            // 我们对每一行数据进行"扫面"处理 关键是定位col-td, 和其对应的rowspan
            $('tbody tr', $table).each(function(index) {
                var $tr = $(this);
                // td:eq中的colIndex即列索引
                var $td = $('td:eq(' + colIndex + ')', $tr);
                var currentContent = $td.html();
                if(opts.automatic){     // 内容
                    // 第一次时走此分支
                    if ($table.data('col-content') == '') {
                        $table.data('col-content', currentContent);
                        $table.data('col-td', $td);
                    } else {
                        // 上一行与当前行内容相同
                        if ($table.data('col-content') == currentContent) {
                            addRowspan();   // 上一行与当前行内容相同则col-rowspan累加, 保存新值
                        }else{
                            newRowspan();   // 上一行与当前行内容不同
                        }
                    }
                }else{      // 指定
                    if(opts.rows.length>0){
                        if(opts.rows[0].length==undefined){
                            for(var i=0; i<opts.rows.length; i++){
                                customRowspan(opts.rows[i],opts.rows.length);
                            }
                        }else{
                            for(var i=0; i<opts.rows[rowIndex].length; i++){
                                customRowspan(opts.rows[rowIndex][i],opts.rows[rowIndex].length);
                            }
                        }
                    }
                }
                function customRowspan(val,len){
                    if(index==val){
                        if ($table.data('col-content') == '') {
                            if(currentContent==''){
                                currentContent = true;
                            }
                            $table.data('col-content', currentContent);
                            $td.attr('rowspan', len);
                        }else{
                            $td.hide();
                        }
                    }
                }
                function addRowspan(){
                    var rowspan = $table.data('col-rowspan') + 1;
                    $table.data('col-rowspan', rowspan);
                    // 值得注意的是 如果用了$td.remove()就会对其他列的处理造成影响
                    $td.hide();
                    // 最后一行的情况比较特殊一点
                    // 比如最后2行 td中的内容是一样的, 那么到最后一行就应该把此时的col-td里保存的td设置rowspan
                    if (++index == $table.data('trNum')) {
                        $table.data('col-td').attr('rowspan', $table.data('col-rowspan'));
                    }
                }
                function newRowspan(){
                    // col-rowspan默认为1, 如果统计出的col-rowspan没有变化, 不处理
                    if ($table.data('col-rowspan') != 1) {
                        $table.data('col-td').attr('rowspan', $table.data('col-rowspan'));
                    }
                    // 保存第一次出现不同内容的td, 和其内容, 重置col-rowspan
                    $table.data('col-td', $td);
                    $table.data('col-content', $td.html());
                    $table.data('col-rowspan', 1);
                }
            });
        }
        // 同样是个private函数 清理内存之用
        function dispose($table) {
            $table.removeData();
        }
    };

})(jQuery);

转载于:https://my.oschina.net/wugong/blog/872929

你可能感兴趣的文章
量子通信和大数据最有市场突破前景
查看>>
StringBuilder用法小结
查看>>
对‘初学者应该选择哪种编程语言’的回答——计算机达人成长之路(38)
查看>>
如何申请开通微信多客服功能
查看>>
Sr_C++_Engineer_(LBS_Engine@Global Map Dept.)
查看>>
非监督学习算法:异常检测
查看>>
App开发中甲乙方冲突会闹出啥后果?H5 APP 开发可以改变现状吗
查看>>
jquery的checkbox,radio,select等方法总结
查看>>
Linux coredump
查看>>
Ubuntu 10.04安装水晶(Mercury)无线网卡驱动
查看>>
Myeclipes快捷键
查看>>
癌细胞最偏爱10个字,你却每天都在喂养“它”!
查看>>
我的友情链接
查看>>
ToRPC:一个双向RPC的Python实现
查看>>
Vim脚本 - 竖线'|' 和反斜线'\'
查看>>
netty框架的学习笔记 + 一个netty实现websocket通信案例
查看>>
磁盘超过2T无法用fdisk分区的问题
查看>>
我的友情链接
查看>>
nginx在reload时候报错invalid PID number
查看>>
神经网络和深度学习-第二周神经网络基础-第二节:Logistic回归
查看>>