用JS制作复杂表格,原生JS将表格导出为Excel

316 阅读2分钟

image.png

image.png

* {
    border:0;
    padding:0px;
    margin:0px;
}
table {
    height: 600px;
}
table th {
    min-height: 30px;
    min-width:30px;
}
table th td {
    min-height: 30px;
    min-width:30px;
}
table,th,td,button {
    border: 1px solid black;
}
button {
    padding: 5px;
    margin: 0px 0px 5px 420px;
}
var arr = [
            {
                "xian": "简阳市",
                "reservoirName": "棉丰",
                "stateName": "error",
                "state": 1,
                "devName": "监测",
                "sName": [
                    "P1-1"
                ],
                "sTime": [
                    "2023-07-20T17:12:23"
                ]
            },
            {
                "xian": "金堂县",
                "reservoirName": "油房堰",
                "stateName": "error",
                "state": 1,
                "devName": "监测",
                "sName": [
                    "P2-1"
                ],
                "sTime": [
                    "2023-07-20T17:12:34"
                ]
            },
            
            {
                "xian": "大邑县",
                "reservoirName": "七一",
                "stateName": "error",
                "state": 1,
                "devName": "监测",
                "sName": [
                    "P2-2"
                ],
                "sTime": [
                    "2023-07-20T15:04:55"
                ]
            },
            {
                "xian": "蒲江县",
                "reservoirName": "庙峰",
                "stateName": "error",
                "state": 1,
                "devName": "监测",
                "sName": [
                    "P4-3"
                ],
                "sTime": [
                    "2023-07-19T12:48:57"
                ]
            },
            {
                "xian": "蒲江县",
                "reservoirName": "凉风岭",
                "stateName": "error",
                "state": 2,
                "devName": "监测",
                "sName": [
                    "P6-2",
                    "P5-4"
                ],
                "sTime": [
                    "2023-07-19T12:48:57",
                    "2023-07-19T12:48:57"
                ]
            },
            {
                "xian": "简阳市",
                "reservoirName": "连山",
                "stateName": "error",
                "state": 1,
                "devName": "监测",
                "sName": [
                    "P3-1"
                ],
                "sTime": [
                    "2023-07-16T15:46:35"
                ]
            },
            {
                "xian": "金堂县",
                "reservoirName": "红旗",
                "stateName": "error",
                "state": 1,
                "devName": "监测",
                "sName": [
                    "P2-2"
                ],
                "sTime": [
                    "2023-07-20T17:06:28"
                ]
            },
            {
                "xian": "金堂县",
                "reservoirName": "黄鹤",
                "stateName": "error",
                "state": 1,
                "devName": "监测",
                "sName": [
                    "P2-1"
                ],
                "sTime": [
                    "2023-07-20T17:12:25"
                ]
            },
            {
                "xian": "金堂县",
                "reservoirName": "油房堰",
                "stateName": "error",
                "state": 1,
                "devName": "监测",
                "sName": [
                    "P4-4"
                ],
                "sTime": [
                    "2023-07-20T17:12:34"
                ]
            },
            {
                "xian": "金堂县",
                "reservoirName": "磙子坝",
                "stateName": "error",
                "state": 1,
                "devName": "监测",
                "sName": [
                    "P6-6"
                ],
                "sTime": [
                    "2023-07-20T11:09:35"
                ]
            },
            {
                "xian": "金堂县",
                "reservoirName": "黄鹤",
                "stateName": "error",
                "state": 1,
                "devName": "监测",
                "sName": [
                    "P7-1"
                ],
                "sTime": [
                    "2023-07-20T17:12:25"
                ]
            },
            {
                "xian": "东部新区",
                "reservoirName": "五龙",
                "stateName": "error",
                "state": 2,
                "devName": "监测",
                "sName": [
                    "P4-4",
                    "P3-2"
                ],
                "sTime": [
                    "2023-06-28T11:06:17",
                    "2023-06-28T11:01:02"
                ]
            },
            {
                "xian": "东部新区",
                "reservoirName": "前进",
                "stateName": "error",
                "state": 1,
                "devName": "监测",
                "sName": [
                    "P7-7"
                ],
                "sTime": [
                    "2023-07-20T17:11:03"
                ]
            },
            {
                "xian": "简阳市",
                "reservoirName": "飞凤",
                "stateName": "error",
                "state": 1,
                "devName": "监测",
                "sName": [
                    "P3-3"
                ],
                "sTime": [
                    "2023-07-20T17:12:43"
                ]
            }
        ]
        
        var stateNum = 0
        var rowNum = arr.length
        var dName = arr[0].devName
        for(var i=0,j=arr.length;i<j;i++) {
            stateNum += arr[i].state
        }
        var tb = document.getElementById('table')
        
        arr.reduce((acc, item) => {
            if (acc[item.xian]) {
                acc[item.xian].push(item);
            } else {
                acc[item.xian] = [item];
            }
            // 将数据按照 区县市 整理好 传入 dt中
            return arr = acc;
        }, {});
        
        var rnArr = Object.keys(arr)

        var table = '<table border="1" cellspacing="0"><thead><tr><th>类型</th><th>区县</th><th>地点</th><th>数量</th><th>设备名称</th><th>最后在线时间</th></tr></thead><tbody>'
        table += `<tr><td rowspan="${stateNum}">${dName}(${stateNum})</td></tr>`
        rnArr.forEach(rN=>{
            for(var i=0,j=arr[rN].length;i<j;i++) {
                if(i==0){
                    var add = 0
                    arr[rN].forEach(nu=>{
                        add += nu.state
                    })
                    table += `<tr><td rowspan="${j}">${rN}(${add})</td><td>${arr[rN][i].reservoirName}</td><td>${arr[rN][i].state}</td>`
                    if(arr[rN][i].sName.length == 1) {
                        table += `<td>${arr[rN][i].sName[0]}</td>`
                        
                    } else {
                        var stateAndTime = ''
                        for(var k = 0; k < arr[rN][i].sName.length; k++) {
                            // if(k>0) {
                            //     stateAndTime += '</br>'
                            // }
                            stateAndTime += `<div>${arr[rN][i].sName[k]}</div>`

                        }
                        
                        table += `<td>${stateAndTime}</td>`
                    }
                    if(arr[rN][i].sTime.length == 1) {
                        table += `<td>${arr[rN][i].sTime[0].replace("T"," ")}</td></tr>`
                    } else {
                        var stateAndTime = ''
                        for(var k = 0; k < arr[rN][i].sTime.length; k++) {
                            // if(k>0) {
                            //     stateAndTime += '</br>'
                            // }
                            stateAndTime += `<div>${arr[rN][i].sTime[k].replace("T"," ")}</div>`

                        }
                        
                        table += `<td>${stateAndTime}</td></tr>`
                    }   
                }else{
                    table += `<tr><td>${arr[rN][i].reservoirName}</td><td>${arr[rN][i].state}</td>`
                    if(arr[rN][i].sName.length == 1) {
                        table += `<td>${arr[rN][i].sName[0]}</td>`
                        
                    } else {
                        var stateAndTime = ''
                        for(var k = 0; k < arr[rN][i].sName.length; k++) {
                            // if(k>0) {
                            //     stateAndTime += '</br>'
                            // }
                            stateAndTime += `<div>${arr[rN][i].sName[k]}</div>`

                        }
                        
                        table += `<td>${stateAndTime}</td>`
                    }
                    if(arr[rN][i].sTime.length == 1) {
                        table += `<td>${arr[rN][i].sTime[0].replace("T"," ")}</td></tr>`
                    } else {
                        var stateAndTime = ''
                        for(var k = 0; k < arr[rN][i].sTime.length; k++) {
                            // if(k>0) {
                            //     stateAndTime += '</br>'
                            // }
                            stateAndTime += `<div>${arr[rN][i].sTime[k].replace("T"," ")}</div>`

                        }
                        
                        table += `<td>${stateAndTime}</td></tr>`
                    }   
                }
            }
        })
        
        table += '</tbody></table>'
        tb.innerHTML = table
        console.log(arr);

        // 导出Excel
        function leadingOutExcel(html) {
            const uri = 'data:text/xls;charset=utf-8,\ufeff' + encodeURIComponent(html);
            const link = document.createElement("a");
            link.href = uri;
            link.download = "Data.xls";
            link.click();
        }
        let btn = document.getElementById('eExcel')
        btn.onclick = function() {
            leadingOutExcel(table)
        }