<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <!-- import CSS -->
    <link rel="stylesheet" href="index.css">
</head>
<style>
    .el-checkbox {
        display: block;
        min-width: 100px;
        padding: 5px 10px;
        cursor: pointer;
        margin-right: 0px;
    }

    .el-checkbox:hover {
        background-color: #ecf5ff;
        color: #66b1ff;
    }
</style>

<body>
    <div>
        <div id="app">
            <div style="width:800px;">
                <button @click="downExcel">导出</button>
                <template>
                    <el-table style="width: 100%" border :data="tableData">
                        <template v-for="(item,index) in total_tableHead">
                            <el-table-column :fixed="index==0" v-if="item.show" :prop="item.data" sortable
                                :label="item.title" :key="index"></el-table-column>
                        </template>
                        <el-table-column fixed="right" label="操作" width="100">
                            <template slot-scope="scope">
                                <el-button @click="handleClick(scope.row)" type="text" size="small">查看</el-button>
                                <el-button type="text" size="small">编辑</el-button>
                            </template>
                        </el-table-column>
                    </el-table>
                </template>
            </div>
            <div class="data_norm">
                <el-dropdown trigger="click" :hide-on-click="false">
                    <span class="el-dropdown-link">
                        数据指标
                    </span>
                    <el-dropdown-menu slot="dropdown">
                        <template>
                            <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll"
                                @change="handleCheckAllChange">全选</el-checkbox>
                            <el-checkbox-group v-model="checkedCities" @change="handleCheckedCitiesChange">
                                <el-checkbox v-for="(item,index) in total_tableHead" @change="checked_item(item,index)"
                                    :label="item.title" :key="item.title">{{item.title}}</el-checkbox>
                            </el-checkbox-group>
                        </template>
                        </el-dropdown-item>

                </el-dropdown>
            </div>
        </div>
</body>
<script src="https://www.jq22.com/jquery/jquery-3.3.1.js"></script>
<!-- import Vue before Element :default-value="(new Date()).getTime()-3600*1000*24*30"-->
<script src="vue.js"></script>
<!-- import JavaScript -->
<script src="index.js"></script>
<script src="Export2Excel.js"></script>
<script type="text/javascript" src="xlsx.core.min.js"></script>
<script>
    var Main = {
        data() {
            return {
                total_tableHead: [
                    { title: '日期', data: 'date', show: true },
                    { title: '姓名', data: 'name', show: true },
                    { title: '省份', data: 'province', show: true },
                    { title: '市区', data: 'city', show: true },
                    { title: '地址', data: 'address', show: true },
                    { title: '邮编', data: 'zip', show: true },
                ],
                tableData: [{
                    date: '2016-05-02',
                    name: '王小虎',
                    province: '上海',
                    city: '普陀区',
                    address: '上海市普陀区金沙江路 1518 弄',
                    zip: 200333,
                }, {
                    date: '2016-05-04',
                    name: '王小虎',
                    province: '上海',
                    city: '普陀区',
                    address: '上海市普陀区金沙江路 1517 弄',
                    zip: 200333,
                }, {
                    date: '2016-05-01',
                    name: '王小虎',
                    province: '上海',
                    city: '普陀区',
                    address: '上海市普陀区金沙江路 1519 弄',
                    zip: 200333,
                }, {
                    date: '2016-05-03',
                    name: '王小虎',
                    province: '上海',
                    city: '普陀区',
                    address: '上海市普陀区金沙江路 1516 弄',
                    zip: 200333,
                }],
                checkAll: false,
                checkedCities: [],
                isIndeterminate: false
            }
        },
        created() {
        },
        methods: {
            handleClick() {

            },
            //下载excel
            downExcel() {
                this.exportExcel(this.tableData, this.total_tableHead, '导出.xlsx')
            },
            //导出excel
            exportExcel(td, th, title) {
                var ws = XLSX.utils.json_to_sheet(td);
                var titles = {}
                th.map(function (v, i) {
                    titles[v.data] = v.title
                })
                const range = XLSX.utils.decode_range(ws['!ref'])
                for (let c = range.s.c; c <= range.e.c; c++) {
                    const header = XLSX.utils.encode_col(c) + '1'
                    ws[header].v = titles[ws[header].v]
                }
                openDownloadDialog(sheet2blob(ws), title);
            },
            handleCheckAllChange(val) {
                let that = this;
                let thead = [];
                this.total_tableHead.map(function (item) {
                    thead.push(item.title)
                })
                this.checkedCities = val ? thead : [];
                this.isIndeterminate = false;
            },
            handleCheckedCitiesChange(value) {
                let checkedCount = value.length;
                this.checkAll = checkedCount === this.total_tableHead.length;
                this.isIndeterminate = checkedCount > 0 && checkedCount < this.total_tableHead.length;
            },
            checked_item(item, index) {
                item.show = !item.show
            },
        },
        computed: {

        },
        watch: {

        }
    }
    var Ctor = Vue.extend(Main)
    new Ctor().$mount('#app')
</script>

</html>

Export2Excel.js

// csv转sheet对象
function csv2sheet(csv) {
    var sheet = {}; // 将要生成的sheet
    csv = csv.split('\n');
    csv.forEach(function (row, i) {
        row = row.split(',');
        if (i == 0) sheet['!ref'] = 'A1:' + String.fromCharCode(65 + row.length - 1) + (csv.length - 1);
        row.forEach(function (col, j) {
            sheet[String.fromCharCode(65 + j) + (i + 1)] = { v: col };
        });
    });
    return sheet;
}

// 将一个sheet转成最终的excel文件的blob对象,然后利用URL.createObjectURL下载
function sheet2blob(sheet, sheetName) {
    sheetName = sheetName || 'sheet1';
    var workbook = {
        SheetNames: [sheetName],
        Sheets: {}
    };
    workbook.Sheets[sheetName] = sheet;
    // 生成excel的配置项
    var wopts = {
        bookType: 'xlsx', // 要生成的文件类型
        bookSST: false, // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
        type: 'binary'
    };
    var wbout = XLSX.write(workbook, wopts);
    var blob = new Blob([s2ab(wbout)], { type: "application/octet-stream" });
    // 字符串转ArrayBuffer
    function s2ab(s) {
        var buf = new ArrayBuffer(s.length);
        var view = new Uint8Array(buf);
        for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
        return buf;
    }
    return blob;
}


/**
 * 通用的打开下载对话框方法,没有测试过具体兼容性
 * @param url 下载地址,也可以是一个blob对象,必选
 * @param saveName 保存文件名,可选
 */
function openDownloadDialog(url, saveName) {
    if (typeof url == 'object' && url instanceof Blob) {
        url = URL.createObjectURL(url); // 创建blob地址
    }
    var aLink = document.createElement('a');
    aLink.href = url;
    aLink.download = saveName || ''; // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,file:///模式下不会生效
    var event;
    if (window.MouseEvent) event = new MouseEvent('click');
    else {
        event = document.createEvent('MouseEvents');
        event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
    }
    aLink.dispatchEvent(event);
}
// 传入csv,执行后就会弹出下载框
function exportExcel(csv) {
    var sheet = csv2sheet(csv);
    var blob = sheet2blob(sheet);
    openDownloadDialog(blob, '导出.xlsx');
}

白色111
87 声望1 粉丝