1. 程式人生 > >動態生成包含合併單元格的表格

動態生成包含合併單元格的表格

<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>標題頁</title>
<style>
TABLE{
font-family: 宋體;
font-size: 9pt;
border-color:#7195c6;
border-collapse :collapse;
border-width:1px
}

td{
border:#336699 1px solid;
font-size:15px;
color:#02027a
}
</style>

</head>
<body>
<script language="JavaScript">
var myData=[["姓名","年齡","年級","地址,電話","手機","備註"],
[null,null,null,"歷史","地理","88888888"],
[null,null,null,null,"本例","66666666"],
[null,null,"一年級","北京三環","_","33333333"],
[null,null,"二年級","上海浦東","_","666666"],
[null,"12","三年級","廣州深圳","_","33333222"],
[null,null,"四年級","香港九龍","_","32432432"]]; //將所有資料繫結在陣列中
var myDataT,rowcell=[];//預設的2個空陣列

document.body.appendChild((myDataT = document.createElement("TABLE")));//在當前窗體中動態新增表格
for(var i=0; i<myData.length; i++){ //遍歷表格中每項
var atr = myDataT.insertRow(); //動態新增行
for(var j=0; j<myData[i].length; j++){//遍歷某項中的所有資料
if (myData[i][j]==null){ //如果值為空,表示需要合併

rowcell[j].rowSpan++; //使用rowspan
}
else if(myData[i][j]=="_"){ //如果是_,則使用colspan
rowcell[j-1].colSpan++;
}
else{
rowcell[j] = atr.insertCell(); //否則正常新增行
rowcell[j].innerText=myData[i][j]; //顯示行內容
}
}
}
</script>
</body>
</html>


例:
首頁| 資訊| 移動| 雲端計算| 空間| 論壇| 部落格| 下載| 網摘| 程式設計師| 書店| 樂知教育 歡迎您:xinkong1010|退出|登入註冊|幫助
CSDN-CSDN社群-Web 開發-JavaScript
管理選單 生成帖子 置頂 推薦 取消推薦 鎖定 解鎖 移動 編輯 刪除 帖子加分 帖子高亮 取消高亮 結 帖 發 帖 回 復 收藏 不顯示刪除回覆顯示所有回覆顯示星級回覆顯示得分回覆 js動態合併單元格(解決即給分)[問題點數:50分,結帖人:liw]
liw

(微微)

等 級:
結帖率:96.43%

樓主發表於:2009-03-06 08:59:30資料是動態生成的。如:
姓名 性別 年齡 科目 分數
張三 男 22 數學 90
張三 男 22 語文 70
張三 男 22 英語 60
李四 女 19 數學 60
李四 女 19 語文 60
王五 男 20 英語 60

要求用js把姓名、性別、年齡列相同的單元格合併。
因為結果集是查詢得到的,所以要動態合併。
我已經實現了專案列相同單元格的合併,
但怎樣將姓名、性別、年齡3列相同的單元格都合併呢?謝謝。

程式碼如下
!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>無標題文件 </title>
</head>

<body>
<table width="100%" border="1" cellspacing="0" cellpadding="0" id="tab">
<tr>
<td>張三 </td>
<td>男</td>
<td>22</td>
<td>數學 </td>
<td>90 </td>
</tr>
<tr>
<td>張三 </td>
<td>男</td>
<td>22</td>
<td>語文 </td>
<td>70 </td>
</tr>
<tr>
<td>張三 </td>
<td>男</td>
<td>22</td>
<td>英語 </td>
<td>60 </td>
</tr>
<tr>
<td>李四 </td>
<td>女</td>
<td>19</td>
<td>數學 </td>
<td>60 </td>
</tr>
<tr>
<td>李四 </td>
<td>女</td>
<td>19</td>
<td>語文 </td>
<td>60 </td>
</tr>
<tr>
<td>王五 </td>
<td>男</td>
<td>19</td>
<td>英語 </td>
<td>60 </td>
</tr>
</table>
<script >
var tab=document.getElementById("tab");
var name="";
for(var i=0,j=0;i <tab.rows.length;i++,j++) {
if(name==tab.rows[i].cells[0].innerHTML) {
tab.rows[i].deleteCell(0)
} else {
name=tab.rows[i].cells[0].innerHTML;
if(i>0)tab.rows[i-j].cells[0].rowSpan=j;
j=0;
}
}
var name2="";
for(var i=0,j=0;i <tab.rows.length;i++,j++) {
if(name2==tab.rows[i].cells[1].innerHTML) {
tab.rows[i].deleteCell(1)
} else {
name2=tab.rows[i].cells[1].innerHTML;
if(i>0)tab.rows[i-j].cells[1].rowSpan=j;
j=0;
}
}
</script >
</body>
</html>



對我有用[0] 丟個板磚[0] 引用 舉報 管理 TOP 回覆次數:17

liw

(微微)

等 級:

#1樓 得分:0回覆於:2009-03-06 09:02:59我已經實現了專案列相同單元格的合併,(專案應該改為姓名)
但怎樣將姓名、性別、年齡3列相同的單元格都合併呢?謝謝。


對我有用[0] 丟個板磚[0] 引用 舉報 管理 TOP 精華推薦:純js網頁大型遊戲:《神魔對決2-天上的激戰》(3.8M),開源釋出。

liw

(微微)

等 級:

#2樓 得分:0回覆於:2009-03-06 09:14:44要求達到的效果是:
姓名 性別 年齡 科目 分數
數學 90
張三 男 22 語文 70
22 英語 60
李四 女 19 數學 60
語文 60
王五 男 20 英語 60

姓名列的合併如上面的程式碼已經實現,但性別和年齡列沒搞定,謝謝


對我有用[0] 丟個板磚[0] 引用 舉報 管理 TOP 精華推薦:多快取並存

liw

(微微)

等 級:

#3樓 得分:0回覆於:2009-03-06 09:15:53要求達到的效果是:
姓名 性別 年齡 科目 分數
數學 90
張三 男 22 語文 70
英語 60
李四 女 19 數學 60
語文 60
王五 男 20 英語 60

姓名列的合併如上面的程式碼已經實現,但性別和年齡列沒搞定,謝謝


對我有用[0] 丟個板磚[0] 引用 舉報 管理 TOP 精華推薦:JavaScript 顏色梯度和漸變效果

Free_Wind22

(只接分,不回貼)

等 級:

#4樓 得分:0回覆於:2009-03-06 09:50:09不要分開來,一次合併就好

HTML code
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>無標題文件 </title>
</head>

<body>
<table width="100%" border="1" cellspacing="0" cellpadding="0" id="tab">
<tr>
<td>張三 </td>
<td>男 </td>
<td>22 </td>
<td>數學 </td>
<td>90 </td>
</tr>
<tr>
<td>張三 </td>
<td>男 </td>
<td>22 </td>
<td>語文 </td>
<td>70 </td>
</tr>
<tr>
<td>張三 </td>
<td>男 </td>
<td>22 </td>
<td>英語 </td>
<td>60 </td>
</tr>
<tr>
<td>李四 </td>
<td>女 </td>
<td>19 </td>
<td>數學 </td>
<td>60 </td>
</tr>
<tr>
<td>李四 </td>
<td>女 </td>
<td>19 </td>
<td>語文 </td>
<td>60 </td>
</tr>
<tr>
<td>王五 </td>
<td>男 </td>
<td>19 </td>
<td>英語 </td>
<td>60 </td>
</tr>
</table>

<script type="text/javascript">
window.onload = function(){
var tab = document.getElementById("tab");
var name, sex, age, count, start;

name = sex = age = "";
count = 1;
for(var i=0; i<tab.rows.length; i++){
if(name == tab.rows[i].cells[0].innerHTML && sex == tab.rows[i].cells[1].innerHTML && age == tab.rows[i].cells[2].innerHTML){
count++;
}else{
if(count > 1){ //合併
start = i - count;
tab.rows[start].cells[0].rowSpan = tab.rows[start].cells[1].rowSpan = tab.rows[start].cells[2].rowSpan = count;
for(var j=start+1; j<i; j++){
for(var k=0; k<3; k++){
tab.rows[j].removeChild(tab.rows[j].cells[0]);
}
}
count = 1;
}
name = tab.rows[i].cells[0].innerHTML;
sex = tab.rows[i].cells[1].innerHTML;
age = tab.rows[i].cells[2].innerHTML;
}
}
};
</script>
</body>
</html>





對我有用[0] 丟個板磚[0] 引用 舉報 管理 TOP 精華推薦:JavaScript 拖放效果

liw

(微微)

等 級:

#5樓 得分:0回覆於:2009-03-06 10:04:26Free_Wind22:你的程式碼不能實現動態資料呀?比如姓名裡張三有4個或5個,還是不符合要求,怎麼實現動態的呢?
如:
姓名 性別 年齡 科目 分數
張三 男 22 數學 90
張三 男 22 語文 70
張三 男 22 英語 60
張三 男 22 化學 60
李四 女 19 語文 60
王五 男 20 英語 60


對我有用[0] 丟個板磚[0] 引用 舉報 管理 TOP 精華推薦:(BlueDestiny) 出道javascript的題, 順帶散分~

Free_Wind22

(只接分,不回貼)

等 級:

#6樓 得分:0回覆於:2009-03-06 10:08:03無語,你都沒試怎麼知道..

你表格是動態的就可以了..


對我有用[0] 丟個板磚[0] 引用 舉報 管理 TOP

liw

(微微)

等 級:

#7樓 得分:0回覆於:2009-03-06 10:10:38我試過的,不行呀


對我有用[0] 丟個板磚[0] 引用 舉報 管理 TOP

liw

(微微)

等 級:

#8樓 得分:0回覆於:2009-03-06 10:11:59我把第4行的李四改為張三,結果這個張三沒合併進去


對我有用[0] 丟個板磚[0] 引用 舉報 管理 TOP

liw

(微微)

等 級:

#9樓 得分:0回覆於:2009-03-06 10:15:54我第意思是第1、2、3列合併的單元格數都是動態的,並不一定是相同的一個數,比如第1列合併4個單元格,第2列可能合併3個單元格,第3列可能合併2個單元格,也許是我沒說清楚


對我有用[0] 丟個板磚[0] 引用 舉報 管理 TOP

Free_Wind22

(只接分,不回貼)

等 級:

#10樓 得分:0回覆於:2009-03-06 10:21:16我這個是這樣考慮的,一個班可能有同名的同學.所以要姓名,性別,年齡全部相同才算同一個人,
所以你改第四個的姓名,這不算同一個人.所以沒合併進去..


對我有用[0] 丟個板磚[0] 引用 舉報 管理 TOP

liw

(微微)

等 級:

#11樓 得分:0回覆於:2009-03-06 10:23:06姓名性別年齡列相同的單元格是動態的
如:
姓名 性別 年齡 科目 分數
張三 男 22 數學 90
張三 男 22 語文 70
張三 男 19 英語 60
張三 女 20 化學 60
李四 女 19 語文 60
王五 男 20 英語 60


對我有用[0] 丟個板磚[0] 引用 舉報 管理 TOP

liw

(微微)

等 級:

#12樓 得分:0回覆於:2009-03-06 10:27:08只要前3列裡相同的就合併,比如上面表第1列的4個張三,第2列開始的3個男,接下來的2個女,第3列開始2個22等,要完成這樣動態的要求怎樣實現?謝謝


對我有用[0] 丟個板磚[0] 引用 舉報 管理 TOP

liw

(微微)

等 級:

#13樓 得分:0回覆於:2009-03-06 10:41:41也許我舉的例子不是很恰當,不是一個班的同學,反正就是前3列相同的單元格是動態的,但這3列裡只要是相同的資料就合併單元格


對我有用[0] 丟個板磚[0] 引用 舉報 管理 TOP

Free_Wind22

(只接分,不回貼)

等 級:

#14樓 得分:50回覆於:2009-03-06 10:46:27這個應該符合你這種需求了...

HTML code
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>無標題文件 </title>
</head>

<body>
<table width="100%" border="1" cellspacing="0" cellpadding="0" id="tab">
<tr>
<td>張三 </td>
<td>男 </td>
<td>22 </td>
<td>數學 </td>
<td>90 </td>
</tr>
<tr>
<td>張三 </td>
<td>男 </td>
<td>22 </td>
<td>數學 </td>
<td>90 </td>
</tr>
<tr>
<td>張三 </td>
<td>男 </td>
<td>22 </td>
<td>語文 </td>
<td>70 </td>
</tr>
<tr>
<td>張三 </td>
<td>女 </td>
<td>22 </td>
<td>英語 </td>
<td>60 </td>
</tr>
<tr>
<td>李四 </td>
<td>女 </td>
<td>22 </td>
<td>數學 </td>
<td>60 </td>
</tr>
<tr>
<td>李四 </td>
<td>女 </td>
<td>19 </td>
<td>語文 </td>
<td>60 </td>
</tr>
<tr>
<td>王五 </td>
<td>男 </td>
<td>19 </td>
<td>英語 </td>
<td>60 </td>
</tr>
</table>

<script type="text/javascript">
window.onload = function(){
var tab = document.getElementById("tab");
var maxCol = 3, val, count, start;

for(var col = maxCol-1; col >= 0 ; col--){
count = 1;
val = "";
for(var i=0; i<tab.rows.length; i++){
if(val == tab.rows[i].cells[col].innerHTML){
count++;
}else{
if(count > 1){ //合併
start = i - count;
tab.rows[start].cells[col].rowSpan = count;
for(var j=start+1; j<i; j++){
tab.rows[j].cells[col].style.display = "none";
}
count = 1;
}
val = tab.rows[i].cells[col].innerHTML;
}
}
if(count > 1 ){ //合併,最後幾行相同的情況下
start = i - count;
tab.rows[start].cells[col].rowSpan = count;
for(var j=start+1; j<i; j++){
tab.rows[j].cells[col].style.display = "none";
}
}
}
};

</script>
</body>
</html>




對我有用[0] 丟個板磚[0] 引用 舉報 管理 TOP

Free_Wind22

(只接分,不回貼)

等 級:

#15樓 得分:0回覆於:2009-03-06 10:49:26上面這個是用隱藏的,也可以用
tab.rows[j].removeChild(tab.rows[j].cells[col]);

來代替

tab.rows[j].cells[col].style.display = "none";

來刪除多餘的列