tav-ui
Version:
1 lines • 56.5 kB
Source Map (JSON)
{"version":3,"file":"vxe-table-plugin-export2.mjs","sources":["../../../../../../../packages/components/table-pro/src/vxe-table-plugin-export.ts"],"sourcesContent":["// @ts-nocheck\n/* eslint-disable @typescript-eslint/no-namespace */\nimport ExcelJS from 'exceljs'\nimport XEUtils from 'xe-utils'\n\nimport { tavI18n } from '@tav-ui/locales'\nimport { useMessage } from '@tav-ui/hooks/web/useMessage'\nimport { ACTION_COLUMNS, SELECT_COMPONENTS } from './const'\nimport type {\n VxeGlobalInterceptorHandles,\n VxeTableConstructor,\n // eslint-disable-next-line sort-imports\n VXETableCore,\n // VxeTableDefines,\n VxeTablePropTypes,\n} from 'vxe-table'\n\ninterface ColumnInfo {\n _row: any\n _colSpan: number\n _rowSpan: number\n childNodes: ColumnInfo[]\n [key: string]: any\n}\n\nlet vxetable: VXETableCore\n\n// declare module 'vxe-table' {\n// namespace VxeTableDefines {\n// interface ExtortSheetMethodParams {\n// workbook: ExcelJS.Workbook\n// worksheet: ExcelJS.Worksheet\n// }\n// interface ColumnInfo {\n// _row: any\n// _colSpan: number\n// _rowSpan: number\n// childNodes: ColumnInfo[]\n// }\n// }\n// }\n\n// 遵循飞书文档样式\nlet defaultHeaderHeight = 26\nlet defaultHeaderBackgroundColor = 'f5f6f7'\nlet defaultHeaderFontSize = 11\n\nlet defaultCellHeight = 24\nlet defaultCellFontColor = '1f2329'\nlet defaultCellFontSize = 10\nlet defaultCellBorderStyle = 'thin'\nlet defaultCellBorderColor = 'dee0e3'\n\nlet defaultFooterHeight = defaultHeaderHeight\nlet defaultFooterBackgroundColor = defaultHeaderBackgroundColor\nlet defaultFooterFontSize = defaultHeaderFontSize\n\nlet defaultDescriptionHeight = 40\nlet defaultDescriptionBackgroundColor = 'fff258'\nlet defaultDescriptionFontSize = 14\nlet defaultDescriptionAlign = 'left'\n\nconst { createMessage } = useMessage()\n\nfunction getCellLabel(column: ColumnInfo, cellValue: any) {\n if (cellValue) {\n if (column.type === 'seq') {\n return XEUtils.toValueString(cellValue)\n }\n switch (column.cellType) {\n case 'string':\n return XEUtils.toValueString(cellValue)\n case 'number':\n if (!isNaN(cellValue)) {\n return Number(cellValue)\n }\n break\n default:\n if (cellValue.length < 12 && !isNaN(cellValue)) {\n return Number(cellValue)\n }\n break\n }\n }\n return cellValue\n}\n\nfunction getFooterData(opts: VxeTablePropTypes.ExportConfig, footerData: any[][]) {\n const { footerFilterMethod } = opts\n return footerFilterMethod\n ? footerData.filter((items, index) => footerFilterMethod({ items, $rowIndex: index }))\n : footerData\n}\n\nfunction getFooterCellValue(\n $table: VxeTableConstructor,\n opts: VxeTablePropTypes.ExportConfig,\n rows: any[],\n column: ColumnInfo\n) {\n //TODO 尾部处理\n const cellValue = getCellLabel(column, rows[$table.getVMColumnIndex(column)])\n return cellValue\n}\n\nfunction getValidColumn(column: ColumnInfo): ColumnInfo {\n const { childNodes } = column\n const isColGroup = childNodes && childNodes.length\n if (isColGroup) {\n return getValidColumn(childNodes[0])\n }\n return column\n}\n\nfunction setExcelRowHeight(excelRow: ExcelJS.Row, height: number, type?: string) {\n if (height) {\n if (type === 'header') {\n excelRow.height = Math.min(XEUtils.floor(height * 0.75, 12), defaultHeaderHeight)\n } else if (type === 'footer') {\n excelRow.height = Math.min(XEUtils.floor(height * 0.75, 12), defaultFooterHeight)\n } else {\n excelRow.height = Math.min(XEUtils.floor(height * 0.75, 12), defaultCellHeight)\n }\n }\n}\n\nfunction setExcelCellStyle(\n excelCell: ExcelJS.Cell,\n align?: VxeTablePropTypes.Align | VxeTablePropTypes.HeaderAlign | VxeTablePropTypes.FooterAlign\n) {\n excelCell.protection = {\n locked: false,\n }\n excelCell.alignment = {\n vertical: 'middle',\n horizontal: align || 'left',\n }\n}\n\nfunction getDefaultBorderStyle() {\n return {\n top: {\n style: defaultCellBorderStyle,\n color: {\n argb: defaultCellBorderColor,\n },\n },\n left: {\n style: defaultCellBorderStyle,\n color: {\n argb: defaultCellBorderColor,\n },\n },\n bottom: {\n style: defaultCellBorderStyle,\n color: {\n argb: defaultCellBorderColor,\n },\n },\n right: {\n style: defaultCellBorderStyle,\n color: {\n argb: defaultCellBorderColor,\n },\n },\n }\n}\n\nfunction deleteNotRequiredColumns(columns: any[]) {\n const handler = (columns: any[]) =>\n columns.filter(\n (column) =>\n (column.type && !SELECT_COMPONENTS.includes(column.type)) ||\n (column.field && !ACTION_COLUMNS.includes(column.field))\n )\n return handler(columns)\n}\n\n/**\n * @description 设置表格描述\n * @param sheet\n * @param useStyle\n * @param fileDescription\n */\nfunction setDescription(sheet, useStyle, fileDescription) {\n // see https://github.com/exceljs/exceljs/issues/433\n sheet.spliceRows(1, 0, [])\n // sheet.insertRow(1, [])\n sheet._rows[0].height = defaultDescriptionHeight\n\n const mergeColRange: string[] = []\n sheet.columns.forEach((column) => {\n mergeColRange.push(column.letter)\n })\n sheet.mergeCells(`${mergeColRange[0]}1`, `${mergeColRange[mergeColRange.length - 1]}1`)\n const cell = sheet.getCell(`${mergeColRange[0]}1`)\n cell.value = fileDescription\n\n setExcelCellStyle(cell, defaultDescriptionAlign || allAlign)\n\n if (useStyle) {\n Object.assign(cell, {\n font: {\n size: defaultDescriptionFontSize,\n color: {\n argb: defaultCellFontColor,\n },\n bold: true,\n },\n fill: {\n type: 'pattern',\n pattern: 'solid',\n fgColor: {\n argb: defaultDescriptionBackgroundColor,\n },\n },\n border: getDefaultBorderStyle(),\n })\n }\n}\n\n/**\n * @description 设置表格序号列\n * @param sheet\n * @param useStyle\n */\nfunction setSeq(sheet, useStyle, fileDescription, headerList, contentList, footerList) {\n const headerDeep = headerList.length\n const seqValues: any[] = []\n // const { footerData } = $table.getTableData()\n // const footers = getFooterData(options, footerData)\n\n // 填充列内容\n for (let i = 0; i < sheet._rows.length; i++) {\n if (i < (fileDescription ? headerDeep + 1 : headerDeep)) {\n // 把表头的位置空出来占位\n seqValues.push('')\n } else if (\n footerList.length > 0 &&\n i > (fileDescription ? headerDeep + 1 : headerDeep) + contentList.length - 1\n ) {\n // 把表尾的位置空出来占位\n seqValues.push('')\n } else {\n seqValues.push(fileDescription ? i - headerDeep : i - headerDeep + 1)\n }\n }\n\n sheet.spliceColumns(1, 0, seqValues)\n // sheet.insertColumn(1, seqValues)\n sheet._columns[0].eachCell((cell) => {\n if (useStyle) {\n setExcelCellStyle(cell, defaultDescriptionAlign || allAlign)\n Object.assign(cell, {\n font: {\n size: defaultCellFontSize,\n color: {\n argb: defaultCellFontColor,\n },\n },\n border: getDefaultBorderStyle(),\n })\n }\n })\n\n // 合并占位符与'序号'\n const mergeColRange: string[] = []\n sheet.columns.forEach((column) => {\n mergeColRange.push(column.letter)\n })\n // fileDescription 如果有值,r、c 各加一让出第一行位置\n sheet.mergeCells(\n `${mergeColRange[0]}${fileDescription ? 1 + 1 : 1}`,\n `${mergeColRange[0]}${fileDescription ? headerDeep + 1 : headerDeep}`\n )\n const firstCell = sheet.getCell(`${mergeColRange[0]}${fileDescription ? 1 + 1 : 1}`)\n firstCell.value = tavI18n('Tav.tablePro.columns.1')\n\n setExcelCellStyle(firstCell, defaultDescriptionAlign || allAlign)\n if (useStyle) {\n Object.assign(firstCell, {\n font: {\n size: defaultHeaderFontSize,\n color: {\n argb: defaultCellFontColor,\n },\n bold: true,\n },\n fill: {\n type: 'pattern',\n pattern: 'solid',\n fgColor: {\n argb: defaultHeaderBackgroundColor,\n },\n },\n border: getDefaultBorderStyle(),\n })\n }\n\n if (fileDescription) {\n // excel bug, manual hack. 新增描述后调用spliceColumns新增一列后之前描述逻辑中合并失效这里需要先删除后覆盖\n Reflect.deleteProperty(sheet._merges, `${mergeColRange[0]}1`)\n sheet.mergeCells(`${mergeColRange[0]}1`, `${mergeColRange[mergeColRange.length - 1 - 1]}1`) // 调用spliceColumns新增一列后 excel 自动在尾部追加一列所以这里要减掉\n const cell = sheet.getCell(`${mergeColRange[0]}1`)\n cell.value = fileDescription\n\n setExcelCellStyle(cell, defaultDescriptionAlign || allAlign)\n\n if (useStyle) {\n Object.assign(cell, {\n font: {\n size: defaultDescriptionFontSize,\n color: {\n argb: defaultCellFontColor,\n },\n bold: true,\n },\n fill: {\n type: 'pattern',\n pattern: 'solid',\n fgColor: {\n argb: defaultDescriptionBackgroundColor,\n },\n },\n border: getDefaultBorderStyle(),\n })\n }\n }\n}\n\nfunction setFooter(\n sheet,\n useStyle,\n fileSeq,\n $table,\n options,\n fileDescription,\n headerList,\n contentList,\n _footerData\n) {\n const headerDeep = headerList.length\n const totalRowCount = sheet._rows.length\n const { footerData } = $table.getTableData()\n const footers = getFooterData(options, _footerData || footerData)\n\n // 序号列最后一位填充表尾信息\n const fillFooterTitle = (row, value) => {\n if (fileSeq) {\n row.getCell(1).value = value\n }\n }\n\n for (let i = totalRowCount - footers.length; i < totalRowCount; i++) {\n const idx = (fileDescription ? headerDeep + 1 : headerDeep) + contentList.length\n const row = sheet.getRow(i + 1)\n fillFooterTitle(row, footers[i - idx][0])\n\n row.eachCell((excelCell) => {\n setExcelCellStyle(excelCell, defaultDescriptionAlign || allAlign)\n if (useStyle) {\n Object.assign(excelCell, {\n font: {\n size: defaultFooterFontSize,\n color: {\n argb: defaultCellFontColor,\n },\n bold: true,\n },\n fill: {\n type: 'pattern',\n pattern: 'solid',\n fgColor: {\n argb: defaultFooterBackgroundColor,\n },\n },\n border: getDefaultBorderStyle(),\n })\n }\n // const excelCol = sheet.getColumn(excelCell.col)\n // const column: any = $table.getColumnById(excelCol.key as string)\n // const { footerAlign, align } = column\n // setExcelCellStyle(excelCell, footerAlign || align || allFooterAlign || allAlign)\n // if (useStyle) {\n // Object.assign(excelCell, {\n // font: {\n // size: defaultFooterFontSize,\n // color: {\n // argb: defaultCellFontColor,\n // },\n // },\n // fill: {\n // type: 'pattern',\n // pattern: 'solid',\n // fgColor: {\n // argb: defaultFooterBackgroundColor,\n // },\n // },\n // border: getDefaultBorderStyle(),\n // })\n // }\n })\n }\n}\n\nasync function exportXLSX(params: VxeGlobalInterceptorHandles.InterceptorExportParams) {\n const msgKey = 'xlsx'\n const { modal, t } = vxetable\n const { $table, options, columns: _columns, colgroups, datas } = params\n const { props, reactData } = $table\n const { headerAlign: allHeaderAlign, align: allAlign, footerAlign: allFooterAlign } = props\n const { rowHeight } = reactData\n const {\n message,\n sheetName,\n isHeader,\n isFooter,\n isMerge,\n isColgroup,\n original,\n useStyle,\n sheetMethod,\n fileDescription,\n fileSeq,\n backupColumns,\n exportModalClose,\n fileStyles,\n // columns: _columns,\n } = options\n const columns = deleteNotRequiredColumns(_columns)\n\n defaultHeaderHeight = fileStyles.headerHeight ?? defaultHeaderHeight\n defaultHeaderBackgroundColor = fileStyles.headerBackgroundColor ?? defaultHeaderBackgroundColor\n defaultHeaderFontSize = fileStyles.headerFontSize ?? defaultHeaderFontSize\n\n defaultCellHeight = fileStyles.cellHeight ?? defaultCellHeight\n defaultCellFontColor = fileStyles.cellFontColor ?? defaultCellFontColor\n defaultCellFontSize = fileStyles.cellFontSize ?? defaultCellFontSize\n defaultCellBorderStyle = fileStyles.cellBorderStyle ?? defaultCellBorderStyle\n defaultCellBorderColor = fileStyles.cellBorderColor ?? defaultCellBorderColor\n\n defaultFooterHeight = fileStyles.footerHeight ?? defaultHeaderHeight\n defaultFooterBackgroundColor = fileStyles.footerBackgroundColor ?? defaultHeaderBackgroundColor\n defaultFooterFontSize = fileStyles.footerFontSize ?? defaultHeaderFontSize\n\n defaultDescriptionHeight = fileStyles.descriptionHeight ?? defaultDescriptionHeight\n defaultDescriptionBackgroundColor =\n fileStyles.descriptionBackgroundColor ?? defaultDescriptionBackgroundColor\n defaultDescriptionFontSize = fileStyles.descriptionFontSize ?? defaultDescriptionFontSize\n defaultDescriptionAlign = fileStyles.descriptionAlign ?? defaultDescriptionAlign\n\n const showMsg = message !== false\n const mergeCells = $table.getMergeCells()\n const colList: any[] = []\n const footList: any[] = []\n const sheetCols: any[] = []\n const sheetMerges: { s: { r: number; c: number }; e: { r: number; c: number } }[] = []\n let beforeRowCount = 0\n const colHead: any = {}\n // await $table.updateFooter()\n const _footerData = $table.props.footerMethod\n ? $table.props.footerMethod({ columns, data: datas.map((d) => d._row) })\n : null\n columns.forEach((column) => {\n const { id, field, renderWidth, width, minWidth } = column\n colHead[id] = original ? field : column.getTitle()\n sheetCols.push({\n key: id,\n width: XEUtils.ceil((renderWidth || width || minWidth) / 8, 1),\n })\n })\n // 处理表头\n if (isHeader) {\n // 处理分组\n if (isColgroup && colgroups) {\n colgroups.forEach((cols, rIndex) => {\n const groupHead: any = {}\n columns.forEach((column) => {\n groupHead[column.id] = null\n })\n cols.forEach((column) => {\n const { _colSpan, _rowSpan } = column\n const validColumn = getValidColumn(column)\n const columnIndex = columns.indexOf(validColumn)\n const title = column.getTitle\n ? column.getTitle()\n : validColumn.parentId\n ? $table.getColumnById(validColumn.parentId).title\n : validColumn.field\n groupHead[validColumn.id] = original ? validColumn.field : title\n if (_colSpan > 1 || _rowSpan > 1) {\n // sheetMerges.push({\n // s: { r: rIndex, c: columnIndex },\n // e: { r: rIndex + _rowSpan - 1, c: columnIndex + _colSpan - 1 },\n // })\n sheetMerges.push({\n s: { r: rIndex + 1, c: columnIndex + 1 },\n e: { r: rIndex + _rowSpan - 1 + 1, c: columnIndex + _colSpan - 1 + 1 },\n })\n }\n })\n colList.push(groupHead)\n })\n } else {\n colList.push(colHead)\n }\n beforeRowCount += colList.length\n }\n // 处理合并\n if (isMerge) {\n mergeCells.forEach((mergeItem) => {\n const {\n row: mergeRowIndex,\n rowspan: mergeRowspan,\n col: mergeColIndex,\n colspan: mergeColspan,\n } = mergeItem\n // sheetMerges.push({\n // s: { r: mergeRowIndex + beforeRowCount, c: mergeColIndex },\n // e: {\n // r: mergeRowIndex + beforeRowCount + mergeRowspan - 1,\n // c: mergeColIndex + mergeColspan - 1,\n // },\n // })\n sheetMerges.push({\n s: { r: mergeRowIndex + beforeRowCount + 1, c: mergeColIndex + 1 },\n e: {\n r: mergeRowIndex + beforeRowCount + mergeRowspan - 1 + 1,\n c: mergeColIndex + mergeColspan - 1 + 1,\n },\n })\n })\n }\n const rowList = datas.map((item) => {\n const rest: any = {}\n columns.forEach((column) => {\n // rest[column.id] = getCellLabel(column, item[column.id])\n let cellValue = item[column.id]\n // 使用自定义的导出逻辑,针对于单元格是复杂组件的情况(图片、tags等)\n if (column.params && column.params.cellContent) {\n cellValue = column.params.cellContent({ row: item._row || {} }) || ''\n }\n rest[column.id] = getCellLabel(column, cellValue)\n })\n return rest\n })\n beforeRowCount += rowList.length\n // 处理表尾\n if (isFooter) {\n const { footerData } = $table.getTableData()\n const footers = getFooterData(options, _footerData || footerData)\n const mergeFooterItems = $table.getMergeFooterItems()\n // 处理合并\n if (isMerge) {\n mergeFooterItems.forEach((mergeItem) => {\n const {\n row: mergeRowIndex,\n rowspan: mergeRowspan,\n col: mergeColIndex,\n colspan: mergeColspan,\n } = mergeItem\n // sheetMerges.push({\n // s: { r: mergeRowIndex + beforeRowCount, c: mergeColIndex },\n // e: {\n // r: mergeRowIndex + beforeRowCount + mergeRowspan - 1,\n // c: mergeColIndex + mergeColspan - 1,\n // },\n // })\n sheetMerges.push({\n s: { r: mergeRowIndex + beforeRowCount + 1, c: mergeColIndex + 1 },\n e: {\n r: mergeRowIndex + beforeRowCount + mergeRowspan - 1 + 1,\n c: mergeColIndex + mergeColspan - 1 + 1,\n },\n })\n })\n }\n footers.forEach((rows) => {\n const item: any = {}\n columns.forEach((column) => {\n item[column.id] = getFooterCellValue($table, options, rows, column) || ''\n })\n footList.push(item)\n })\n }\n const exportMethod = () => {\n const workbook = new ExcelJS.Workbook()\n const sheet = workbook.addWorksheet(sheetName)\n workbook.creator = 'i7eo'\n sheet.views = [{}] // 为了设置固定的行高必须设置该值,see:https://github.com/exceljs/exceljs/issues/422\n sheet.columns = sheetCols\n if (isHeader) {\n sheet.addRows(colList).forEach((excelRow) => {\n if (useStyle) {\n setExcelRowHeight(excelRow, rowHeight, 'header')\n }\n excelRow.eachCell((excelCell) => {\n const excelCol = sheet.getColumn(excelCell.col)\n const column: any = $table.getColumnById(excelCol.key as string)\n const { headerAlign, align } = column\n setExcelCellStyle(excelCell, headerAlign || align || allHeaderAlign || allAlign)\n if (useStyle) {\n Object.assign(excelCell, {\n font: {\n size: defaultHeaderFontSize,\n color: {\n argb: defaultCellFontColor,\n },\n bold: true,\n },\n fill: {\n type: 'pattern',\n pattern: 'solid',\n fgColor: {\n argb: defaultHeaderBackgroundColor,\n },\n },\n border: getDefaultBorderStyle(),\n })\n }\n })\n })\n }\n sheet.addRows(rowList).forEach((excelRow) => {\n if (useStyle) {\n setExcelRowHeight(excelRow, rowHeight)\n }\n excelRow.eachCell((excelCell) => {\n const excelCol = sheet.getColumn(excelCell.col)\n const column: any = $table.getColumnById(excelCol.key as string)\n const { align } = column\n setExcelCellStyle(excelCell, align || allAlign)\n if (useStyle) {\n Object.assign(excelCell, {\n font: {\n size: defaultCellFontSize,\n color: {\n argb: defaultCellFontColor,\n },\n },\n border: getDefaultBorderStyle(),\n })\n }\n\n // 如果不格式化时间或者时间字段返回时间戳能直接供excel使用则可以开启,当前时间字段返回格式化好的时间所以要格式化的话得把每条数据转为时间戳才能让excel的格式化生效\n // if(!excelCol.numFmt) {\n // if (column.params && column.params.columnFormat) {\n // excelCol.numFmt = column.params.columnFormat(column, excelCell)\n // } else {\n // excelCol.numFmt = '@'\n // }\n // }\n\n if (column.params && column.params.cellFormat) {\n excelCell.numFmt = column.params.cellFormat(excelCell)\n } else {\n excelCell.numFmt = '@'\n }\n })\n })\n if (isFooter) {\n sheet.addRows(footList).forEach((excelRow) => {\n if (useStyle) {\n setExcelRowHeight(excelRow, rowHeight, 'footer')\n }\n excelRow.eachCell((excelCell) => {\n const excelCol = sheet.getColumn(excelCell.col)\n const column: any = $table.getColumnById(excelCol.key as string)\n const { footerAlign, align } = column\n setExcelCellStyle(excelCell, footerAlign || align || allFooterAlign || allAlign)\n if (useStyle) {\n Object.assign(excelCell, {\n font: {\n size: defaultFooterFontSize,\n color: {\n argb: defaultCellFontColor,\n },\n },\n fill: {\n type: 'pattern',\n pattern: 'solid',\n fgColor: {\n argb: defaultFooterBackgroundColor,\n },\n },\n border: getDefaultBorderStyle(),\n })\n }\n\n if (column.params && column.params.cellFormat) {\n excelCell.numFmt = column.params.cellFormat(excelCell)\n } else {\n excelCell.numFmt = '@'\n }\n })\n })\n }\n\n if (useStyle && sheetMethod) {\n sheetMethod({\n options,\n workbook,\n worksheet: sheet,\n columns,\n colgroups,\n datas,\n $table,\n })\n }\n\n fileDescription && setDescription(sheet, useStyle, fileDescription)\n fileSeq && setSeq(sheet, useStyle, fileDescription, colList, rowList, footList)\n footList.length > 0 &&\n setFooter(\n sheet,\n useStyle,\n fileSeq,\n $table,\n options,\n fileDescription,\n colList,\n rowList,\n _footerData\n )\n\n // sheetMerges.forEach(({ s, e }) => {\n // // 按开始行,开始列,结束行,结束列合并, see https://github.com/exceljs/exceljs/blob/master/README_zh.md#合并单元格\n // sheet.mergeCells(s.r + 1, s.c + 1, e.r + 1, e.c + 1)\n // })\n\n // sheetMerges.forEach(({ s, e }) => {\n // sheet.mergeCells(s.r, s.c, e.r, e.c)\n // })\n\n sheetMerges.forEach(({ s, e }) => {\n if (fileDescription) {\n if (fileSeq) {\n sheet.mergeCells(s.r + 1, s.c + 1, e.r + 1, e.c + 1)\n } else {\n sheet.mergeCells(s.r + 1, s.c, e.r + 1, e.c)\n }\n } else {\n if (fileSeq) {\n sheet.mergeCells(s.r, s.c + 1, e.r, e.c + 1)\n } else {\n sheet.mergeCells(s.r, s.c, e.r, e.c)\n }\n }\n })\n\n // sheetMerges.forEach(({ s, e }) => {\n // // 按开始行,开始列,结束行,结束列合并, see https://github.com/exceljs/exceljs/blob/master/README_zh.md#合并单元格\n // if (fileDescription) {\n // // 如果有描述先往顶部插入一行合并完成后再调用原本的合并,此时因为顶部插入了一行所以在合并时行计算应该下移一位\n // // sheet.mergeCells(s.r + 1 + 1, s.c + 1, e.r + 1 + 1, e.c + 1)\n // // 手动添加序号列后行右移\n // sheet.mergeCells(s.r + 1 + 1, s.c + 1 + 1, e.r + 1 + 1, e.c + 1 + 1)\n // } else {\n // // sheet.mergeCells(s.r + 1, s.c + 1, e.r + 1, e.c + 1)\n // // 手动添加序号列后行右移\n // sheet.mergeCells(s.r + 1, s.c + 1 + 1, e.r + 1, e.c + 1 + 1)\n // }\n // })\n workbook.xlsx.writeBuffer().then((buffer) => {\n const blob = new Blob([buffer], { type: 'application/octet-stream' })\n // 导出 xlsx\n downloadFile(blob, options, $table)\n if (showMsg && modal) {\n modal.close(msgKey)\n // modal.message({ content: t('vxe.table.expSuccess'), status: 'success' })\n // createMessage.success(t('vxe.table.expSuccess'))\n }\n $table.loadColumn(backupColumns.value)\n exportModalClose()\n })\n }\n if (showMsg && modal) {\n // modal.message({\n // id: msgKey,\n // content: t('vxe.table.expLoading'),\n // status: 'loading',\n // duration: -1,\n // })\n // setTimeout(exportMethod, 1500)\n createMessage.loading(tavI18n('Tav.tablePro.export.6'), 2).then(\n () => exportMethod(),\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n () => {}\n )\n } else {\n exportMethod()\n }\n}\n\nfunction downloadFile(blob: Blob, options: VxeTablePropTypes.ExportConfig) {\n const { modal, t } = vxetable\n const { message, filename, type } = options\n const showMsg = message !== false\n if (window.Blob) {\n if ((navigator as any).msSaveBlob) {\n ;(navigator as any).msSaveBlob(blob, `${filename}.${type}`)\n } else {\n const linkElem = document.createElement('a')\n linkElem.target = '_blank'\n linkElem.download = `${filename}.${type}`\n linkElem.href = URL.createObjectURL(blob)\n document.body.appendChild(linkElem)\n linkElem.click()\n document.body.removeChild(linkElem)\n }\n } else {\n if (showMsg && modal) {\n // modal.alert({ content: t('vxe.error.notExp'), status: 'error' })\n createMessage.error(t('vxe.error.notExp'))\n }\n }\n}\n\nfunction checkImportData(tableFields: string[], fields: string[]) {\n return fields.some((field) => tableFields.indexOf(field) > -1)\n}\n\nfunction importError(params: VxeGlobalInterceptorHandles.InterceptorImportParams) {\n const { modal, t } = vxetable\n const { $table, options } = params\n const { internalData } = $table\n const { _importReject } = internalData\n const showMsg = options.message !== false\n if (showMsg && modal) {\n // modal.message({ content: t('vxe.error.impFields'), status: 'error' })\n createMessage.error(t('vxe.error.impFields'))\n }\n if (_importReject) {\n _importReject({ status: false })\n }\n}\n\nfunction importXLSX(params: VxeGlobalInterceptorHandles.InterceptorImportParams) {\n const { modal, t } = vxetable\n const { $table, columns, options, file } = params\n const { internalData } = $table\n const { _importResolve } = internalData\n const showMsg = options.message !== false\n const fileReader = new FileReader()\n fileReader.onerror = () => {\n importError(params)\n }\n fileReader.onload = (evnt) => {\n const tableFields: string[] = []\n columns.forEach((column) => {\n const field = column.field\n if (field) {\n tableFields.push(field)\n }\n })\n const workbook = new ExcelJS.Workbook()\n const readerTarget = evnt.target\n if (readerTarget) {\n workbook.xlsx.load(readerTarget.result as ArrayBuffer).then((wb) => {\n const firstSheet = wb.worksheets[0]\n if (firstSheet) {\n const sheetValues = firstSheet.getSheetValues() as string[][]\n const fieldIndex = XEUtils.findIndexOf(sheetValues, (list) => list && list.length > 0)\n const fields = sheetValues[fieldIndex] as string[]\n const status = checkImportData(tableFields, fields)\n if (status) {\n const records = sheetValues.slice(fieldIndex).map((list) => {\n const item: any = {}\n list.forEach((cellValue, cIndex) => {\n item[fields[cIndex]] = cellValue\n })\n const record: any = {}\n tableFields.forEach((field) => {\n record[field] = XEUtils.isUndefined(item[field]) ? null : item[field]\n })\n return record\n })\n $table.createData(records).then((data: any[]) => {\n let loadRest: Promise<any>\n if (options.mode === 'insert') {\n loadRest = $table.insertAt(data, -1)\n } else {\n loadRest = $table.reloadData(data)\n }\n return loadRest.then(() => {\n if (_importResolve) {\n _importResolve({ status: true })\n }\n })\n })\n if (showMsg && modal) {\n // modal.message({\n // content: t('vxe.table.impSuccess', [records.length]),\n // status: 'success',\n // })\n createMessage.success(t('vxe.table.impSuccess'))\n }\n } else {\n importError(params)\n }\n } else {\n importError(params)\n }\n })\n } else {\n importError(params)\n }\n }\n fileReader.readAsArrayBuffer(file)\n}\n\nfunction handleImportEvent(params: VxeGlobalInterceptorHandles.InterceptorImportParams) {\n if (params.options.type === 'xlsx') {\n importXLSX(params)\n return false\n }\n}\n\nfunction handleExportEvent(params: VxeGlobalInterceptorHandles.InterceptorExportParams) {\n if (params.options.type === 'xlsx') {\n exportXLSX(params)\n return false\n }\n}\n\n/**\n * 基于 vxe-table 表格的增强插件,支持导出 xlsx 格式\n */\nexport const VXETablePluginExportXLSX = {\n install(vxetablecore: VXETableCore) {\n const { setup, interceptor } = vxetablecore\n\n vxetable = vxetablecore\n\n setup({\n export: {\n types: {\n xlsx: 0,\n },\n },\n })\n interceptor.mixin({\n 'event.import': handleImportEvent,\n 'event.export': handleExportEvent,\n })\n },\n}\n\nif (typeof window !== 'undefined' && window.VXETable && window.VXETable.use) {\n window.VXETable.use(VXETablePluginExportXLSX)\n}\n\nexport default VXETablePluginExportXLSX\n"],"names":[],"mappings":"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