vue中导出excel文件

安装三个依赖

  1. npm install -S file-saver xlsx
  2. npm install -D script-loader

1|01、在src目录下创建一个目录vendor,放入Export2Excel.js

2|02、安装相关组件  npm install -S file-saver 用来生成文件的web应用程序  npm install -S xlsx 电子表格格式的解析器  npm install -D script-loader 将js挂在在全局下

3|03.Export2Excel.js的内容

Export2Excel内容
/* eslint-disable */ import { saveAs } from "file-saver"; import * as XLSX from 'xlsx' function generateArray(table) { var out = []; var rows = table.querySelectorAll("tr"); var ranges = []; for (var R = 0; R < rows.length; ++R) { var outRow = []; var row = rows[R]; var columns = row.querySelectorAll("td"); for (var C = 0; C < columns.length; ++C) { var cell = columns[C]; var colspan = cell.getAttribute("colspan"); var rowspan = cell.getAttribute("rowspan"); var cellValue = cell.innerText; if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue; //Skip ranges ranges.forEach(function (range) { if ( R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c ) { for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null); } }); //Handle Row Span if (rowspan || colspan) { rowspan = rowspan || 1; colspan = colspan || 1; ranges.push({ s: { r: R, c: outRow.length, }, e: { r: R + rowspan - 1, c: outRow.length + colspan - 1, }, }); } //Handle Value outRow.push(cellValue !== "" ? cellValue : null); //Handle Colspan if (colspan) for (var k = 0; k < colspan - 1; ++k) outRow.push(null); } out.push(outRow); } return [out, ranges]; } function datenum(v, date1904) { if (date1904) v += 1462; var epoch = Date.parse(v); return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000); } function 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_address = {c:C, r:R}; var cell_ref =XLSX.utils.encode_cell(cell_address); 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; } function Workbook() { if (!(this instanceof Workbook)) return new Workbook(); this.SheetNames = []; this.Sheets = {}; } 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; } export function export_table_to_excel(id) { var theTable = document.getElementById(id); var oo = generateArray(theTable); var ranges = oo[1]; /* original data */ var data = oo[0]; var ws_name = "SheetJS"; var wb = new Workbook(), ws = sheet_from_array_of_arrays(data); /* add ranges to worksheet */ // ws['!cols'] = ['apple', 'banan']; ws["!merges"] = ranges; /* 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", }); saveAs( new Blob([s2ab(wbout)], { type: "application/octet-stream", }), "test.xlsx" ); } export function export_json_to_excel({ multiHeader = [], header, data, filename, merges = [], autoWidth = true, bookType = "xlsx", } = {}) { /* original data */ filename = filename || "excel-list"; data = [...data]; data.unshift(header); for (let i = multiHeader.length - 1; i > -1; i--) { data.unshift(multiHeader[i]); } var ws_name = "SheetJS"; var wb = new Workbook(), ws = sheet_from_array_of_arrays(data); if (merges.length > 0) { if (!ws["!merges"]) ws["!merges"] = []; merges.forEach((item) => { ws["!merges"].push(XLSX.utils.decode_range(item)); }); } 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: bookType, bookSST: false, type: "binary", }); saveAs( new Blob([s2ab(wbout)], { type: "application/octet-stream", }), `${filename}.${bookType}` ); }

4|04.在组件中的使用

组件中的使用
 <template> <div id="#app"> <el-table :data="contentData" border stripe width="500px"> <el-table-column prop="id" label="id" /> <el-table-column prop="title" label="title" /> </el-table> <!-- 导出按钮 --> <el-button size="default" @click="handleDownload">导出excel</el-button> </div> </template> <script> export default { data() { return { contentData: [ { id: 1, title: "读书" }, { id: 2, title: "读书" }, { id: 3, title: "读书" }, { id: 4, title: "读书" }, ], }; }, if (Array.isArray(this.contentData) && this.contentData.length > 0) { import("@/vendor/Export2Excel") .then((excel) => { // excel表示导入的模块对象 //import方法执行完毕返回的是一个promise对象, // 在then方法中我们可以拿到使用的模块对象 // console.log(excel) //拿到里面的方法 // const tHeader = ["id", "title"]; // 表头 // const thName = ["id", "title"]; // 内容 // 定义每一个对应的中文名称 const list = { id: "序号", title: "名称", }; // 提取出一条数据 const one = this.contentData[0]; if (!one) { return { header, data }; } // 将one数据中的中文名称放入表头数组中 const tHeader = Object.keys(one).map((key) => { return list[key]; }); console.log(tHeader); // 将one数据中的要使用的key(属性)放入内容数组中 const thName = Object.keys(one).map((key) => { return key; }); // const fileData = this.getOrganData(this.cascaderData, this.organId); // 下载名称 // 将每一个数据都提取出来组成一个数组(用数据转换的函数将数据转换为一个个的数组) const excelData = this.formatJson(thName, this.contentData);// [Array(2), Array(2), Array(2), Array(2)] console.log(excelData,'excelData') // 调用封装好的函数进行传值(下载) excel.export_json_to_excel({ header: tHeader, // 表头 data: excelData, // 内容 // filename: `${fileData.name}(箱)`, // 下载名称 autoWidth: true, // Optional // 自适应宽度 bookType: "xlsx", // Optional // 下载格式 }); }) .catch((error) => { console.log(error); }); } else { this.$message({ type: "warning", message: "没有有效数据,不能导出", }); }, // 对导出数据格式处理 formatJson(filterVal, jsonData) { return jsonData.map((v) => filterVal.map((j) => { if (j === "state") { return this.stateFormatter(v); } if (j === "create_time" || j === "update_time") { return parseTime(v[j]); } else { return v[j]; } }) ); }, }, }; </script>

__EOF__

本文作者长安
本文链接https://www.cnblogs.com/jingxin01/p/16707363.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   长安·念  阅读(192)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示