• Vue2+elementui项目导出el-table的数据为xlsx表格


    1、安装3个插件 (file-saver、 xlsx、script-loader)

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

    2、在utils目录下新建一个 Export2Excel.js 脚本 (我的路径在@/utils/Export2Excel.js)

    1. /* eslint-disable */
    2. import { saveAs } from "file-saver";
    3. // import XLSX from 'xlsx'
    4. import * as XLSX from "xlsx";
    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 (
    22. R >= range.s.r &&
    23. R <= range.e.r &&
    24. outRow.length >= range.s.c &&
    25. outRow.length <= range.e.c
    26. ) {
    27. for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);
    28. }
    29. });
    30. //Handle Row Span
    31. if (rowspan || colspan) {
    32. rowspan = rowspan || 1;
    33. colspan = colspan || 1;
    34. ranges.push({
    35. s: {
    36. r: R,
    37. c: outRow.length,
    38. },
    39. e: {
    40. r: R + rowspan - 1,
    41. c: outRow.length + colspan - 1,
    42. },
    43. });
    44. }
    45. //Handle Value
    46. outRow.push(cellValue !== "" ? cellValue : null);
    47. //Handle Colspan
    48. if (colspan) for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
    49. }
    50. out.push(outRow);
    51. }
    52. return [out, ranges];
    53. }
    54. function datenum(v, date1904) {
    55. if (date1904) v += 1462;
    56. var epoch = Date.parse(v);
    57. return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
    58. }
    59. function sheet_from_array_of_arrays(data, opts) {
    60. var ws = {};
    61. var range = {
    62. s: {
    63. c: 10000000,
    64. r: 10000000,
    65. },
    66. e: {
    67. c: 0,
    68. r: 0,
    69. },
    70. };
    71. for (var R = 0; R != data.length; ++R) {
    72. for (var C = 0; C != data[R].length; ++C) {
    73. if (range.s.r > R) range.s.r = R;
    74. if (range.s.c > C) range.s.c = C;
    75. if (range.e.r < R) range.e.r = R;
    76. if (range.e.c < C) range.e.c = C;
    77. var cell = {
    78. v: data[R][C],
    79. };
    80. if (cell.v == null) continue;
    81. var cell_ref = XLSX.utils.encode_cell({
    82. c: C,
    83. r: R,
    84. });
    85. if (typeof cell.v === "number") cell.t = "n";
    86. else if (typeof cell.v === "boolean") cell.t = "b";
    87. else if (cell.v instanceof Date) {
    88. cell.t = "n";
    89. cell.z = XLSX.SSF._table[14];
    90. cell.v = datenum(cell.v);
    91. } else cell.t = "s";
    92. ws[cell_ref] = cell;
    93. }
    94. }
    95. if (range.s.c < 10000000) ws["!ref"] = XLSX.utils.encode_range(range);
    96. return ws;
    97. }
    98. function Workbook() {
    99. if (!(this instanceof Workbook)) return new Workbook();
    100. this.SheetNames = [];
    101. this.Sheets = {};
    102. }
    103. function s2ab(s) {
    104. var buf = new ArrayBuffer(s.length);
    105. var view = new Uint8Array(buf);
    106. for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xff;
    107. return buf;
    108. }
    109. // 该方法负责将数组转化成二维数组
    110. export function formatJson(headers, rows) {
    111. //首先遍历数组
    112. return rows.map((item) => {
    113. // item是对象 => 转化成只有值的数组 => 数组值的顺序依赖headers {username: '张三' }
    114. // Object.keys(headers) => ["姓名", "手机号",...]
    115. return Object.keys(headers).map((key) => {
    116. return item[headers[key]]; // 得到 ['张三',’129‘,’dd‘,'dd']
    117. });
    118. });
    119. }
    120. export function export_table_to_excel(id) {
    121. var theTable = document.getElementById(id);
    122. var oo = generateArray(theTable);
    123. var ranges = oo[1];
    124. /* original data */
    125. var data = oo[0];
    126. var ws_name = "SheetJS";
    127. var wb = new Workbook(),
    128. ws = sheet_from_array_of_arrays(data);
    129. /* add ranges to worksheet */
    130. // ws['!cols'] = ['apple', 'banan'];
    131. ws["!merges"] = ranges;
    132. /* add worksheet to workbook */
    133. wb.SheetNames.push(ws_name);
    134. wb.Sheets[ws_name] = ws;
    135. var wbout = XLSX.write(wb, {
    136. bookType: "xlsx",
    137. bookSST: false,
    138. type: "binary",
    139. });
    140. saveAs(
    141. new Blob([s2ab(wbout)], {
    142. type: "application/octet-stream",
    143. }),
    144. "test.xlsx"
    145. );
    146. }
    147. export function export_json_to_excel({
    148. multiHeader = [],
    149. header,
    150. data,
    151. filename,
    152. merges = [],
    153. autoWidth = true,
    154. bookType = "xlsx",
    155. } = {}) {
    156. /* original data */
    157. filename = filename || "excel-list";
    158. data = [...data];
    159. data.unshift(header);
    160. for (let i = multiHeader.length - 1; i > -1; i--) {
    161. data.unshift(multiHeader[i]);
    162. }
    163. var ws_name = "SheetJS";
    164. var wb = new Workbook(),
    165. ws = sheet_from_array_of_arrays(data);
    166. if (merges.length > 0) {
    167. if (!ws["!merges"]) ws["!merges"] = [];
    168. merges.forEach((item) => {
    169. ws["!merges"].push(XLSX.utils.decode_range(item));
    170. });
    171. }
    172. if (autoWidth) {
    173. /*设置worksheet每列的最大宽度*/
    174. const colWidth = data.map((row) =>
    175. row.map((val) => {
    176. /*先判断是否为null/undefined*/
    177. if (val == null) {
    178. return {
    179. wch: 10,
    180. };
    181. } else if (val.toString().charCodeAt(0) > 255) {
    182. /*再判断是否为中文*/
    183. return {
    184. wch: val.toString().length * 2,
    185. };
    186. } else {
    187. return {
    188. wch: val.toString().length,
    189. };
    190. }
    191. })
    192. );
    193. /*以第一行为初始值*/
    194. let result = colWidth[0];
    195. for (let i = 1; i < colWidth.length; i++) {
    196. for (let j = 0; j < colWidth[i].length; j++) {
    197. if (result[j]["wch"] < colWidth[i][j]["wch"]) {
    198. result[j]["wch"] = colWidth[i][j]["wch"];
    199. }
    200. }
    201. }
    202. ws["!cols"] = result;
    203. }
    204. /* add worksheet to workbook */
    205. wb.SheetNames.push(ws_name);
    206. wb.Sheets[ws_name] = ws;
    207. var wbout = XLSX.write(wb, {
    208. bookType: bookType,
    209. bookSST: false,
    210. type: "binary",
    211. });
    212. saveAs(
    213. new Blob([s2ab(wbout)], {
    214. type: "application/octet-stream",
    215. }),
    216. `${filename}.${bookType}`
    217. );
    218. }

    3、在vue组件中使用

    <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExportCheckedRows">导出el-button>
    1. /* 按需导出 */
    2. handleExportCheckedRows(){
    3. // 需要时再导入
    4. import('@/utils/Export2Excel').then(excel => {
    5. let headers = {
    6. "信息1": "info1",
    7. "信息2": "info2",
    8. "信息3": "info3",
    9. "信息4": "info4",
    10. };
    11. let data = [
    12. {
    13. "info1": 1,
    14. "info2": 2,
    15. "info3": 3,
    16. "info4": 4,
    17. },
    18. {
    19. "info1": 5,
    20. "info2": 6,
    21. "info3": 7,
    22. "info4": 8,
    23. },
    24. {
    25. "info1": 9,
    26. "info2": 10,
    27. "info3": 11,
    28. "info4": 12,
    29. },
    30. ]
    31. let finalData = excel.formatJson(headers, data);
    32. excel.export_json_to_excel({
    33. header: Object.keys(headers), //表头 必填
    34. data: finalData, //具体数据 必填
    35. filename: `表名`, //非必填
    36. autoWidth: true, //非必填
    37. bookType: 'xlsx' //非必填
    38. })
    39. })
    40. },

    4、导出效果如下

    5、附加链接 el-table,勾选行,切到其他页码又切回来,如何自动勾选之前选过的行-CSDN博客

  • 相关阅读:
    linux入门6—日志分析与故障排除
    作用域和作用域链
    【电路笔记】-星三角变换(Star-Delta Transformation)
    交换机的三层交换技术
    P3613 【深基15.例2】寄包柜
    【@EnableWebMvc的原理】
    git简易入门教学
    Matlab中关于 : 的使用
    CleanMyMac X真正好用的Mac电脑系统优化软件应用工具
    mysql在ubuntu上命令行登陆密码不正确
  • 原文地址:https://blog.csdn.net/RumbleWx/article/details/134265886