js导出复杂表头(多级表头)的excel

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <table border>
        <tr style="text-align: center;">
            <th rowspan="2">姓名</th>
            <th colspan="2">一月</th>
            <th colspan="2">二月</th>
        </tr>
        <tr style="text-align: center;">
            <th>收入</th>
            <th>支出</th>
            <th>收入</th>
            <th>支出</th>
        </tr>
        <tr style="text-align: center;">
            <td>张三</td>
            <td>10元</td>
            <td>20元</td>
            <td>15元</td>
            <td>25元</td>
        </tr>
        <tr style="text-align: center;">
            <td>李四</td>
            <td>100元</td>
            <td>200元</td>
            <td>150元</td>
            <td>250元</td>
        </tr>
    <table>
    <button onclick="tableToExcel()"">导出excel</button>
    <script type="text/javascript">
        function tableToExcel(){
            //要导出的数据
            var exportData = [
                {
                    name: '张三',
                    month1: {
                        income: '10元',
                        outlay: '20元'
                    },
                    month2: {
                        income: '15元',
                        outlay: '25元'
                    }
                },
                {
                    name: '李四',
                    month1: {
                        income: '100元',
                        outlay: '200元'
                    },
                    month2: {
                        income: '150元',
                        outlay: '250元'
                    }
                }
            ]
            // 自定义的表格
            var tableStr = ` <tr style="text-align: center;">
                                <th rowspan="2">姓名</th>
                                <th colspan="2">一月</th>
                                <th colspan="2">二月</th>
                            </tr>
                            <tr style="text-align: center;">
                                <th>收入</th>
                                <th>支出</th>
                                <th>收入</th>
                                <th>支出</th>
                            </tr>`;
            for(let item of exportData) {
                tableStr += `<tr style="text-align: center;">
                                <td>${item.name}</td>
                                <td>${item.month1.income}</td>
                                <td>${item.month1.outlay}</td>
                                <td>${item.month2.income}</td>
                                <td>${item.month2.outlay}</td>
                            </tr>`;
            }
            //Worksheet名
            var worksheet = 'Sheet1'
            var uri = 'data:application/vnd.ms-excel;base64,';
            // 真正要导出(下载)的HTML模板
            var exportTemplate = `<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" 
                            xmlns="http://www.w3.org/TR/REC-html40">
                                <head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>
                                    <x:Name>${worksheet}</x:Name>
                                        <x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet>
                                    </x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->
                                </head>
                                <body>
                                    <table syle="table-layout: fixed;word-wrap: break-word; word-break: break-all;">${tableStr}</table>
                                </body>
                            </html>`;
            //下载模板
            window.location.href = uri + base64(exportTemplate)
        };
        //输出base64编码
        function base64 (s) { 
            return window.btoa(unescape(encodeURIComponent(s))) 
        };
    </script>
</body>
</html>

ps:要想修改导出的excel表中表格的格式,可直接在上面的模板中给相应的table、tr、td、th等标签添加css样式即可。

猜你喜欢

转载自www.cnblogs.com/luyuefeng/p/10291213.html