TS 实现Excel 导出功能

本文介绍了如何使用TypeScript创建一个功能强大的导出Excel表格的工具类,包括TableHeadInfo接口定义表头,ExportExcel类处理数据导出,以及FormatCTX和相关方法如下载和生成base64字符串。

工具类:

export interface TableHeadInfo<T> {
  key: T;
  label: string
}

export interface ExportExcelParams<T extends { [key: string]: any }> {
  headInfo: TableHeadInfo<keyof T>[],
  data: T[],
  tableName: string
}

export interface FormatCTX {
  worksheet: string | 'Worksheet';
  table: string
}

export class ExportExcel<T extends { [key: string]: any }> {
  private uri: string = 'data:application/vnd.ms-excel;base64,';
  private template: string = `<html><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><body><table  border="1">{table}</table></body></html>`;

  constructor() { };
  public export(params: ExportExcelParams<T>) {
    const { headInfo, data, tableName } = params;
    const head: string = this.getHead(headInfo);
    const body: string = this.getBody(headInfo, data);
    const table: string = head + body
    this.downloadExcel(table, tableName)
  };
  //导出excel
  private downloadExcel(tableData: string, tableName: string) {
    const ctx: FormatCTX = {
      worksheet: tableName || 'Worksheet',
      table: tableData
    }
    let a: HTMLAnchorElement = document.createElement("a");
    a.href = this.uri + this.base64(this.format(ctx))
    a.download = tableName || 'excel' + '.xlsx';
    a.click();
  }
  //获取table头部信息
  private getHead(headInfo: TableHeadInfo<keyof T>[]): string {
    let head = '<tr>';
    headInfo.forEach((item, index) => {
      head += `<th style="width:200px;text-align:center;font-size:18px">${item.label}</th>`
      if (index == headInfo.length - 1) {
        head += "</tr>"
      }
    })
    return head;
  };
  //获取table内容
  private getBody(headInfo: TableHeadInfo<keyof T>[], data: ExportExcelParams<T>["data"]): string {
    let body: string = "";
    data.forEach((item) => {

      headInfo.forEach((hitem, hindex) => {
        if (hindex == 0) {
          body += '<tr>'
        }
        body += `<td style="text-align:center;font-size:18px;mso-number-format:'\@'">${(item[hitem.key] || item[hitem.key] === 0) ? item[hitem.key].toString() : ''}</td>`
        if (hindex == headInfo.length - 1) {
          body += "</tr>"
        }
      })
    })
    return body;
  };
  private format(ctx: FormatCTX): string {
    return this.template.replace(/{(\w+)}/g, function (m, p) {
      return ctx[p as keyof (FormatCTX)] as string;
    })
  };
  //转base64
  private base64(str: string): string {
    //API 将字符串转换为一个 Uint8Array 类型的数据
    const encoder = new TextEncoder();
    const data = encoder.encode(str);
    //btoa 函数只针对 Latin1 字符集
    return btoa(String.fromCharCode(...data))
  };
}

使用示例:

interface Data {
  x: string,
  y: string
}
let exportExcel = new ExportExcel<Data>()
exportExcel.export({
  headInfo: [{ key: "x", label: "X" }, { key: "y", label: "Y" }],
  data: [{ x: "1", y: "2" }],
  tableName: "坐标位置"
})
### 实现导出 Excel 功能 为了在 Vue 3 和 TypeScript 环境下实现导出 Excel 文件的功能,可以采用多种库和技术栈组合。一种常见的方式是结合 `xlsx` 库和其他必要的支持库一起工作。 #### 准备环境 确保安装了所需的 npm 包: ```bash npm install xlsx xlsx-js-style stream-saver jszip --save ``` 这些包提供了创建和样式化 Excel 文档的能力,并解决了浏览器环境中缺少流处理的问题[^2]。 #### 创建导出服务 定义一个用于导出数据的服务模块,该模块负责将表格数据转换成 Excel 文件并触发下载行为。下面是一个简单的例子说明如何构建这样的服务: ```typescript // src/services/exportService.ts import * as XLSX from 'xlsx'; import { saveAs } from 'file-saver'; export interface HeaderMap { [key: string]: string; } export const exportDataTableToExcel = ( dataTable: any[], fileName: string, headerMap?: HeaderMap ): void => { let wsName = "SheetJS"; let wb: XLSX.WorkBook; // 构建表头映射关系 if (headerMap) { Object.keys(headerMap).forEach(key => { dataTable.forEach(item => item[key] = item[headerMap[key]]); }); } // 将 JSON 数据转为 worksheet 对象 var ws_data = dataTable.map(row => Object.values(row) ); // 插入列名作为首行 if (Object.keys(dataTable[0]).length > 0){ ws_data.unshift(Object.keys(dataTable[0])); } var ws = XLSX.utils.aoa_to_sheet(ws_data); wb = new Workbook(); wb.SheetNames.push(wsName); wb.Sheets[wsName] = ws; /* generate file and send to client */ XLSX.writeFile(wb, `${fileName}.xlsx`); }; ``` 此代码片段展示了如何通过给定的数据列表 (`dataTable`) 及其对应的头部名称映射 (`headerMap`) 来生成 Excel 文件[^1]。 #### 组件内调用导出逻辑 当用户交互事件发生时(比如点击按钮),可以在组件内部调用上述定义的方法完成实际的导出操作: ```javascript <template> <!-- ... --> <el-button @click="handleExport">导出</el-button> <!-- ... --> </template> <script lang="ts"> import { defineComponent } from 'vue'; import { exportDataTableToExcel } from '@/services/exportService'; export default defineComponent({ name: 'YourComponent', methods: { handleExport() { const data = this.yourDataList; // 假设这是要导出的数据源 const headers = {}; // 如果有自定义字段则设置这里 const filename = 'your_file_name'; exportDataTableToExcel(data, filename, headers); }, }, }); </script> ``` 以上就是基于 Vue 3 和 TypeScript 的环境下实现导出 Excel 文件的一个基本流程介绍[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值