Vue+ElementUI 导出table数据为Excel文件(非npm的方式引入js文件)

        最近项目有个需求,将页面中的table导出为excel文件。本来最初的想法的是将数据传输到后台,在使用apache的POI组件导出excel,但是当前项目的框架版本比较老,而且是自研框架,无法调用后台代码。所有这条路走不通,然后转为使用前端组件导出excel文件。

        这里面前端用的是Vue框架+ElementUI。根据网上搜索的资料,都需要引入两个依赖,分别为xlsxfile-saver,然后网上写的都是通过npm的方式下载依赖,但是我压根就看不懂(最近才开始接触Vue)。

所以请教了一下公司的前端同事,装了一个NodeJs,然后通过命令行下载该依赖。

下载依赖(js文件):

(1)首先在桌面新建一个文件夹,并进入该文件夹

(2)打开power shell,执行命令 npm init

(3)执行命令 npm -i xlsx ,执行完成后会发现 在 npm\node_modules\xlsx 目录下已经下载好了xlsx.js 文件

(4)执行命令 npm -i file-saver ,执行完成后会发现在 npm\node_modules\file-saver\dist 目录下已经下载好了FileSaver.js 文件

html页面引用依赖:

(5)最后把这两个文件通过

    <script type="text/javascript" src="/assets/js/FileSaver.js"></script>
    <script type="text/javascript" src="/assets/js/xlsx.js"></script>

引入到html文件中。

定义变量(我也不知道是干嘛的):

(6)在script标签内 定义以下列代码

    Vue.prototype.$XLSX = XLSX;

如下图所示:

 在html文件中定义table(声明id):

 编写导出excel的JavaScript代码:

var vm = new Vue({
        el: '#app',
        data() {
            return {
                tableDataList: [],
                total: 0,
            }
        },
        methods: {
            //导出excel文件
            exportExcel() {
                //根据id获取table
                let tables = document.getElementById("exportTable");
                //固定写法
                let wb = this.$XLSX.utils.table_to_sheet(tables, {raw: true});
                for (var i = 0; i < 11; i++) {
                    //设置前10列宽度为130
                    wb["!cols"][i] = {
                        wpx: 130
                    }
                }
                //设置文字颜色、居中显示
                for (const key in wb) {
                    if (key.indexOf('!') === -1 && wb[key].v) {
                        wb[key].s = {
                            font: { //字体设置
                                sz: 13,
                                bold: false,
                                color: {
                                    rgb: '000000' //十六进制,不带#
                                }
                            },
                            alignment: { //文字居中
                                horizontal: 'center',
                                vertical: 'center',
                                wrap_text: true
                            }
                        }
                    }
                }
                //设置sheet名称,将为转为blob
                var filedata = this.sheet2blob(wb, "铅封运用完成率详情");
                //设置下载文件名称,并下载
                this.openDownloadDialog(filedata, "铅封运用完成率详情.xlsx")
            },
            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;
            },
            //设置下载文件名称,并下载
            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);
            },
            handleSizeChange(val) {
                pageSize = val;
                console.log('每页 ' + val + '条');
                var factory_id = parent.window.factory_id;
                var line_code = parent.window.line_code;
                var date_from = parent.window.date_from;
                var date_to = parent.window.date_to;
                this.searchModData(factory_id, line_code, date_from, date_to, pageSize, currentPage);
            }, handleCurrentChange(val) {
                currentPage = val;
                var factory_id = parent.window.factory_id;
                var line_code = parent.window.line_code;
                var date_from = parent.window.date_from;
                var date_to = parent.window.date_to;
                this.searchModData(factory_id, line_code, date_from, date_to, pageSize, currentPage);
                console.log('当前页: ' + val);
            },
            searchModData(factory_id, line_code, date_from, date_to) {
                parent.axios.post("/api/query/W030Query/action/getW037Data", {
                    aux: {
                        factory_id: factory_id,
                        line_code: line_code,
                        date_from: date_from,
                        date_to: date_to,
                        pageSize: pageSize,
                        currentPage: currentPage
                    }
                }, {
                    headers: {
                        'content-type': 'application/json'
                    }
                }).then(response => {
                    var res = response.data.data;
                    this.tableDataList = res.dataList;
                    this.total = res.total;
                });
            }, tableCellClick(row, column, cell, event) {

            }, timeStyle(row, column, rowIndex, columnIndex) {

            }, tableCellClassName({row, column, rowIndex, columnIndex}) {
                // 把每一行的索引放进row
                row.index = rowIndex
                column.index = columnIndex;
            }, objectSpanMethod({row, column, rowIndex, columnIndex}) {

            }, open(row) {

            }
        }, created() {
            var factory_id = parent.window.factory_id;
            var line_code = parent.window.line_code;
            var date_from = parent.window.date_from;
            var date_to = parent.window.date_to;
            this.searchModData(factory_id, line_code, date_from, date_to, pageSize, currentPage);
        },
    });

大部分代码全是从网上扒过来的,都是非是用import关键字引入的。

主要逻辑:

(1)进入页面先渲染table表格

(2)点击导出按钮,执行exportExcel方法

(3)根据id获取table对象,然后设置excel的一些样式,最后导出。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将Vue项目Element UI的Table组件导出Excel文件,可以按照以下步骤进行操作: 1. 首先,确保你的Vue项目已经安装了Element UI和xlsx插件。如果还没有安装,可以使用以下命令进行安装: ``` npm install element-ui xlsx ``` 2. 在需要导出Table组件的Vue组件,导入所需的模块和样式: ```javascript import XLSX from 'xlsx'; import 'xlsx/dist/xlsx.css'; import { Table } from 'element-ui'; import 'element-ui/lib/theme-chalk/index.css'; ``` 3. 在模板使用Element UI的Table组件,并绑定数据: ```html <template> <div> <el-table :data="tableData" ref="table"> <!-- 表格内容 --> </el-table> <el-button type="primary" @click="exportTable">导出表格</el-button> </div> </template> ``` 4. 在Vue组件的`exportTable`方法使用XLSX库将Table组件的数据导出Excel文件: ```javascript export default { data() { return { tableData: [ // 表格数据 ], }; }, methods: { exportTable() { const tableData = this.$refs.table.store.states.data; // 获取Table组件数据 const worksheet = XLSX.utils.json_to_sheet(tableData); // 将数据转换为worksheet对象 const workbook = XLSX.utils.book_new(); // 创建工作簿对象 XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); // 将worksheet添加到工作簿 const wbout = XLSX.write(workbook, { bookType: 'xlsx', type: 'binary' }); // 将工作簿转换为二进制数据 function s2ab(s) { // 字符串转ArrayBuffer const buf = new ArrayBuffer(s.length); const view = new Uint8Array(buf); for (let i = 0; i < s.length; i++) { view[i] = s.charCodeAt(i) & 0xff; } return buf; } const blob = new Blob([s2ab(wbout)], { type: 'application/octet-stream' }); // 创建Blob对象 const downloadLink = document.createElement('a'); // 创建下载链接 downloadLink.href = URL.createObjectURL(blob); downloadLink.download = 'table.xlsx'; // 下载文件名 document.body.appendChild(downloadLink); // 添加下载链接到页面 downloadLink.click(); // 模拟点击下载 setTimeout(() => { document.body.removeChild(downloadLink); // 下载完成后移除下载链接 URL.revokeObjectURL(downloadLink.href); // 释放URL对象 }, 200); }, }, }; ``` 在这个示例,`exportTable`方法使用`$refs`来获取Table组件的数据,并使用XLSX库将数据转换为Excel文件。然后,创建一个下载链接并模拟点击下载。最后,移除下载链接和释放URL对象。 请注意,上述示例的`tableData`和`s2ab`函数需要根据你的实际情况进行调整。`tableData`应该是你要导出Table组件的数据,而`s2ab`函数是一个将字符串转换成ArrayBuffer的辅助函数。 使用以上步骤,你就可以将Element UI的Table组件导出Excel文件了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值