import XLSX2 from "xlsx";
import XLSX from "xlsx-style";
const workbook2blob = (workbook) => {
  // 生成excel的配置项
  let wopts = {
    // 要生成的文件类型
    bookType: "xlsx",
    // 是否生成Shared String Table，官方解释是，如果开启生成速度会下降，但在低版本IOS设备上有更好的兼容性
    bookSST: false,
    type: "binary"
  };
  let wbout = XLSX.write(workbook, wopts);
  // 将字符串转ArrayBuffer
  function s2ab(s) {
    let buf = new ArrayBuffer(s.length);
    let view = new Uint8Array(buf);
    for (let i = 0; i !== s.length; ++i) view[i] = s.charCodeAt(i) & 0xff;
    return buf;
  }
  let buf = s2ab(wbout);
  let blob = new Blob([buf], {
    type: "application/octet-stream"
  });
  return blob;
};
// 将blob对象 创建bloburl,然后用a标签实现弹出下载框
const openDownloadDialog = (blob, fileName) => {
  if (typeof blob === "object" && blob instanceof Blob) {
    blob = URL.createObjectURL(blob); // 创建blob地址
  }
  let aLink = document.createElement("a");
  aLink.href = blob;
  // HTML5新增的属性，指定保存文件名，可以不要后缀，注意，有时候 file:///模式下不会生效
  aLink.download = fileName || "";
  let event;
  if (window.MouseEvent) event = new MouseEvent("click");
  //   移动端
  else {
    event = document.createEvent("MouseEvents");
    event.initMouseEvent(
      "click",
      true,
      false,
      window,
      0,
      0,
      0,
      0,
      0,
      false,
      false,
      false,
      false,
      0,
      null
    );
  }
  aLink.dispatchEvent(event);
};
/**
 * 导出Excel表格
 * @param sheetListInfo sheet列表信息 [{list:数组数据, name: sheet名称}]
 * @param excelName Excel表格名称
 */
export const exportToExcel = (sheetListInfo, excelName) => {
  const wb = XLSX2.utils.book_new();
  sheetListInfo.forEach((sheetItem, sheetIndex) => {
    sheetItem.list.forEach((item) => {
      for (const key in item) {
        item[key] = item[key] || "";
      }
    });
    const sheet = XLSX2.utils.json_to_sheet(sheetItem.list);
    // 设置每个单元格的样式
    let range = XLSX.utils.decode_range(sheet["!ref"]);
    for (let R = range.s.r; R <= range.e.r; ++R) {
      for (let C = range.s.c; C <= range.e.c; ++C) {
        let cell_ref = XLSX.utils.encode_cell({ r: R, c: C });
        let cell = sheet[cell_ref];
        if (cell) {
          if (!cell.s) cell.s = {};
          cell.s.alignment = { horizontal: "center", vertical: "middle" };
        }
      }
    }
    XLSX2.utils.book_append_sheet(
      wb,
      sheet,
      sheetItem.name || `sheet${sheetIndex + 1}`
    );
  });
  const workbookBlob = workbook2blob(wb);
  // 导出最后的总表
  openDownloadDialog(workbookBlob, excelName + ".xlsx");
};
