【导入file文件转数组】input -> type=‘file‘ -> list

// 组件 admin文件
// 引用xlsx.js
import { HandleImportFile } from '@/common/xlsx.js'
<input
	class="excel-upload-input"
	type="file"
	@change="Uploads"
/>
Uploads = async (e) => {
	const xlsxList = await HandleImportFile(e)
	console.log(xlsxList, 'xlsx生成list')
}
// 方法 common/xlsx.js文件
import * as XLSX from 'xlsx';
// @ts-nocheck
//解析excel
export let HandleImportFile = (e) => {
  return new Promise((resolve, reject) => {
    let { files } = e.target;
    if (!files.length) return;
    // 获取文件名称
    let name = files[0].name;
    // 获取文件后缀
    let suffix = name.substr(name.lastIndexOf('.'));
    // let list: any = [];
    let reader = new FileReader();
    reader.onload = event => {
      try {
        // 判断文件类型是否正确
        if ('.xls' !== suffix && '.xlsx' !== suffix) {
          // message.error('选择Excel格式的文件导入!');
          alert('仅支持上传xls、xlsx格式的文件!');
          resolve(0);
          return false;
        }
        let data = [];
        let { result } = event.target;
        // 读取文件
        let workbook = XLSX.read(result, { type: 'binary' });
        // 循环文件中的每个表
        for (let sheet in workbook.Sheets) {
          if (workbook.Sheets.hasOwnProperty(sheet)) {
            // 将获取到表中的数据转化为json格式
            // console.log(workbook.Sheets[sheet])
            // console.log(XLSX.utils.sheet_to_json(workbook.Sheets[sheet]))
            data = data.concat(
              XLSX.utils.sheet_to_json(workbook.Sheets[sheet])
            );
          }
        }
        resolve(data);
      } catch (e) {
        alert('文件类型不正确!');
      }
    };
    reader.readAsBinaryString(files[0]);
  });
};
//导出excel
export const DownloadExl = (json, type) => {
  var data = json[0];
  json.unshift({});
  var keyMap = []; //获取keys
  for (var k in data) {
    keyMap.push(k);
    json[0][k] = k;
  }
  var tmpdata = []; //用来保存转换好的json
  json
    .map((v, i) =>
      keyMap.map((k, j) =>
        Object.assign(
          {},
          {
            v: v[k],
            position:
              (j > 25 ? getCharCol(j) : String.fromCharCode(65 + j)) + (i + 1)
          }
        )
      )
    )
    .reduce((prev, next) => prev.concat(next))
    .forEach(
      (v, i) =>
        (tmpdata[v.position] = {
          v: v.v
        })
    );
  var outputPos = Object.keys(tmpdata); //设置区域,比如表格从A1到D10
  var tmpWB = {
    SheetNames: ['mySheet'], //保存的表标题
    Sheets: {
      mySheet: Object.assign(
        {},
        tmpdata, //内容
        {
          '!ref': outputPos[0] + ':' + outputPos[outputPos.length - 1] //设置填充区域
        }
      )
    }
  };
  var tmpDown = new Blob(
    [
      s2ab(
        XLSX.write(
          tmpWB,
          {
            bookType: type ? 'xlsx' : type,
            bookSST: false,
            type: 'binary'
          } //这里的数据是用来定义导出的格式类型
        )
      )
    ],
    {
      type: ''
    }
  ); //创建二进制对象写入转换好的字节流
  var href = URL.createObjectURL(tmpDown); //创建对象超链接
  setTimeout(() => {
    let newTmpDown = tmpDown.toString();
    URL.revokeObjectURL(newTmpDown); //用URL.revokeObjectURL()来释放这个object URL
  }, 100);
  return href;
};
const s2ab = (s) => {
  //字符串转字符流
  var buf = new ArrayBuffer(s.length);
  var view = new Uint8Array(buf);
  // @ts-ignore
  for (var i = 0; i !== s.length; ++i) view[i] = s.charCodeAt(i) & 0xff;
  return buf;
};
// 将指定的自然数转换为26进制表示。映射关系:[0-25] -> [A-Z]。
const getCharCol = (n) => {
  let s = '',
    m = 0;
  while (n > 0) {
    m = (n % 26) + 1;
    s = String.fromCharCode(m + 64) + s;
    n = (n - m) / 26;
  }
  return s;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值