{"version":3,"file":"ExcelUtils.mjs","sources":["../../../../../../../../packages/components/table/src/export/ExcelUtils.ts"],"sourcesContent":["// @ts-nocheck\nimport * as XLSX from 'xlsx-js-style'\n// import XLSX_STYLE from 'xlsx-style'\n// import * as XLSX_STYLE from 'xlsx'\nimport { Coords } from './Coords'\nimport type {\n  CellObject,\n  CellStyle,\n  ColInfo,\n  Range,\n  RowInfo,\n  WorkBook,\n  WorkSheet,\n} from 'xlsx-js-style'\n\nexport class ExcelUtil {\n  //行高\n  private static height = 36\n  //数据行\n  private static dataRow = -1\n  //自动设置列宽\n  private static widthAuto = false\n  //单元格合并列表\n  private static lstRange: Array<Range> = []\n  //列宽列表\n  private static lstColInfo: Array<ColInfo> = []\n  //行高列表\n  private static lstRowInfo: Array<RowInfo> = []\n  //列表冻结\n  private static freezeInfo: Record<string, any> = {}\n  //单元格数据列表\n  private static lstValue: Array<Array<CellObject>> = []\n  //样式列表\n  private static lstCellStyle: Array<CellStyle> = []\n  //移动方向：上、右、下、左\n  private static readonly MOVE: Array<Array<number>> = [\n    [0, 1],\n    [1, 0],\n    [0, -1],\n    [-1, 0],\n  ]\n\n  //根据路径转化Excel表格\n  public static toMap(\n    excelData: string | ArrayBuffer,\n    sheetName: string | number,\n    headerRow?: number,\n    headerCol?: number,\n    headerLastCol?: number,\n    dataRow?: number,\n    dataLastRow?: number,\n    extraData?: Map<string, string>\n  ): Array<Map<string, string>> {\n    const workbook = XLSX.read(excelData, {\n      type: 'binary',\n    })\n    if (typeof sheetName === 'number') {\n      sheetName = workbook.SheetNames[sheetName]\n    }\n    const sheet = workbook.Sheets[sheetName]\n    //表数据转数组数据\n    const sheetJson = <Array<Array<any>>>(\n      XLSX.utils.sheet_to_json(sheet, { header: 1 })\n    )\n    //数据初始化\n    headerRow = headerRow || 0\n    headerCol = headerCol || 0\n    dataRow = dataRow || headerRow + 1\n    this.lstRange = sheet['!merges'] || []\n    dataLastRow = dataLastRow || sheetJson.length\n    extraData = extraData || new Map<string, string>()\n    headerLastCol = headerLastCol || sheetJson[headerRow].length\n\n    //列号列表\n    const lstHeaderCol: Array<number> = []\n    for (let i = headerCol; i < headerLastCol; i++) {\n      lstHeaderCol.push(i)\n    }\n    //行号列表\n    const lstDataRow: Array<number> = []\n    for (let i = dataRow; i < dataLastRow; i++) {\n      lstDataRow.push(i)\n    }\n    return this.getSheetData(\n      sheetJson,\n      headerRow,\n      lstHeaderCol,\n      lstDataRow,\n      extraData\n    )\n  }\n\n  //excel表数据解析\n  private static getSheetData(\n    sheet: Array<Array<any>>,\n    headerRow: number,\n    headerCol: Array<number>,\n    dataRow: Array<number>,\n    extraData: Map<string, string>\n  ): Array<Map<string, string>> {\n    //获取列头与列号的对应关系\n    const mapHeader = new Map<string, number>()\n    for (const col of headerCol) {\n      this.getSheetHeader(sheet, mapHeader, headerRow, col)\n    }\n    //根据列头与列号关系解析表格数据\n    const lstData = new Array<Map<string, string>>()\n    for (const row of dataRow) {\n      const map = this.getSheetBody(sheet, mapHeader, row)\n      if (map.size == 0) continue\n      //添加外部数据\n      extraData.forEach((v, k) => map.set(k, v))\n      lstData.push(map)\n    }\n    return lstData\n  }\n\n  //列头与列号对应关系\n  private static getSheetHeader(\n    sheet: Array<Array<any>>,\n    mapHeader: Map<string, number>,\n    row: number,\n    col: number\n  ) {\n    //格式化字符串数据\n    const value: string = `${sheet[row][col]}`.trim()\n    mapHeader.set(value, col)\n  }\n\n  //获取与列头对应的列数据\n  private static getSheetBody(\n    sheet: Array<Array<any>>,\n    mapHeader: Map<string, number>,\n    row: number\n  ): Map<string, string> {\n    const map = new Map<string, string>()\n    if (row > sheet.length) {\n      return map\n    }\n    for (const [header, col] of mapHeader) {\n      //格式化字符串数据\n      let value = `${sheet[row][col]}`.trim()\n      if (value.length == 0) {\n        //尝试获取单元格数据\n        value = this.getMergedCellValue(sheet, row, col)\n      }\n      if (value.length == 0) continue\n      map.set(header, value)\n    }\n    return map\n  }\n\n  //获取合并单元格数据\n  private static getMergedCellValue(\n    sheet: Array<Array<any>>,\n    row: number,\n    col: number\n  ): string {\n    for (const range of this.lstRange) {\n      const minCell = range.s\n      const maxCell = range.e\n      if (\n        minCell.r <= row &&\n        row <= maxCell.r &&\n        minCell.c <= col &&\n        col <= maxCell.c\n      ) {\n        //格式化字符串数据\n        return `${sheet[minCell.r][minCell.c]}`.trim()\n      }\n    }\n    return ''\n  }\n\n  //行高、列宽初始化\n  private static init(rowSize: number, colSize: number): void {\n    this.dataRow = -1\n    this.lstRange = []\n    this.lstValue = []\n    this.lstColInfo = []\n    this.lstRowInfo = []\n    this.lstCellStyle = []\n    for (let i = 0; i < rowSize; i++) {\n      this.lstValue.push([])\n      this.lstRowInfo.push({})\n      for (let j = 0; j < colSize; j++) {\n        if (i == 0) {\n          this.lstColInfo.push({})\n        }\n        this.lstValue[i].push({ v: '', t: 's' })\n      }\n    }\n    this.initCellStyle()\n  }\n\n  //样式列表初始化\n  private static initCellStyle(): void {\n    const lstColor = ['F2F2F2', 'FAFAFA', 'D4D4D4']\n    this.lstCellStyle.push(\n      this.chooseCellStyle(lstColor, 0),\n      this.chooseCellStyle(lstColor, 1),\n      this.chooseCellStyle(lstColor, 2)\n    )\n  }\n\n  //单元格样式选择\n  private static chooseCellStyle(\n    lstColor: Array<string>,\n    choose: number\n  ): CellStyle {\n    const cellStyle: CellStyle = {}\n    cellStyle.alignment = {}\n    cellStyle.border = {}\n    cellStyle.font = {}\n    if (choose == 0) {\n      //设置表头字体样式：粗体、大小\n      cellStyle.font = { bold: true, sz: 14 }\n      //设置背景色\n      cellStyle.fill = { fgColor: { rgb: lstColor[0] }, patternType: 'solid' }\n    } else if (choose == 1) {\n      //设置数据显示字体样式：大小\n      cellStyle.font = { sz: 12 }\n      //设置背景色\n      cellStyle.fill = { fgColor: { rgb: lstColor[1] }, patternType: 'solid' }\n    } else if (choose == 2) {\n      //设置数据显示字体样式：大小\n      cellStyle.font = { sz: 12 }\n    }\n    //设置字体: 微软雅黑\n    cellStyle.font.name = 'Microsoft YaHei'\n    //设置居中：垂直居中、水平居中\n    cellStyle.alignment.vertical = 'center'\n    cellStyle.alignment.horizontal = 'center'\n    //设置边框宽度、颜色\n    cellStyle.border.top = { style: 'thin', color: { rgb: lstColor[2] } }\n    cellStyle.border.bottom = { style: 'thin', color: { rgb: lstColor[2] } }\n    cellStyle.border.left = { style: 'thin', color: { rgb: lstColor[2] } }\n    cellStyle.border.right = { style: 'thin', color: { rgb: lstColor[2] } }\n    return cellStyle\n  }\n\n  //表格数据写入\n  public static writeCellData(\n    rowIndex: number,\n    colIndex: number,\n    cellData: string\n  ): void {\n    //写入单元格数据并设置单元格样式\n    const cellStyle = this.getCellStyle(this.dataRow, rowIndex)\n    if (this.widthAuto) {\n      //自动设置列宽\n      this.lstColInfo[colIndex] = {\n        wch: this.getWidthColByAuto(colIndex, cellData),\n      }\n    }\n    this.saveCellValue(rowIndex, cellStyle, cellData)\n    if (colIndex == 0) {\n      //设置行高\n      this.lstRowInfo[rowIndex] = { hpt: this.height }\n    }\n  }\n\n  //表头数据写入\n  public static writeHeader(\n    lstHeader: Array<Array<string>>,\n    widthCol?: number,\n    dataCol?: number,\n    lstExcludeRow?: Array<number>\n  ): void {\n    const colSize = lstHeader.length\n    const rowSize = lstHeader[0].length\n    this.init(rowSize, colSize)\n    this.dataRow = rowSize\n    this.widthAuto = widthCol == null\n    const lstFlag = this.getFlagArray(rowSize, colSize)\n    for (let row = 0; row < rowSize; row++) {\n      for (let col = 0; col < colSize; col++) {\n        if (!lstFlag[row][col]) {\n          lstFlag[row][col] = true\n\n          const lstCoords = new Array<Coords>()\n          lstCoords.push(Coords.of(lstHeader, row, col))\n          if (\n            lstExcludeRow == null ||\n            lstExcludeRow.length == 0 ||\n            !lstExcludeRow.includes(row)\n          ) {\n            this.checkMergeRange(\n              lstHeader,\n              lstFlag,\n              lstCoords,\n              row,\n              col,\n              lstHeader[col][row]\n            )\n          }\n\n          this.merge(lstCoords, widthCol)\n        }\n      }\n    }\n    //单元格冻结：从上往下，冻结 dataRow 行；从左往右，冻结 dataCol 列\n    this.freezeInfo = {\n      xSplit: dataCol || `${0}`,\n      ySplit: `${this.dataRow}`,\n      activePane: 'bottomRight',\n      state: 'frozen',\n    }\n  }\n\n  //单元格合并范围递归检查\n  private static checkMergeRange(\n    lstHeader: Array<Array<string>>,\n    lstFlag: Array<Array<boolean>>,\n    lstCoords: Array<Coords>,\n    x: number,\n    y: number,\n    value: string\n  ): void {\n    const colSize = lstHeader.length\n    const rowSize = lstHeader[0].length\n    for (const move of this.MOVE) {\n      const moveX = x + move[0]\n      const moveY = y + move[1]\n      if (\n        0 <= moveX &&\n        moveX < rowSize &&\n        0 <= moveY &&\n        moveY < colSize &&\n        !lstFlag[moveX][moveY]\n      ) {\n        if (lstHeader[moveY][moveX] === value) {\n          lstFlag[moveX][moveY] = true\n          lstCoords.push(Coords.of(lstHeader, moveX, moveY))\n          this.checkMergeRange(\n            lstHeader,\n            lstFlag,\n            lstCoords,\n            moveX,\n            moveY,\n            value\n          )\n        }\n      }\n    }\n  }\n\n  //单元格合并\n  private static merge(lstCoords: Array<Coords>, widthCol?: number): void {\n    //单元格坐标排序\n    lstCoords.sort((c1, c2) => {\n      if (c1.x > c2.x || c1.y > c2.y) {\n        return 1\n      } else if (c1.x < c2.x || c1.y < c2.y) {\n        return -1\n      } else {\n        return 0\n      }\n    })\n    for (const coords of lstCoords) {\n      //设置列宽\n      this.lstColInfo[coords.y] = {\n        wch: widthCol || this.getWidthColByAuto(coords.y, coords.value),\n      }\n      //设置行高\n      this.lstRowInfo[coords.x] = { hpt: this.height }\n      //写入单元格数据并设置单元格样式\n      const cellStyle = this.getCellStyle(this.dataRow, coords.x)\n      this.saveHeaderCellValue(coords.x, coords.y, cellStyle, coords.value)\n    }\n    //合并单元格\n    if (lstCoords.length > 1) {\n      const minCoords = lstCoords[0]\n      const maxCoords = lstCoords[lstCoords.length - 1]\n      this.lstRange.push({\n        s: { r: minCoords.x, c: minCoords.y },\n        e: { r: maxCoords.x, c: maxCoords.y },\n      })\n    }\n  }\n\n  //自动设置列宽\n  private static getWidthColByAuto(col: number, value: string): number {\n    let widthCol = this.lstColInfo[col]?.wch || 0\n    const tempWidthCol = this.getWidthCol(value)\n    if (widthCol < tempWidthCol) {\n      widthCol = tempWidthCol\n    }\n    return widthCol\n  }\n\n  //根据字符串获取列宽\n  private static getWidthCol(value: string): number {\n    let chineseSum = 0\n    let englishSum = 0\n    let charSum = 0\n    for (let i = 0; i < value?.length; i++) {\n      if (this.isChineseChar(value.charCodeAt(i))) {\n        chineseSum += 2\n        charSum += 2\n      } else {\n        englishSum += 1\n        charSum += 1\n      }\n    }\n    charSum = charSum > 1 ? 13 + charSum - 1 : 13\n    if (chineseSum == 0 && englishSum > 0) {\n      charSum += 4\n    } else if (chineseSum > 0 && englishSum > 0) {\n      const percent = englishSum / chineseSum\n      if (percent < 0.2) {\n        charSum -= 2\n      } else if (percent > 0.8) {\n        charSum += 2\n      }\n    }\n    return charSum\n  }\n\n  //判断是否为中文字符\n  private static isChineseChar(charCode: number): boolean {\n    return !(0 <= charCode && charCode <= 128)\n  }\n\n  //表头单元格数据写入\n  private static saveHeaderCellValue(\n    rowIndex: number,\n    colIndex: number,\n    cellStyle: CellStyle,\n    value: string\n  ): void {\n    this.lstValue[rowIndex][colIndex] = { v: value, t: 's', s: cellStyle }\n  }\n\n  //表格单元格数据写入\n  private static saveCellValue(\n    rowIndex: number,\n    cellStyle: CellStyle,\n    value: string\n  ): void {\n    if (this.lstValue.length === rowIndex) {\n      this.lstValue.push([])\n    }\n    this.lstValue[rowIndex].push({ v: value, t: 's', s: cellStyle })\n  }\n\n  //表头标记矩阵初始化\n  private static getFlagArray(\n    rowSize: number,\n    colSize: number\n  ): Array<Array<boolean>> {\n    const lstFlag = new Array<Array<boolean>>()\n    for (let i = 0; i < rowSize; i++) {\n      const flags = new Array<boolean>()\n      for (let j = 0; j < colSize; j++) {\n        flags.push(false)\n      }\n      lstFlag.push(flags)\n    }\n    return lstFlag\n  }\n\n  //获取单元格样式\n  private static getCellStyle(dataRow: number, rowIndex: number): CellStyle {\n    //单元格样式：带斑马纹表格\n    let cellStyle\n    if (dataRow === -1 || rowIndex < dataRow) {\n      //表头样式\n      cellStyle = this.lstCellStyle[0]\n    } else {\n      //数据样式\n      if (dataRow % 2 == 0) {\n        if (rowIndex % 2 == 0) {\n          cellStyle = this.lstCellStyle[2]\n        } else {\n          cellStyle = this.lstCellStyle[1]\n        }\n      } else {\n        if (rowIndex % 2 != 0) {\n          cellStyle = this.lstCellStyle[2]\n        } else {\n          cellStyle = this.lstCellStyle[1]\n        }\n      }\n    }\n    return cellStyle\n  }\n\n  //数据写入到表中\n  public static getDataSheet(): WorkSheet {\n    const sheet = XLSX.utils.aoa_to_sheet(this.lstValue)\n    sheet['!rows'] = this.lstRowInfo\n    sheet['!cols'] = this.lstColInfo\n    sheet['!merges'] = this.lstRange\n    sheet['!freeze'] = this.freezeInfo\n    return sheet\n  }\n\n  //导出excel文件\n  public static write(\n    lstData: Array<Record<string, any>>,\n    fileName: string\n  ): void {\n    const workbook: WorkBook = XLSX.utils.book_new()\n    for (const data of lstData) {\n      const name = <string>data.name\n      const sheet = <WorkSheet>data.sheet\n      XLSX.utils.book_append_sheet(workbook, sheet, name)\n    }\n    // XLSX.writeFile(workbook, fileName);\n    // XLSX_STYLE.writeFile(workbook, fileName)\n    XLSX.writeFile(workbook, fileName)\n  }\n}\n"],"names":[],"mappings":"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"}