excel文件的导入导出(xlsx插件版)

前言

因需求需要整个excel文件的导入导出,故历经诸多磨难,完成以下代码

注:记得引入xlsx插件,不然应该是运行不起来的

html代码(vue-elementui)
  <div class="upload-center">
    <el-upload
      ref = 'upload'
      class="upload-demo"
      drag
      accept=".xls,.xlsx"
      :show-file-list="false"
      :before-upload="beforeAvatarUpload"
      :on-change="handleUpload"
      :auto-upload="false"
      action="">
      <i class="el-icon-upload"></i>
      <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
      <div class="el-upload__tip" slot="tip">单次上传一个Excel文件</div>
    </el-upload>
  </div>
导入
//在上传之前
    beforeAvatarUpload(file){
      let isXlS = file.type === 'application/vnd.ms-excel';
      let isXlSX = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';

      if (!isXlS && !isXlSX) {
        this.$message({ message: '导入的文件只能是 xls/xlsx 格式', type: 'error' });
        return false;
      }
      return true;
    },
    
    //上传文件的处理
    handleUpload (file,fileList) {
      this.excelJson = readExcel(file);
    },
    
    /**
 * @param {*} file 导入文件-必填
 */
readExcel(file) {
  const types = file.name.split('.')[1];
  const fileType = [
    'xlsx', 'xlc', 'xlm', 'xls', 'xlt', 'xlw', 'csv'
  ].some(item => item == types);
  if (!fileType) {
    alert('格式错误!请重新选择');
    return
  }

  const reader = new FileReader();
  let result = [];
  reader.onload = function (e) {
    const data = e.target.result;
    const wb = XLSX.read(data, {
      type: 'binary'
    });
    wb.SheetNames.forEach((sheetName) => {
      result.push({
        sheetName: sheetName,
        sheet: XLSX.utils.sheet_to_json(wb.Sheets[sheetName])
      })
    });
  };
  reader.readAsBinaryString(file.raw)

  return result;
};
导出
/**
 * @param {*} label 表头-必填-例['编码','编号','备注']
 * @param {*} data 数据-必填-例[['0001','2017001','天'],['0002','2017002','干']],
 * @param {*} sheetName sheet页名
 * @param {*} fileName 文件名称
 * @param {*} fileType 文件类型-暂只使用xlsx,xls
 */
function exportExcel(label, data, sheetName, fileName, fileType) {
  sheetName = sheetName || 'sheet1';
  fileName = fileName || '导出表';
  fileType = fileType || 'xls';
  if (fileType.indexOf("xls") === -1) {
    ElementUI.Message({
      message: '暂不支持此格式,请更改',
      type: 'warning'
    });
    return;
  }
  //组织数据
  data.splice(0, 0, label);
  //组织文件名
  fileName = fileName + new Date().getTime() + "." + fileType;
  //创建新文件
  var newfile = XLSX.utils.book_new();
  //新sheet
  var newfilesheet = XLSX.utils.aoa_to_sheet(data);
  //sheet添加到文件
  XLSX.utils.book_append_sheet(newfile, newfilesheet, sheetName);
  //导出文件
  XLSX.writeFile(newfile, fileName);
};
结语

导入也好,导出也好,都是有瑕疵的,具体优化可依需求而定,但是基本功能是具备的,也不要问为什么导入要搞成字符串,问就是代码是一种妥协的艺术

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值