一、安装依赖

  1. npm install file-saver --save
  2. npm install xlsx --save
  3. npm install script-loader --save-dev

二、下载两个所需要的js文件Blob.js和Export2Excel.js

  1. Blob.js地址:https://github.com/eligrey/Blob.js/blob/master/Blob.js
  1. /* Blob.js
  2. * A Blob implementation.
  3. * 2018-01-12
  4. *
  5. * By Eli Grey, http://eligrey.com
  6. * By Devin Samarin, https://github.com/dsamarin
  7. * License: MIT
  8. * See https://github.com/eligrey/Blob.js/blob/master/LICENSE.md
  9. */
  10. /*global self, unescape */
  11. /*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true,
  12. plusplus: true */
  13. /*! @source http://purl.eligrey.com/github/Blob.js/blob/master/Blob.js */
  14. (function (view) {
  15. "use strict";
  16. view.URL = view.URL || view.webkitURL;
  17. if (view.Blob && view.URL) {
  18. try {
  19. new Blob;
  20. return;
  21. } catch (e) {}
  22. }
  23. // Internally we use a BlobBuilder implementation to base Blob off of
  24. // in order to support older browsers that only have BlobBuilder
  25. var BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || (function(view) {
  26. var
  27. get_class = function(object) {
  28. return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
  29. }
  30. , FakeBlobBuilder = function BlobBuilder() {
  31. this.data = [];
  32. }
  33. , FakeBlob = function Blob(data, type, encoding) {
  34. this.data = data;
  35. this.size = data.length;
  36. this.type = type;
  37. this.encoding = encoding;
  38. }
  39. , FBB_proto = FakeBlobBuilder.prototype
  40. , FB_proto = FakeBlob.prototype
  41. , FileReaderSync = view.FileReaderSync
  42. , FileException = function(type) {
  43. this.code = this[this.name = type];
  44. }
  45. , file_ex_codes = (
  46. "NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR "
  47. + "NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR"
  48. ).split(" ")
  49. , file_ex_code = file_ex_codes.length
  50. , real_URL = view.URL || view.webkitURL || view
  51. , real_create_object_URL = real_URL.createObjectURL
  52. , real_revoke_object_URL = real_URL.revokeObjectURL
  53. , URL = real_URL
  54. , btoa = view.btoa
  55. , atob = view.atob
  56. , ArrayBuffer = view.ArrayBuffer
  57. , Uint8Array = view.Uint8Array
  58. , origin = /^[\w-]+:\/*\[?[\w\.:-]+\]?(?::[0-9]+)?/
  59. ;
  60. FakeBlob.fake = FB_proto.fake = true;
  61. while (file_ex_code--) {
  62. FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1;
  63. }
  64. // Polyfill URL
  65. if (!real_URL.createObjectURL) {
  66. URL = view.URL = function(uri) {
  67. var
  68. uri_info = document.createElementNS("http://www.w3.org/1999/xhtml", "a")
  69. , uri_origin
  70. ;
  71. uri_info.href = uri;
  72. if (!("origin" in uri_info)) {
  73. if (uri_info.protocol.toLowerCase() === "data:") {
  74. uri_info.origin = null;
  75. } else {
  76. uri_origin = uri.match(origin);
  77. uri_info.origin = uri_origin && uri_origin[1];
  78. }
  79. }
  80. return uri_info;
  81. };
  82. }
  83. URL.createObjectURL = function(blob) {
  84. var
  85. type = blob.type
  86. , data_URI_header
  87. ;
  88. if (type === null) {
  89. type = "application/octet-stream";
  90. }
  91. if (blob instanceof FakeBlob) {
  92. data_URI_header = "data:" + type;
  93. if (blob.encoding === "base64") {
  94. return data_URI_header + ";base64," + blob.data;
  95. } else if (blob.encoding === "URI") {
  96. return data_URI_header + "," + decodeURIComponent(blob.data);
  97. } if (btoa) {
  98. return data_URI_header + ";base64," + btoa(blob.data);
  99. } else {
  100. return data_URI_header + "," + encodeURIComponent(blob.data);
  101. }
  102. } else if (real_create_object_URL) {
  103. return real_create_object_URL.call(real_URL, blob);
  104. }
  105. };
  106. URL.revokeObjectURL = function(object_URL) {
  107. if (object_URL.substring(0, 5) !== "data:" && real_revoke_object_URL) {
  108. real_revoke_object_URL.call(real_URL, object_URL);
  109. }
  110. };
  111. FBB_proto.append = function(data/*, endings*/) {
  112. var bb = this.data;
  113. // decode data to a binary string
  114. if (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) {
  115. var
  116. str = ""
  117. , buf = new Uint8Array(data)
  118. , i = 0
  119. , buf_len = buf.length
  120. ;
  121. for (; i < buf_len; i++) {
  122. str += String.fromCharCode(buf[i]);
  123. }
  124. bb.push(str);
  125. } else if (get_class(data) === "Blob" || get_class(data) === "File") {
  126. if (FileReaderSync) {
  127. var fr = new FileReaderSync;
  128. bb.push(fr.readAsBinaryString(data));
  129. } else {
  130. // async FileReader won't work as BlobBuilder is sync
  131. throw new FileException("NOT_READABLE_ERR");
  132. }
  133. } else if (data instanceof FakeBlob) {
  134. if (data.encoding === "base64" && atob) {
  135. bb.push(atob(data.data));
  136. } else if (data.encoding === "URI") {
  137. bb.push(decodeURIComponent(data.data));
  138. } else if (data.encoding === "raw") {
  139. bb.push(data.data);
  140. }
  141. } else {
  142. if (typeof data !== "string") {
  143. data += ""; // convert unsupported types to strings
  144. }
  145. // decode UTF-16 to binary string
  146. bb.push(unescape(encodeURIComponent(data)));
  147. }
  148. };
  149. FBB_proto.getBlob = function(type) {
  150. if (!arguments.length) {
  151. type = null;
  152. }
  153. return new FakeBlob(this.data.join(""), type, "raw");
  154. };
  155. FBB_proto.toString = function() {
  156. return "[object BlobBuilder]";
  157. };
  158. FB_proto.slice = function(start, end, type) {
  159. var args = arguments.length;
  160. if (args < 3) {
  161. type = null;
  162. }
  163. return new FakeBlob(
  164. this.data.slice(start, args > 1 ? end : this.data.length)
  165. , type
  166. , this.encoding
  167. );
  168. };
  169. FB_proto.toString = function() {
  170. return "[object Blob]";
  171. };
  172. FB_proto.close = function() {
  173. this.size = 0;
  174. delete this.data;
  175. };
  176. return FakeBlobBuilder;
  177. }(view));
  178. view.Blob = function(blobParts, options) {
  179. var type = options ? (options.type || "") : "";
  180. var builder = new BlobBuilder();
  181. if (blobParts) {
  182. for (var i = 0, len = blobParts.length; i < len; i++) {
  183. if (Uint8Array && blobParts[i] instanceof Uint8Array) {
  184. builder.append(blobParts[i].buffer);
  185. }
  186. else {
  187. builder.append(blobParts[i]);
  188. }
  189. }
  190. }
  191. var blob = builder.getBlob(type);
  192. if (!blob.slice && blob.webkitSlice) {
  193. blob.slice = blob.webkitSlice;
  194. }
  195. return blob;
  196. };
  197. var getPrototypeOf = Object.getPrototypeOf || function(object) {
  198. return object.__proto__;
  199. };
  200. view.Blob.prototype = getPrototypeOf(new view.Blob());
  201. }(
  202. typeof self !== "undefined" && self
  203. || typeof window !== "undefined" && window
  204. || this
  205. ));

2.Export2Excel.js

  1. /* eslint-disable */
  2. require('script-loader!file-saver');
  3. require('script-loader!@/vendor/Blob');
  4. require('script-loader!xlsx/dist/xlsx.core.min');
  5. function generateArray(table) {
  6. var out = [];
  7. var rows = table.querySelectorAll('tr');
  8. var ranges = [];
  9. for (var R = 0; R < rows.length; ++R) {
  10. var outRow = [];
  11. var row = rows[R];
  12. var columns = row.querySelectorAll('td');
  13. for (var C = 0; C < columns.length; ++C) {
  14. var cell = columns[C];
  15. var colspan = cell.getAttribute('colspan');
  16. var rowspan = cell.getAttribute('rowspan');
  17. var cellValue = cell.innerText;
  18. if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue;
  19. //Skip ranges
  20. ranges.forEach(function (range) {
  21. if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {
  22. for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);
  23. }
  24. });
  25. //Handle Row Span
  26. if (rowspan || colspan) {
  27. rowspan = rowspan || 1;
  28. colspan = colspan || 1;
  29. ranges.push({s: {r: R, c: outRow.length}, e: {r: R + rowspan - 1, c: outRow.length + colspan - 1}});
  30. }
  31. ;
  32. //Handle Value
  33. outRow.push(cellValue !== "" ? cellValue : null);
  34. //Handle Colspan
  35. if (colspan) for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
  36. }
  37. out.push(outRow);
  38. }
  39. return [out, ranges];
  40. };
  41. function datenum(v, date1904) {
  42. if (date1904) v += 1462;
  43. var epoch = Date.parse(v);
  44. return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
  45. }
  46. function sheet_from_array_of_arrays(data, opts) {
  47. var ws = {};
  48. var range = {s: {c: 10000000, r: 10000000}, e: {c: 0, r: 0}};
  49. for (var R = 0; R != data.length; ++R) {
  50. for (var C = 0; C != data[R].length; ++C) {
  51. if (range.s.r > R) range.s.r = R;
  52. if (range.s.c > C) range.s.c = C;
  53. if (range.e.r < R) range.e.r = R;
  54. if (range.e.c < C) range.e.c = C;
  55. var cell = {v: data[R][C]};
  56. if (cell.v == null) continue;
  57. var cell_ref = XLSX.utils.encode_cell({c: C, r: R});
  58. if (typeof cell.v === 'number') cell.t = 'n';
  59. else if (typeof cell.v === 'boolean') cell.t = 'b';
  60. else if (cell.v instanceof Date) {
  61. cell.t = 'n';
  62. cell.z = XLSX.SSF._table[14];
  63. cell.v = datenum(cell.v);
  64. }
  65. else cell.t = 's';
  66. ws[cell_ref] = cell;
  67. }
  68. }
  69. if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
  70. return ws;
  71. }
  72. function Workbook() {
  73. if (!(this instanceof Workbook)) return new Workbook();
  74. this.SheetNames = [];
  75. this.Sheets = {};
  76. }
  77. function s2ab(s) {
  78. var buf = new ArrayBuffer(s.length);
  79. var view = new Uint8Array(buf);
  80. for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
  81. return buf;
  82. }
  83. export function export_table_to_excel(id) {
  84. var theTable = document.getElementById(id);
  85. console.log('a')
  86. var oo = generateArray(theTable);
  87. var ranges = oo[1];
  88. /* original data */
  89. var data = oo[0];
  90. var ws_name = "SheetJS";
  91. console.log(data);
  92. var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);
  93. /* add ranges to worksheet */
  94. // ws['!cols'] = ['apple', 'banan'];
  95. ws['!merges'] = ranges;
  96. /* add worksheet to workbook */
  97. wb.SheetNames.push(ws_name);
  98. wb.Sheets[ws_name] = ws;
  99. var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'});
  100. saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), "test.xlsx")
  101. }
  102. function formatJson(jsonData) {
  103. console.log(jsonData)
  104. }
  105. export function export_json_to_excel(th, jsonData, defaultTitle) {
  106. /* original data */
  107. var data = jsonData;
  108. data.unshift(th);
  109. var ws_name = "SheetJS";
  110. var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);
  111. /* add worksheet to workbook */
  112. wb.SheetNames.push(ws_name);
  113. wb.Sheets[ws_name] = ws;
  114. var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'});
  115. var title = defaultTitle || '列表'
  116. saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), title + ".xlsx")
  117. }

三、src目录下新建vendor文件夹,将Blob.js和 Export2Excel.js放进去

四、更改webpack.base.conf.js配置

在resolve的alias:

'vendor': path.resolve(__dirname, '../src/vendor')

五、在.vue文件中

script部分

  1. data(){
  2. return{
  3. list:[
  4. {
  5. name:'iphone8',
  6. number:'MPM00112',
  7. salePrice:'¥5999.00',
  8. stocknums:3423,
  9. salesnums:3423,
  10. sharenums:3423,
  11. },
  12. {
  13. name:'iphoneX',
  14. number:'MPM00112',
  15. salePrice:'¥6999.00',
  16. stocknums:3424,
  17. salesnums:3424,
  18. sharenums:3424,
  19. },
  20. ]
  21. }
  22. methods:{
  23. formatJson(filterVal, jsonData) {
  24.     return jsonData.map(v => filterVal.map(j => v[j]))
  25.   },
  26. export2Excel() {
  27.     require.ensure([], () => {
  28. //require的路径因个人项目结构不同可能需要单独调整,请自行修改路径
  29.       const { export_json_to_excel } = require('../../../vendor/Export2Excel');
  30.       const tHeader = ['商品名称','商品货号','售价','库存','销量','分享',];
  31.       const filterVal = ['name', 'number', 'salePrice', 'stocknums', 'salesnums', 'sharenums', ];
  32.       const list = this.goodsItems;
  33.       const data = this.formatJson(filterVal, list);
  34.       export_json_to_excel(tHeader, data, '商品管理列表');
  35.     })
  36.   }
  37. }
  1. template:
  2. <button @click="export2Excel">导出</button>

Vue导出json数据到Excel表格的更多相关文章

  1. vue 导出JSON数据为Excel

    1. 安装三个依赖 npm install file-saver --save npm install xlsx --save npm install script-loader --save-dev ...

  2. vue element 导出 分页数据的excel表格

    1.安装相关依赖 npm install --save xlsx file-saver 2.导入相关插件 在组建头部导入相关插件 const FileSaver = require("fil ...

  3. PHP导出大量数据到excel表格

    /** * @creator Jimmy * @data 2016/8/22 * @desc 数据导出到excel(csv文件) * @param $filename 导出的csv文件名称 如date ...

  4. thinkphp3.2+PHPExcel导出查询数据到excel表格的实例

    首先下载PHPExcel插件,我们需要把PHPExcel.php和PHPExcel文件夹放到D:\XAMPP\htdocs\fsxb\ThinkPHP\Library\Vendor\PHPExcel目 ...

  5. Java操作Jxl实现导出数据生成Excel表格数据文件

    实现:前台用的框架是Easyui+Bootstrap结合使用,需要引入相应的Js.Css文件.页面:Jsp.拦截请求:Servlet.逻辑处理:ClassBean.数据库:SQLserver. 注意: ...

  6. 导出数据到Excel表格

    开发工具与关键技术:Visual Studio 和 ASP.NET.MVC,作者:陈鸿鹏撰写时间:2019年5月25日123下面是我们来学习的导出数据到Excel表格的总结首先在视图层写导出数据的点击 ...

  7. Python导出数据到Excel表格-NotImplementedError: formatting_info=True not yet implemented

    在使用Python写入数据到Excel表格中时出现报错信息记录:“NotImplementedError: formatting_info=True not yet implemented” 报错分析 ...

  8. PHP导出MySQL数据到Excel文件

    PHP导出MySQL数据到Excel文件 转载 常会碰到需要从数据库中导出数据到Excel文件,用一些开源的类库,比如PHPExcel,确实比较容易实现,但对大量数据的支持很不好,很容易到达PHP内存 ...

  9. js将json数据动态生成表格

    今天开发中遇到需要展示动态数据的问题, 具体要求是后端传来的json字符串,要在前端页面以table表格的形式展示, 其实没啥难的,就是拼接table标签,纯属体力活,于是自己写了个呆萌,保存起来,以 ...

随机推荐

  1. Spring Security(二十九):9.4.1 ExceptionTranslationFilter

    ExceptionTranslationFilter is a Spring Security filter that has responsibility for detecting any Spr ...

  2. 看完python这段爬虫代码,java流泪了c#沉默了

    哈哈,其实很简单,寥寥几行代码网页爬一部小说,不卖关子,立刻开始. 首先安装所需的包,requests,BeautifulSoup4 控制台执行 pip install requests pip in ...

  3. 《App架构实践指南》

    推荐书籍 <App 架构实践指南>

  4. 对List集合嵌套了map集合对double值进行排序

    /*[ { "repairo": "asda", "num": 88.71 }, { "repairo": " ...

  5. 微信小程序手机预览请求不到数据(最后一条不明所以)

    本地开发调试小程序时,用手机预览需要有如下设置:1.微信开发者工具中设置:不校验安全域名.web-view 域名.TLS 版本以及 HTTPS 证书.这样在有网络请求的时候,就可以访问本地的服务器了, ...

  6. safari打开的页面数字识别变为蓝色

    今天网页碰到一个很怪异的问题:app打开的一个网页样式是好的,但通过safari打开后数字的颜色变为蓝色,并且还变得可点击了! 原来safari总会把长串数字识别为电话号码,文字变成蓝色,点击还会弹出 ...

  7. Delphi Create(nil), Create(self), Create(Application)的区别

    最近的项目中经常在程序中动态创建控件,势必用到Create. 但是随之而来的问题就是动态创建的控件是否可以正确的释放内存? 以及 Create(nil), Create(self), Create(A ...

  8. [模板] 二分图博弈 && BZOJ2463:[中山市选2009]谁能赢呢?

    二分图博弈 from BZOJ 1443 游戏(二分图博弈) - free-loop - 博客园 定义 1.博弈者人数为两人,双方轮流进行决策. 2.博弈状态(对应点)可分为两类(状态空间可分为两个集 ...

  9. DRF初识与序列化

    一.Django的序列化方法 1.为什么要用序列化组件 做前后端分离的项目,我们前后端数据交互一般都选择JSON,JSON是一个轻量级的数据交互格式.那么我们给前端数据的时候都要转成json格式,那就 ...

  10. zabbix误报交换机重启

    交换机的sysUpTime是由一个32-bit的counter来计数的,单位是0.01秒,所以最大时间为496天,过了496天就溢出,变成0,然后又重新计算时间,所以zabbix误报. snmpwal ...