在很多时候我们需要将 Table 的数据导出成对应的Excel,将数据提出出来

    在这里要说明几点:

    • 如果导出的Table表的数据时,表格的数据量不建议过大
    • 可以导出多个Excel表的形式
    • 同时支持链接下载的形式

    这里就不过多的介绍了,我们来看看 导出的数据是怎么样的~
    image.png

    在这里数据共有100条,我将前10和后90的数据分离出来,方便演示~
    image.png
    image.png

    位置:src/utils/Method/tools/ExportExcel.ts

    1. import XLSX from 'xlsx';
    2. import { message } from 'antd';
    3. interface exportProps {
    4. headers: Array<any>,
    5. data: Array<any>,
    6. sheetName: string
    7. }
    8. /**
    9. * @module ExportExcel 导出组件(配合Ant design pro 中的Table做导出)
    10. *
    11. * @param sheets 可数组 可字符串(为字符串时,将文档的地址传传入)为数组时有以下参数
    12. * @param fileName 导出的文件名
    13. *
    14. * @sheets
    15. * @param headers 表头,对应 tableList, data 数据源,
    16. * @param data 数据源,列表返回的数据源
    17. * @param sheetName 导出表对应的名字
    18. * 格式:[{ headers: columns, data: dataSource, sheetName: "导出文件" }]
    19. */
    20. const ExportExcel = (sheets: exportProps[] | string, fileName:string= 'Excel文件') => {
    21. if(typeof sheets === 'string'){
    22. window.location.href = sheets
    23. return
    24. }
    25. if(!Array.isArray(sheets)) return message.error('请返回对应的数组或者下载地址!')
    26. const getPostition = (index:number) => {
    27. let result = String.fromCharCode(65 + parseInt(String(index % 26)));
    28. let value = index / 26;
    29. while (value >= 1) {
    30. result = String.fromCharCode(65 + parseInt(String(value % 26 - 1))) + result;
    31. value = parseInt(String(value / 26));
    32. }
    33. return result;
    34. }
    35. const getColWidth = (headers: Array<any>, dataArr:Array<any>) => {
    36. const allWch = [headers,].concat(dataArr).map(item => item.map(val => {
    37. let value = val.title || val.content || "";
    38. let length = 10;
    39. if (value) {
    40. if (value.toString().charCodeAt(0) > 255) {
    41. length = value.toString().length * 2;
    42. } else {
    43. length = value.toString().length;
    44. }
    45. }
    46. return {
    47. 'wpx': length < 40 ? length * 10 : 40 * 10,
    48. };
    49. }))
    50. let colWidth = allWch[0];
    51. for (let i = 1; i < allWch.length; i++) {
    52. for (let j = 0; j < allWch[i].length; j++) {
    53. if (colWidth[j]['wpx'] < allWch[i][j]['wpx']) {
    54. colWidth[j]['wpx'] = allWch[i][j]['wpx'];
    55. }
    56. }
    57. }
    58. return colWidth;
    59. }
    60. const sheetsArr = sheets.map(sheet => {
    61. const _headers = sheet.headers
    62. .map((item, i) => Object.assign({}, { key: item.key, title: item.title, position: getPostition(i) + 1 }))
    63. .reduce((prev, next) => Object.assign({}, prev, { [next.position]: { key: next.key, v: next.title } }), {});
    64. const dataArr = sheet.data
    65. .map((item, i) => sheet.headers.map((head, j) => {
    66. let content = ""
    67. if (head.render) {
    68. content = head.render(item[head.dataIndex], item)
    69. } else {
    70. content = item[head.dataIndex]
    71. }
    72. return { content, position: getPostition(j) + (i + 2) }
    73. }
    74. ));
    75. // 对刚才的结果进行降维处理(二维数组变成一维数组)
    76. const _data = dataArr.reduce((prev, next) => prev.concat(next))
    77. // 转换成 worksheet 需要的结构
    78. .reduce((prev, next) => Object.assign({}, prev, { [next.position]: { v: next.content } }), {});
    79. // 合并 headers 和 data
    80. const output = Object.assign({}, _headers, _data);
    81. // 获取所有单元格的位置
    82. const outputPos = Object.keys(output);
    83. // 计算出范围 ,["A1",..., "H2"]
    84. const ref = `${outputPos[0]}:${outputPos[outputPos.length - 1]}`;
    85. return Object.assign(
    86. { sheetName: sheet.sheetName },
    87. output,
    88. {
    89. '!ref': ref,
    90. '!cols': getColWidth(sheet.headers, dataArr),
    91. },
    92. )
    93. })
    94. const sheetNames = sheetsArr.map(sheet => sheet.sheetName);
    95. const wbSheets = sheetsArr.reduce((prev, next) => Object.assign({}, prev, { [next.sheetName]: next }), {});
    96. const wb = {
    97. SheetNames: sheetNames,
    98. Sheets: wbSheets,
    99. };
    100. XLSX.writeFile(wb, fileName + ".xlsx");
    101. }
    102. export default ExportExcel;

    调用

    1. import { Method } from '@/utils';
    2. Method.ExportExcel([
    3. {headers: columns, data: Top10File, sheetName: "前10数据"},
    4. {headers: columns, data: File, sheetName: "后90条数据" },
    5. ],'自定义导出组件')

    具体代码请看:Excel导出