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);