前端实现导出element-plus表格和从后端获取数据导出,支持勾选导出

06-01 1627阅读

1. 纯前端实现导出

安装file-saver和xlsx

file-saver: 用于在浏览器中触发文件的保存下载(保存为本地文件)。

使用场景: 当已经在 JavaScript 中生成了文件(如 Blob 对象),并想让用户保存它时使用。

npm install file-saver

xlsx: 读写 Excel 文件(.xlsx),支持从数据生成 Excel 文件或从 Excel 文件中解析数据。

使用场景:从前端导出 JSON 为 .xlsx 文件;从 .xlsx 文件中读取数据进行展示或处理。

npm install xlsx

前端实现导出element-plus表格和从后端获取数据导出,支持勾选导出

导出element-plus表格,支持勾选导出,不勾选默认导出全部数据:

只导出勾选项:

前端实现导出element-plus表格和从后端获取数据导出,支持勾选导出

  
    导出
  
  
    
    
    
    
    
      
        
          {{ getStatusText(row.status) }}
        
      
    
  


import { ref, computed } from 'vue';
import * as XLSX from 'xlsx';
import FileSaver from 'file-saver';
const tableData = [
  {
    date: '2016-05-04',
    name: 'Aleyna Kutzner',
    address: 'Lohrbergstr. 86c, Süd Lilli, Saarland',
    status: 0,
  },
  {
    date: '2016-05-03',
    name: 'Helen Jacobi',
    address: '760 A Street, South Frankfield, Illinois',
    status: 1,
  },
  {
    date: '2016-05-02',
    name: 'Brandon Deckert',
    address: 'Arnold-Ohletz-Str. 41a, Alt Malinascheid, Thüringen',
    status: 2,
  },
  {
    date: '2016-05-01',
    name: 'Margie Smith',
    address: '23618 Windsor Drive, West Ricardoview, Idaho',
    status: 1,
  },
];
const mergeRows = ref([]);
const STATUS_TEXT = {
  0: '未处理',
  1: '已处理',
  2: '已取消',
};
const STATUS_TAG_TYPE = {
  0: 'danger',
  1: 'primary',
  2: 'info',
}
const getStatusText = computed(() => status => STATUS_TEXT[status]);
const getStatusTagType = computed(() => status => STATUS_TAG_TYPE[status]);
const handleSelectionChange = selection => {
  mergeRows.value = selection;
};
const handleExport = async (fileName = 'export.xlsx') => {
  const originalData =
    mergeRows.value.length === 0 ? tableData : mergeRows.value;
  const headers = [
    { key: 'date', title: '日期', width: 20 },
    { key: 'name', title: '姓名', width: 30 },
    { key: 'address', title: '地址', width: 60 },
    { key: 'status', title: '状态', width: 20, formatter: getStatusText.value },
  ];
  const data = originalData.map(row =>
    Object.fromEntries(
      headers.map(({ key, title, formatter }) => [
        title,
        formatter ? formatter(row[key]) : row[key],
      ])
    )
  );
  // 生成 Sheet
  const worksheet = XLSX.utils.json_to_sheet(data);
  // 设置列宽
  worksheet['!cols'] = headers.map(({ width }) => ({ wch: width }));
  const workbook = XLSX.utils.book_new();
  XLSX.utils.book_append_sheet(workbook, worksheet);
  // 导出 Excel
  const excelBuffer = XLSX.write(workbook, {
    bookType: 'xlsx',
    type: 'array',
  });
  const blob = new Blob([excelBuffer], { type: 'application/octet-stream' });
  FileSaver.saveAs(blob, fileName);// 浏览器将下载 export.xlsx文件
};

2. 从后端获取数据导出

  1. 情形1:后端返回链接的导出:window.location.href = 链接地址
  2. 情形2:返回二进制/base数据的导出:先将得到的数据转成二进制,再用 new Blob()处理二进制生成文件,使用 createObjectURL() 生成链接,创建 a 标签元素模拟点击事件
async function handleExport() {
  const params = {
    selected_ids: mergeRows.value.map(row => row.id),
  };
  const res = await exportReservation(params);
  if (res.status===200) {
    // 返回的是base64编码
    const fileContent = res.data;
    // base64转为二进制
    const binaryString = atob(fileContent);
    const bytes = new Uint8Array(binaryString.length);
    for (let i = 0; i 
                
                
                
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码