SheetJS/js-xlsx cdn excle数据导出

引入依赖js

下载 SheetJS
下载FileSaver.js

实现Vue 导出数据 核心方法


            export_json_to_excel(th, jsonData, defaultTitle) {

                /* original data */

                var data = jsonData;
                data.unshift(th);
                var ws_name = "SheetJS";
                var wb = {
                    SheetNames: [],
                    Sheets: {},
                    Props: {}
                };
                var ws = this.sheet_from_array_of_arrays(data);


                /* add worksheet to workbook */
                wb.SheetNames.push(ws_name);
                wb.Sheets[ws_name] = ws;

                var wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: false, type: 'binary' });
                var title = defaultTitle || '列表'
                console.log(th);
                saveAs(new Blob([this.s2ab(wbout)], { type: "application/octet-stream" }), title + ".xlsx")
            },

完整示例

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <!-- import CSS -->
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
</head>

<body>
    <div id="app">
        <div class="app-container">
            <!-- 导出按钮 -->
            <div class="filter-container">
                <el-button :loading="downloadLoading" class="filter-item" type="primary" icon="el-icon-download"
                    @click="handleDownload">导出</el-button>
            </div>
        </div>
    </div>
</body>
<!-- import Vue before Element -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<!-- import JavaScript -->
<script src="https://unpkg.com/element-ui/lib/index.js"></script>

<!-- 导入你下载的js  -->
<script src="./FileSaver.js"></script>
<script src="./xlsx.core.min.js"></script>
<script>
    new Vue({
        el: '#app',
        data: function () {
            return {
                downloadLoading: false,
                tableData: [
                    { 'index': '0', "nickName": "哈哈哈", "name": "小明" },
                    { 'index': '1', "nickName": "嘿嘿", "name": "小红" },
                    { 'index': '2', "nickName": "八百", "name": "小兰" }
                ]
            }
        },
        methods: {
            handleDownload() {
                this.downloadLoading = true

                const tHeader = ['序号', '昵称', '姓名'];
                // 上面设置Excel的表格第一行的标题
                const filterVal = ['index', 'nickName', 'name'];
                // 上面的index、nickName、name是tableData里对象的属性
                const list = this.tableData;  //把data里的tableData存到list
                const data = this.formatJson(filterVal, list);
                this.export_json_to_excel(tHeader, data, '12312321');
                setTimeout(() => {
                    this.downloadLoading = false
                }, 100);
            },


            formatJson(filterVal, jsonData) {
                return jsonData.map(v => filterVal.map(j => v[j]))
            },
            sheet_from_array_of_arrays(data, opts) {
                var ws = {};
                var range = { s: { c: 10000000, r: 10000000 }, e: { c: 0, r: 0 } };
                for (var R = 0; R != data.length; ++R) {
                    for (var C = 0; C != data[R].length; ++C) {
                        if (range.s.r > R) range.s.r = R;
                        if (range.s.c > C) range.s.c = C;
                        if (range.e.r < R) range.e.r = R;
                        if (range.e.c < C) range.e.c = C;
                        var cell = { v: data[R][C] };
                        if (cell.v == null) continue;
                        var cell_ref = XLSX.utils.encode_cell({ c: C, r: R });

                        if (typeof cell.v === 'number') cell.t = 'n';
                        else if (typeof cell.v === 'boolean') cell.t = 'b';
                        else if (cell.v instanceof Date) {
                            cell.t = 'n';
                            cell.z = XLSX.SSF._table[14];
                            cell.v = datenum(cell.v);
                        }
                        else cell.t = 's';

                        ws[cell_ref] = cell;
                    }
                }
                if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
                return ws;
            },
            export_json_to_excel(th, jsonData, defaultTitle) {

                /* original data */

                var data = jsonData;
                data.unshift(th);
                var ws_name = "SheetJS";
                var wb = {
                    SheetNames: [],
                    Sheets: {},
                    Props: {}
                };
                var ws = this.sheet_from_array_of_arrays(data);
				let autoWidth = false;
				if (autoWidth) {
			        /*设置worksheet每列的最大宽度*/
			        const colWidth = data.map((row) =>
			          row.map((val) => {
			            /*先判断是否为null/undefined*/
			            if (val == null) {
			              return {
			                wch: 10,
			              };
			            } else if (val.toString().charCodeAt(0) > 255) {
			            /*再判断是否为中文*/
			              return {
			                wch: val.toString().length * 2,
			              };
			            } else {
			              return {
			                wch: val.toString().length,
			              };
			            }
			          })
			        );
			        /*以第一行为初始值*/
			        let result = colWidth[0];
			        for (let i = 1; i < colWidth.length; i++) {
			          for (let j = 0; j < colWidth[i].length; j++) {
			            if (result[j]["wch"] < colWidth[i][j]["wch"]) {
			              result[j]["wch"] = colWidth[i][j]["wch"];
			            }
			          }
			        }
			        ws["!cols"] = result;
			      }
                /* add worksheet to workbook */
                wb.SheetNames.push(ws_name);
                wb.Sheets[ws_name] = ws;

                var wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: false, type: 'binary' });
                var title = defaultTitle || '列表'
                console.log(th);
                saveAs(new Blob([this.s2ab(wbout)], { type: "application/octet-stream" }), title + ".xlsx")
            },
            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;
            },
            

        }
    })
</script>

</html>
js-xlsx是一个用于导出Excel文件的JavaScript库。它能够将JavaScript数据对象转换成Excel文件,并提供了丰富的配置选项,以便于用户灵活地定制导出Excel文件的格式和内容。 首先,我们需要引入js-xlsx的库文件,可以通过在线CDN引入或者下载到本地并引入到项目中。然后,我们可以在JavaScript代码中使用js-xlsx的API来进行Excel导出的相关操作。 使用js-xlsx导出Excel的基本步骤如下: 1. 创建一个工作簿对象:通过`XLSX.utils.book_new()`函数创建一个新的工作簿对象。 2. 创建一个工作表对象:通过`XLSX.utils.table_to_sheet()`函数将JavaScript数据对象转换成工作表对象。 3. 将工作表对象添加到工作簿中:通过`XLSX.utils.book_append_sheet()`函数将工作表对象添加到工作簿中。 4. 将工作簿对象转换成Excel文件:通过`XLSX.write()`函数将工作簿对象写入Excel文件。 5. 下载或保存Excel文件:使用下载插件或者将生成的Excel文件保存到本地。 例子代码如下: ``` // 引入js-xlsx库文件 <script src="xlsx.core.min.js"></script> // 创建一个工作簿对象 var workbook = XLSX.utils.book_new(); // 创建一个工作表对象 var worksheet = XLSX.utils.table_to_sheet(document.getElementById('tableId')); // 将工作表对象添加到工作簿中 XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); // 将工作簿对象转换成Excel文件 var excelFile = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' }); // 下载或保存Excel文件 downloadExcelFile(excelFile, 'exportedFile.xlsx'); // 下载Excel文件 function downloadExcelFile(data, filename) { var blob = new Blob([data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); if (window.navigator.msSaveOrOpenBlob) { window.navigator.msSaveBlob(blob, filename); } else { var elem = window.document.createElement('a'); elem.href = window.URL.createObjectURL(blob); elem.download = filename; document.body.appendChild(elem); elem.click(); document.body.removeChild(elem); } } ``` 通过以上步骤,我们可以轻松地使用js-xlsx导出Excel文件,并根据需要进行相应的定制和配置。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yweir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值