导入 ExportExcel.js

    1. handleDownload() {
    2. this.downloadLoading = true
    3. import(./ExportExcel').then(excel => {
    4. const tHeader = ['Id', 'Title', 'Author', 'Readings', 'Date']
    5. const filterVal = ['id', 'title', 'author', 'pageviews', 'display_time']
    6. const list = this.list
    7. const data = this.formatJson(filterVal, list)
    8. excel.export_json_to_excel({
    9. header: tHeader,
    10. data,
    11. filename: this.filename,
    12. autoWidth: this.autoWidth,
    13. bookType: this.bookType
    14. })
    15. this.downloadLoading = false
    16. })
    17. },
    18. // 格式化数据
    19. formatJson(filterVal, jsonData) {
    20. return jsonData.map(v => filterVal.map(j => {
    21. if (j === 'timestamp') {
    22. return parseTime(v[j])
    23. } else {
    24. return v[j]
    25. }
    26. }))
    27. }

    ExportExcel.js源码

    1. /* eslint-disable */
    2. require('script-loader!file-saver');
    3. import XLSX from 'xlsx'
    4. function generateArray(table) {
    5. var out = [];
    6. var rows = table.querySelectorAll('tr');
    7. var ranges = [];
    8. for (var R = 0; R < rows.length; ++R) {
    9. var outRow = [];
    10. var row = rows[R];
    11. var columns = row.querySelectorAll('td');
    12. for (var C = 0; C < columns.length; ++C) {
    13. var cell = columns[C];
    14. var colspan = cell.getAttribute('colspan');
    15. var rowspan = cell.getAttribute('rowspan');
    16. var cellValue = cell.innerText;
    17. if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue;
    18. //Skip ranges
    19. ranges.forEach(function (range) {
    20. if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {
    21. for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);
    22. }
    23. });
    24. //Handle Row Span
    25. if (rowspan || colspan) {
    26. rowspan = rowspan || 1;
    27. colspan = colspan || 1;
    28. ranges.push({
    29. s: {
    30. r: R,
    31. c: outRow.length
    32. },
    33. e: {
    34. r: R + rowspan - 1,
    35. c: outRow.length + colspan - 1
    36. }
    37. });
    38. };
    39. //Handle Value
    40. outRow.push(cellValue !== "" ? cellValue : null);
    41. //Handle Colspan
    42. if (colspan)
    43. for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
    44. }
    45. out.push(outRow);
    46. }
    47. return [out, ranges];
    48. };
    49. function datenum(v, date1904) {
    50. if (date1904) v += 1462;
    51. var epoch = Date.parse(v);
    52. return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
    53. }
    54. function sheet_from_array_of_arrays(data, opts) {
    55. var ws = {};
    56. var range = {
    57. s: {
    58. c: 10000000,
    59. r: 10000000
    60. },
    61. e: {
    62. c: 0,
    63. r: 0
    64. }
    65. };
    66. for (var R = 0; R != data.length; ++R) {
    67. for (var C = 0; C != data[R].length; ++C) {
    68. if (range.s.r > R) range.s.r = R;
    69. if (range.s.c > C) range.s.c = C;
    70. if (range.e.r < R) range.e.r = R;
    71. if (range.e.c < C) range.e.c = C;
    72. var cell = {
    73. v: data[R][C]
    74. };
    75. if (cell.v == null) continue;
    76. var cell_ref = XLSX.utils.encode_cell({
    77. c: C,
    78. r: R
    79. });
    80. if (typeof cell.v === 'number') cell.t = 'n';
    81. else if (typeof cell.v === 'boolean') cell.t = 'b';
    82. else if (cell.v instanceof Date) {
    83. cell.t = 'n';
    84. cell.z = XLSX.SSF._table[14];
    85. cell.v = datenum(cell.v);
    86. } else cell.t = 's';
    87. ws[cell_ref] = cell;
    88. }
    89. }
    90. if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
    91. return ws;
    92. }
    93. function Workbook() {
    94. if (!(this instanceof Workbook)) return new Workbook();
    95. this.SheetNames = [];
    96. this.Sheets = {};
    97. }
    98. function s2ab(s) {
    99. var buf = new ArrayBuffer(s.length);
    100. var view = new Uint8Array(buf);
    101. for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
    102. return buf;
    103. }
    104. export function export_table_to_excel(id) {
    105. var theTable = document.getElementById(id);
    106. var oo = generateArray(theTable);
    107. var ranges = oo[1];
    108. /* original data */
    109. var data = oo[0];
    110. var ws_name = "SheetJS";
    111. var wb = new Workbook(),
    112. ws = sheet_from_array_of_arrays(data);
    113. /* add ranges to worksheet */
    114. // ws['!cols'] = ['apple', 'banan'];
    115. ws['!merges'] = ranges;
    116. /* add worksheet to workbook */
    117. wb.SheetNames.push(ws_name);
    118. wb.Sheets[ws_name] = ws;
    119. var wbout = XLSX.write(wb, {
    120. bookType: 'xlsx',
    121. bookSST: false,
    122. type: 'binary'
    123. });
    124. saveAs(new Blob([s2ab(wbout)], {
    125. type: "application/octet-stream"
    126. }), "test.xlsx")
    127. }
    128. export function export_json_to_excel({
    129. header,
    130. data,
    131. filename,
    132. autoWidth = true,
    133. bookType= 'xlsx'
    134. } = {}) {
    135. /* original data */
    136. filename = filename || 'excel-list'
    137. data = [...data]
    138. data.unshift(header);
    139. var ws_name = "SheetJS";
    140. var wb = new Workbook(),
    141. ws = sheet_from_array_of_arrays(data);
    142. if (autoWidth) {
    143. /*设置worksheet每列的最大宽度*/
    144. const colWidth = data.map(row => row.map(val => {
    145. /*先判断是否为null/undefined*/
    146. if (val == null) {
    147. return {
    148. 'wch': 10
    149. };
    150. }
    151. /*再判断是否为中文*/
    152. else if (val.toString().charCodeAt(0) > 255) {
    153. return {
    154. 'wch': val.toString().length * 2
    155. };
    156. } else {
    157. return {
    158. 'wch': val.toString().length
    159. };
    160. }
    161. }))
    162. /*以第一行为初始值*/
    163. let result = colWidth[0];
    164. for (let i = 1; i < colWidth.length; i++) {
    165. for (let j = 0; j < colWidth[i].length; j++) {
    166. if (result[j]['wch'] < colWidth[i][j]['wch']) {
    167. result[j]['wch'] = colWidth[i][j]['wch'];
    168. }
    169. }
    170. }
    171. ws['!cols'] = result;
    172. }
    173. /* add worksheet to workbook */
    174. wb.SheetNames.push(ws_name);
    175. wb.Sheets[ws_name] = ws;
    176. var wbout = XLSX.write(wb, {
    177. bookType: bookType,
    178. bookSST: false,
    179. type: 'binary'
    180. });
    181. saveAs(new Blob([s2ab(wbout)], {
    182. type: "application/octet-stream"
    183. }), `${filename}.${bookType}`);
    184. }