前端表格数据导出为 Excel 的简单方法

方法一

/**
 * 导出表格数据到 Excel 文件
 * @param {Array} tableData - 表格数据
 * @param {Array} fieldLabels - 表头组成的数组
 * @param {Array} fieldKeys - 列属性名组成的数组
 * @param {String} fileName - 导出的文件名
 */
function exportExcel(tableData, fieldLabels, fieldKeys, fileName) {
  let dataStr = fieldLabels.toString() + '\r\n';
  tableData.forEach(item => {
      fieldKeys.forEach(key => {
          // 加引号是为了使换行符在单元格内正常显示 
          dataStr += `"${item[key]}"\t,`;
      });
      dataStr += '\r\n';
  });
  
  // encodeURIComponent 解决中文乱码
  const url = "data:text/xls;charset=utf-8,\ufeff" + encodeURIComponent(dataStr);
  const link = document.createElement("a");
  link.href = url;
  link.download = fileName + ".xls";
  link.style.display = 'none';
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link); //释放标签
}

遇到的问题

  • 为了让单元格中的数据不被转换格式(如 过大的数字会被转为科学技术法显示),需要在数据后面加多余的字符,如以上代码的 \t

示例

const tableData = [
          { date: '2016-05-02', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' },
          { date: '2016-05-04', name: '张小星', address: '上海市普陀区金沙江路 1517 弄' },
          { date: '2016-05-01', name: '刘小备', address: '上海市普陀区金沙江路 1519 弄' },
          { date: '2016-05-03', name: '赵小云', address: '上海市普陀区金沙江路 1516 弄' }
      ],
      fieldKeys = ['date', 'name', 'address'],
      fieldLabels = ['日期', '姓名', '地址'],
      fileName = '测试文件';
      
exportExcel(tableData, fieldLabels, fieldKeys, fileName);

方法二

通过 HTML 导出 EXCEL

function exportExcel(tableData, fieldKeys, fieldLabels, fileName){
    // 用于替换数据中的换行符,是其可以在单元格内正常显示
    const wrapMark = '<br style="mso-data-placement:same-cell;"/>';
    
    // 设置单元格数据显示为文本格式,避免过大的数字以科学计数法的形式显示
    const tdTagHeader = `<td style="mso-number-format:'\@'">`;
    
    let dataStr = '<tr>'

    fieldLabels.forEach(label => {
      dataStr += `${tdTagHeader + label}</td>`;
    })

    dataStr += '</tr>';
    tableData.forEach(item => {
        dataStr += '<tr>'
        fieldKeys.forEach(key => {
            // 这种方式本质是导出 html 文件,html 中连续的空格符会被合并成一个显示
            // replace(/ /g, '&nbsp;') 将空格符替换成 &nbsp; 使其可以正常显示
            dataStr += tdTagHeader + `${item[key]}`.replace(/ /g, '&nbsp;').replace(/\n/g, wrapMark) + '</td>';
        });
        dataStr += '</tr>'
    })

    //设置 Worksheet 名
    const workSheet = 'Sheet1'
    
    const template = `<html xmlns:o="urn:schemas-microsoft-com:office:office"
    xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40">
    <head><meta charset="UTF-8" />
    <!--[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><body><table>${dataStr}</table></body></html>`;

    const url = 'data:application/vnd.ms-excel;base64,' + window.btoa(unescape(encodeURIComponent(template))) ;
    const link = document.createElement("a");
    
    link.href = url;
    link.download = fileName + ".xls";
    link.style.display = 'none';
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
}

PS: 由于本质导出的是 HTML 文件,所以为 <td> 、<tr> 标签设置的内联样式也会在 Excel 中正确应用。

遇到的问题

  • 导出的文件用 Office 打开时会提示文件格式与扩展名不匹配的提示,但并不影响文件的正常打开。
  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在前端实现导出数据Excel表格,你可以使用以下方法之一: 1. 使用现有的库或插件:许多JavaScript库和插件可以帮助你在前端导出数据Excel表格,如 `xlsx`、`exceljs`、`FileSaver.js` 等。这些库提供了方便的方法和功能来处理Excel文件的创建和导出。 2. 手动构建Excel文件:你可以使用JavaScript生成Excel文件的格式(如CSV、XML或XLSX)并将其下载到用户的设备上。这需要一些编码工作,但是可以根据你的需求来实现自定义功能。 以下是两种方法的示例: 使用 `xlsx` 库: ```javascript import XLSX from 'xlsx'; function exportToExcel(data, filename) { const workbook = XLSX.utils.book_new(); const worksheet = XLSX.utils.aoa_to_sheet(data); XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); XLSX.writeFile(workbook, filename); } ``` 使用纯JavaScript手动构建Excel文件(CSV格式): ```javascript function exportToExcel(data, filename) { let csv = 'data:text/csv;charset=utf-8,'; data.forEach(row => { csv += row.join(',') + '\n'; }); const encodedUri = encodeURI(csv); const link = document.createElement('a'); link.setAttribute('href', encodedUri); link.setAttribute('download', filename); document.body.appendChild(link); link.click(); document.body.removeChild(link); } ``` 在上述示例中,你需要提供一个二维数组 `data`,其中每个子数组表示一行数据,然后将其传递给 `exportToExcel` 函数以导出Excel表格。 `filename` 参数是要保存的文件名。 请确保在使用这些代码之前,你已经引入了相关的库或插件,或者在手动构建Excel文件时做了必要的修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值