import * as XLSX from "xlsx";
import dayjs from "dayjs";
// 导入数据
const importExcel = e => {
  return new Promise(resolve => {
    let fileObj = {};
    if (e.target) {
      fileObj = e.target.files[0];
    } else {
      fileObj = e;
    }
    // FileReader 对象就是专门操作二进制数据，主要用于将文件内容读入内存
    const fileReader = new FileReader();
    // .readAsArrayBuffer 读取制定的Bolb 或 File内容
    fileReader.readAsArrayBuffer(fileObj);
    fileReader.onload = event => {
      const fileData = event.target.result;
      // 从电子表格字节中提取数据
      const workbook = XLSX.read(fileData, {
        type: "binary"
      });
      // 按选项卡顺序列出工作表名称
      const wsname = workbook.SheetNames[0];
      // 从工作表创建JS值数组
      const sheetJson = XLSX.utils.sheet_to_json(workbook.Sheets[wsname]);
      sheetJson.forEach((item, index) => {
        if (item.导出时间) {
          sheetJson.splice(index, 1);
        }
      });
      resolve(sheetJson);
    };
  });
};
function getCellWidth(value) {
  // 判断是否为null或undefined
  if (value == null) {
    return 10;
  } else if (/.*[\u4e00-\u9fa5]+.*$/.test(value)) {
    // 中文的长度
    const chineseLength = value.match(/[\u4e00-\u9fa5]/g).length;
    // 其他不是中文的长度
    const otherLength = value.length - chineseLength;
    return chineseLength * 2.1 + otherLength * 1.1;
  } else {
    return value.toString().length * 1.1;
  }
}
// 导出全部数据;
const exportAllExcel = data => {
  // 添加导出时间
  data.list.push({
    导出时间: dayjs(new Date()).format("YYYY-MM-DD HH:mm:ss")
  });
  const colWidths = [],
    colNames = Object.keys(data.list[0]);
  data.list.forEach(row => {
    // 列序号
    let index = 0;
    // 遍历列
    for (const key in row) {
      if (colWidths[index] == null) colWidths[index] = [];
      colWidths[index].push(getCellWidth(row[key]));
      index++;
    }
  });
  const wb = XLSX.utils.book_new();
  const ws = XLSX.utils.json_to_sheet(data.list);
  ws["!cols"] = [];
  // 每一列取最大值最为列宽
  colWidths.forEach((widths, index) => {
    // 计算列头的宽度
    widths.push(getCellWidth(colNames[index]));
    // 设置最大值为列宽
    ws["!cols"].push({ wch: Math.max(...widths) });
  });
  XLSX.utils.book_append_sheet(wb, ws, data.ws_name);
  XLSX.writeFile(wb, data.fileName);
};
// 匹配标题项;
const matchTitle = (list, columns, prop, label) => {
  const newlist = []; //新数组
  list.forEach(item => {
    const newobj = {}; //新数组里的新对象
    for (const key in item) {
      columns.forEach(obj => {
        if (key === obj[prop]) {
          newobj[obj[label]] = item[key]; //key值替换
        }
      });
    }
    newlist.push(newobj);
  });
  return newlist;
};
export { importExcel, exportAllExcel, matchTitle };
