VUE3 关于XLSX导出表格 全数字的字符串格式会转变数字格式导致精度丢失

安装:npm install xlsx

import * as XLSX from "xlsx";





//直接导出
const exportTableRef = ref(null);
const exportBtn = () => {
  const tableDom = exportTableRef.value?.$el;
  if (!tableDom) {
    return;
  }
  
  const wb = XLSX.utils.table_to_book(tableDom);
  XLSX.writeFile(wb, '表格数据.xlsx');
};
——————————————————————————————————————————




// 导出
/*
(注意这里有一个坑,如果直接导出(见上方代码段)的话 会出现识别错误 
 例如身份证号码 字符串类型但全是数字 导出后就会出现把身份证号码变成数字 导致精度丢失)
 故使用以下方法解决
 ——www
*/
const exportTableRef = ref(null);
const exportBtn = () => {
  const tableDom = exportTableRef.value?.$el;
  if (!tableDom) {
    return;
  }

  // 获取表头数据
  const theadRow = tableDom.querySelector('thead tr');
  const headerData = [];
  const headerCells = theadRow.querySelectorAll('th');
  headerCells.forEach(cell => {
    headerData.push({ t: 's', v: cell.textContent.trim() });
  });

  // 获取表格数据
  const tbodyRows = tableDom.querySelectorAll('tbody tr');
  const bodyData = [];

  // 遍历表格行
  tbodyRows.forEach(row => {
    const rowData = [];
    const cells = row.querySelectorAll('td');

    // 遍历表格单元格
    cells.forEach(cell => {
      // 检查单元格内容是否全为数字
      const cellContent = cell.textContent.trim();
      if (/^-?\d+$/.test(cellContent)) {
        // 如果是纯数字,则将数据类型设置为字符串
        rowData.push({ t: 's', v: cellContent });
      } else {
        rowData.push({ t: 's', v: cellContent });
      }
    });

    bodyData.push(rowData);
  });

  // 创建工作簿
  const ws = XLSX.utils.aoa_to_sheet([headerData, ...bodyData]);
  const wb = XLSX.utils.book_new();
  XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');
  // console.log(`output->wb`, wb)
  // 删除操作列
  delete wb.Sheets.Sheet1.O1;//注意是字母
  delete wb.Sheets.Sheet1.O2;
  delete wb.Sheets.Sheet1.O3;
  // 保存文件
  XLSX.writeFile(wb, '表格数据.xlsx');
};
<el-button style="margin-bottom: 10px" @click="exportBtn">导出表格</el-button>
<el-table ref="exportTableRef" :data="arr.rows" border style="width: 100%" table-layout="auto">
<el-table-column prop="IDcard" label="身份证号码" />
……
</el-table>

对了还有一个导入

// 导入
function chooseExcel(e) {
  const files = e.target.files;
  if (files.length <= 0) {
    return false;
  } else if (!/\.(xls|xlsx)$/.test(files[0].name.toLowerCase())) {
    ElMessage({
      message: "上传格式不正确,请上传xls或者xlsx格式!",
      type: "error",
    });
    return false;
  }
  // 读取表格数据
  const fileReader = new FileReader();
  fileReader.onload = function (ev) {
    const workbook = XLSX.read(ev.target.result, {
      type: "binary",
      cellDates: true,
    });
    const wsname = workbook.SheetNames[0];
    const ws = XLSX.utils.sheet_to_json(workbook.Sheets[wsname]);
    dealExcel(ws);
  };
  fileReader.readAsBinaryString(files[0]);
}
//对导入的表格 字段做处理 例把身份证号码改为IDcard
function dealExcel(ws) {
  let exmap = {
    身份证号码: "IDcard",
  };
  if (ws != null && ws.length > 0) {
    // 处理时间格式
  }
  ws.forEach(function (sourceObj) {
    Object.keys(sourceObj).map(function (keys) {
      let newKey = exmap[keys];
      if (newKey) {
        sourceObj[newKey] = sourceObj[keys];
        delete sourceObj[keys];
      }
    });
  });
  console.log(`output->ws`, ws)
  // 上传数据库 批量上传 任务队列
  这个还在写……
}
<input type="file" accept=".xls,.xlsx" @change="chooseExcel($event)" />

不知道其他人有没有遇到过这个问题,看似困难实际上总有办法解决。
因为我刚接触xlsx这个工具,缺乏详细的了解,如果有更好的解决办法,欢迎留言。
附xlsx官网:xlsx-npm
请添加图片描述

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Vue中使用XLSX导出嵌套表格,您需要安装和导入XLSX插件。XLSX插件支持将数据导出为Excel文件。以下是一些步骤: 1. 安装XLSX插件: ``` npm install xlsx ``` 2. 在Vue组件中导入XLSX: ``` import XLSX from 'xlsx' ``` 3. 创建一个方法来导出表格: ``` exportTable() { const wb = XLSX.utils.book_new() // 创建一个名为“Sheet1”的工作表 const ws1 = XLSX.utils.json_to_sheet(this.tableData) // 创建一个名为“Sheet2”的工作表 const ws2 = XLSX.utils.json_to_sheet(this.nestedTableData) // 将工作表添加到工作簿中 XLSX.utils.book_append_sheet(wb, ws1, 'Sheet1') XLSX.utils.book_append_sheet(wb, ws2, 'Sheet2') // 将工作簿转换为二进制文件 const wbout = XLSX.write(wb, {bookType: 'xlsx', type: 'binary'}) // 下载Excel文件 saveAs(new Blob([s2ab(wbout)], {type: 'application/octet-stream'}), 'table.xlsx') } ``` 在这个例子中,我们创建了两个工作表(`ws1`和`ws2`),并将它们添加到工作簿中。我们使用`XLSX.write`方法将工作簿转换为二进制文件,然后将其下载到本地计算机。 4. 创建一个辅助函数`s2ab`,用于将字符串转换为ArrayBuffer: ``` function s2ab(s) { const buf = new ArrayBuffer(s.length) const view = new Uint8Array(buf) for (let i=0; i<s.length; i++) view[i] = s.charCodeAt(i) & 0xFF return buf } ``` 这个函数将字符串转换为ArrayBuffer,以便我们可以将其下载为Excel文件。 5. 添加一个按钮或其他触发器,以调用`exportTable`方法: ``` <button @click="exportTable">Export Table</button> ``` 以上是使用XLSX导出表格嵌套表格的基本步骤。您可以根据需要修改代码,以适应您的应用程序需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值