前端导入导出excel

导入

  const inputFileChange = () => {
    document.getElementById(`fileInput`).addEventListener('change', inputFileChangeDeal);
  };
    const inputFileChangeDeal = (e) => {
    const files = e.target.files;
    if (files.length == 0) return;
    var f = files[0];
    if (!/\.xlsx$/g.test(f.name)) {
      alert('仅支持读取xlsx格式!');
      return;
    }
    readWorkbookFromLocalFile(f, function (workbook) {
    // excel里的json数据
      const data = readWorkbook(workbook);
    });
  };
  const readWorkbookFromLocalFile = (file, callback) => {
  const reader = new FileReader();
  reader.onload = function (e) {
    const data = e.target.result;
    const workbook = XLSX.read(data, { type: 'buffer' });
    if (callback) callback(workbook);
  };
  reader.readAsArrayBuffer(file);
};

 const readWorkbook = (workbook) => {
  const sheetNames = workbook.SheetNames; // 工作表名称集合
  const worksheet = workbook.Sheets[sheetNames[0]]; // 这里我们只读取第一张sheet
  const headers = get_header_row(worksheet);
  const workBookData = XLSX.utils.sheet_to_json(worksheet);
  return { workBookData, headers };
};

const get_header_row = (sheet) => {
  const headers = [];
  const range = XLSX.utils.decode_range(sheet['!ref']);
  let C,
    R = range.s.r; /* 从第一行开始 */
  /* 按列进行数据遍历 */
  for (C = range.s.c; C <= range.e.c; C += 1) {
    /* 查找第一行中的单元格 */
    const cell = sheet[XLSX.utils.encode_cell({ c: C, r: R })];
    let hdr = 'UNKNOWN ' + C; // <-- 进行默认值设置
    if (cell && cell.t) hdr = XLSX.utils.format_cell(cell);
    headers.push(hdr);
  }
  return headers;
};
  {/* 元素 */}
        <input
        type="file"
        id='fileInput'
        style={{ display: 'none' }}
        accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
        ref={inputEl}
      />
      // inputEl.current.value = ''; change事件后记得清空input的值,否则两次导入同一文件无法触发

导出

export const handleExport = (aoa, aoaHeader) => {
  // aoa就是一个需要导出的数据的数组对象类似于[{a:x1},{a:x2}]
  // 导出的内容,即第二行开始的所有数据
  // let aoa = saveList.map((item) => {
  //   return {
  //     产品编号: item.ebIds,
  //     产品名称: item.ebName,
  //     产品型号: item.ebModelName,
  //   };
  // });
  // 导出的标题,即第一行数据
  //  let aoaHeader = [
  //    "产品编号",
  //    "产品名称",
  //    "产品型号",
  //    "批次",
  //    "配置传感器",
  //    "是否激活",
  //    "是否过期",
  //  ];
  // index.html引入了文件XLSX就能找到,更多接口查看官方文档
  const sheet = XLSX.utils.json_to_sheet(aoa, { header: aoaHeader });
  openDownloadDialog(sheet2blob(sheet), '导出数据.xlsx');
};
/**
 * 通用的打开下载对话框方法,没有测试过具体兼容性
 * @param url 下载地址,也可以是一个blob对象,必选
 * @param saveName 保存文件名,可选
 */
export const openDownloadDialog = (url, saveName) => {
  if (!!window.ActiveXObject || 'ActiveXObject' in window) {
    //兼容 判断是不是ie的浏览器
    window.navigator.msSaveOrOpenBlob(url, saveName);
  } else {
    const downloadElement = document.createElement('a');
    const href = window.URL.createObjectURL(url);
    downloadElement.href = href;
    downloadElement.download = saveName;
    document.body.appendChild(downloadElement);
    downloadElement.click();
    document.body.removeChild(downloadElement); // 下载完成移除元素
    window.URL.revokeObjectURL(href); // 释放掉blob对象
  }
};

为什么写的那么丑,ps:写给自己看的,所以看着是垃圾

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值