UNPKG

vxe-table-demonic

Version:

一个基于 vue 的 PC 端表单/表格组件,支持增删改查、虚拟列表、虚拟树、懒加载、快捷菜单、数据校验、树形结构、打印导出、表单渲染、数据分页、弹窗、自定义模板、渲染器、JSON 配置式...

899 lines 69.3 kB
import { inject, nextTick } from 'vue'; import XEUtils from 'xe-utils'; import GlobalConfig from '../../v-x-e-table/src/conf'; import { VXETable } from '../../v-x-e-table'; import { isColumnInfo, mergeBodyMethod, getCellValue } from '../../table/src/util'; import { parseFile, formatText } from '../../tools/utils'; import { warnLog, errLog } from '../../tools/log'; import { readLocalFile, handlePrint, saveLocalFile, createHtmlPage, getExportBlobByContent } from './util'; var htmlCellElem; var csvBOM = '\ufeff'; var enterSymbol = '\r\n'; function defaultFilterExportColumn(column) { return column.property || ['seq', 'checkbox', 'radio'].indexOf(column.type) > -1; } var getConvertColumns = function (columns) { var result = []; columns.forEach(function (column) { if (column.childNodes && column.childNodes.length) { result.push(column); result.push.apply(result, getConvertColumns(column.childNodes)); } else { result.push(column); } }); return result; }; var convertToRows = function (originColumns) { var maxLevel = 1; var traverse = function (column, parent) { if (parent) { column._level = parent._level + 1; if (maxLevel < column._level) { maxLevel = column._level; } } if (column.childNodes && column.childNodes.length) { var colSpan_1 = 0; column.childNodes.forEach(function (subColumn) { traverse(subColumn, column); colSpan_1 += subColumn._colSpan; }); column._colSpan = colSpan_1; } else { column._colSpan = 1; } }; originColumns.forEach(function (column) { column._level = 1; traverse(column); }); var rows = []; for (var i = 0; i < maxLevel; i++) { rows.push([]); } var allColumns = getConvertColumns(originColumns); allColumns.forEach(function (column) { if (column.childNodes && column.childNodes.length) { column._rowSpan = 1; } else { column._rowSpan = maxLevel - column._level + 1; } rows[column._level - 1].push(column); }); return rows; }; function toTableBorder(border) { if (border === true) { return 'full'; } if (border) { return border; } return 'default'; } function getBooleanValue(cellValue) { return cellValue === 'TRUE' || cellValue === 'true' || cellValue === true; } function getFooterData(opts, footerTableData) { var footerFilterMethod = opts.footerFilterMethod; return footerFilterMethod ? footerTableData.filter(function (items, index) { return footerFilterMethod({ items: items, $rowIndex: index }); }) : footerTableData; } function getCsvCellTypeLabel(column, cellValue) { if (cellValue) { if (column.type === 'seq') { return "\t".concat(cellValue); } switch (column.cellType) { case 'string': if (!isNaN(cellValue)) { return "\t".concat(cellValue); } break; case 'number': break; default: if (cellValue.length >= 12 && !isNaN(cellValue)) { return "\t".concat(cellValue); } break; } } return cellValue; } function toTxtCellLabel(val) { if (/[",\s\n]/.test(val)) { return "\"".concat(val.replace(/"/g, '""'), "\""); } return val; } function getElementsByTagName(elem, qualifiedName) { return elem.getElementsByTagName(qualifiedName); } function getTxtCellKey(now) { return "#".concat(now, "@").concat(XEUtils.uniqueId()); } function replaceTxtCell(cell, vMaps) { return cell.replace(/#\d+@\d+/g, function (key) { return XEUtils.hasOwnProp(vMaps, key) ? vMaps[key] : key; }); } function getTxtCellValue(val, vMaps) { var rest = replaceTxtCell(val, vMaps); return rest.replace(/^"+$/g, function (qVal) { return '"'.repeat(Math.ceil(qVal.length / 2)); }); } function parseCsvAndTxt(columns, content, cellSeparator) { var list = content.split(enterSymbol); var rows = []; var fields = []; if (list.length) { var vMaps_1 = {}; var now_1 = Date.now(); list.forEach(function (rVal) { if (rVal) { var item_1 = {}; rVal = rVal.replace(/("")|(\n)/g, function (text, dVal) { var key = getTxtCellKey(now_1); vMaps_1[key] = dVal ? '"' : '\n'; return key; }).replace(/"(.*?)"/g, function (text, cVal) { var key = getTxtCellKey(now_1); vMaps_1[key] = replaceTxtCell(cVal, vMaps_1); return key; }); var cells = rVal.split(cellSeparator); if (!fields.length) { fields = cells.map(function (val) { return getTxtCellValue(val.trim(), vMaps_1); }); } else { cells.forEach(function (val, colIndex) { if (colIndex < fields.length) { item_1[fields[colIndex]] = getTxtCellValue(val.trim(), vMaps_1); } }); rows.push(item_1); } } }); } return { fields: fields, rows: rows }; } function parseCsv(columns, content) { return parseCsvAndTxt(columns, content, ','); } function parseTxt(columns, content) { return parseCsvAndTxt(columns, content, '\t'); } function parseHTML(columns, content) { var domParser = new DOMParser(); var xmlDoc = domParser.parseFromString(content, 'text/html'); var bodyNodes = getElementsByTagName(xmlDoc, 'body'); var rows = []; var fields = []; if (bodyNodes.length) { var tableNodes = getElementsByTagName(bodyNodes[0], 'table'); if (tableNodes.length) { var theadNodes = getElementsByTagName(tableNodes[0], 'thead'); if (theadNodes.length) { XEUtils.arrayEach(getElementsByTagName(theadNodes[0], 'tr'), function (rowNode) { XEUtils.arrayEach(getElementsByTagName(rowNode, 'th'), function (cellNode) { fields.push(cellNode.textContent); }); }); var tbodyNodes = getElementsByTagName(tableNodes[0], 'tbody'); if (tbodyNodes.length) { XEUtils.arrayEach(getElementsByTagName(tbodyNodes[0], 'tr'), function (rowNode) { var item = {}; XEUtils.arrayEach(getElementsByTagName(rowNode, 'td'), function (cellNode, colIndex) { if (fields[colIndex]) { item[fields[colIndex]] = cellNode.textContent || ''; } }); rows.push(item); }); } } } } return { fields: fields, rows: rows }; } function parseXML(columns, content) { var domParser = new DOMParser(); var xmlDoc = domParser.parseFromString(content, 'application/xml'); var sheetNodes = getElementsByTagName(xmlDoc, 'Worksheet'); var rows = []; var fields = []; if (sheetNodes.length) { var tableNodes = getElementsByTagName(sheetNodes[0], 'Table'); if (tableNodes.length) { var rowNodes = getElementsByTagName(tableNodes[0], 'Row'); if (rowNodes.length) { XEUtils.arrayEach(getElementsByTagName(rowNodes[0], 'Cell'), function (cellNode) { fields.push(cellNode.textContent); }); XEUtils.arrayEach(rowNodes, function (rowNode, index) { if (index) { var item_2 = {}; var cellNodes = getElementsByTagName(rowNode, 'Cell'); XEUtils.arrayEach(cellNodes, function (cellNode, colIndex) { if (fields[colIndex]) { item_2[fields[colIndex]] = cellNode.textContent; } }); rows.push(item_2); } }); } } } return { fields: fields, rows: rows }; } function clearColumnConvert(columns) { XEUtils.eachTree(columns, function (column) { delete column._level; delete column._colSpan; delete column._rowSpan; delete column._children; delete column.childNodes; }, { children: 'children' }); } /** * 检查导入的列是否完整 * @param {Array} fields 字段名列表 * @param {Array} rows 数据列表 */ function checkImportData(columns, fields) { var tableFields = []; columns.forEach(function (column) { var field = column.property; if (field) { tableFields.push(field); } }); return fields.some(function (field) { return tableFields.indexOf(field) > -1; }); } var tableExportMethodKeys = ['exportData', 'importByFile', 'importData', 'saveFile', 'readFile', 'print', 'openImport', 'openExport', 'openPrint']; var tableExportHook = { setupTable: function ($xetable) { var props = $xetable.props, reactData = $xetable.reactData, internalData = $xetable.internalData; var _a = $xetable.getComputeMaps(), computeTreeOpts = _a.computeTreeOpts, computePrintOpts = _a.computePrintOpts, computeExportOpts = _a.computeExportOpts, computeImportOpts = _a.computeImportOpts, computeCustomOpts = _a.computeCustomOpts, computeSeqOpts = _a.computeSeqOpts, computeRadioOpts = _a.computeRadioOpts, computeCheckboxOpts = _a.computeCheckboxOpts, computeColumnOpts = _a.computeColumnOpts; var $xegrid = inject('$xegrid', null); var hasTreeChildren = function (row) { var treeOpts = computeTreeOpts.value; var childrenField = treeOpts.children || treeOpts.childrenField; return row[childrenField] && row[childrenField].length; }; var getSeq = function (row, $rowIndex, column, $columnIndex) { var seqOpts = computeSeqOpts.value; var seqMethod = seqOpts.seqMethod || column.seqMethod; if (seqMethod) { return seqMethod({ row: row, rowIndex: $xetable.getRowIndex(row), $rowIndex: $rowIndex, column: column, columnIndex: $xetable.getColumnIndex(column), $columnIndex: $columnIndex }); } return $xetable.getRowSeq(row); }; function getHeaderTitle(opts, column) { var columnOpts = computeColumnOpts.value; var headExportMethod = column.headerExportMethod || columnOpts.headerExportMethod; return headExportMethod ? headExportMethod({ column: column, options: opts, $table: $xetable }) : ((opts.original ? column.property : column.getTitle()) || ''); } var toBooleanValue = function (cellValue) { return XEUtils.isBoolean(cellValue) ? (cellValue ? 'TRUE' : 'FALSE') : cellValue; }; var getLabelData = function (opts, columns, datas) { var isAllExpand = opts.isAllExpand, mode = opts.mode; var treeConfig = props.treeConfig; var radioOpts = computeRadioOpts.value; var checkboxOpts = computeCheckboxOpts.value; var treeOpts = computeTreeOpts.value; var columnOpts = computeColumnOpts.value; if (!htmlCellElem) { htmlCellElem = document.createElement('div'); } if (treeConfig) { var childrenField = treeOpts.children || treeOpts.childrenField; // 如果是树表格只允许导出数据源 var rest_1 = []; var expandMaps_1 = new Map(); XEUtils.eachTree(datas, function (item, $rowIndex, items, path, parent, nodes) { var row = item._row || item; var parentRow = parent && parent._row ? parent._row : parent; if ((isAllExpand || !parentRow || (expandMaps_1.has(parentRow) && $xetable.isTreeExpandByRow(parentRow)))) { var hasRowChild = hasTreeChildren(row); var item_3 = { _row: row, _level: nodes.length - 1, _hasChild: hasRowChild, _expand: hasRowChild && $xetable.isTreeExpandByRow(row) }; columns.forEach(function (column, $columnIndex) { var cellValue = ''; var renderOpts = column.editRender || column.cellRender; var bodyExportMethod = column.exportMethod; if (!bodyExportMethod && renderOpts && renderOpts.name) { var compConf = VXETable.renderer.get(renderOpts.name); if (compConf) { bodyExportMethod = compConf.exportMethod; } } if (!bodyExportMethod) { bodyExportMethod = columnOpts.exportMethod; } if (bodyExportMethod) { cellValue = bodyExportMethod({ $table: $xetable, row: row, column: column, options: opts }); } else { switch (column.type) { case 'seq': cellValue = mode === 'all' ? path.map(function (num, i) { return i % 2 === 0 ? (Number(num) + 1) : '.'; }).join('') : getSeq(row, $rowIndex, column, $columnIndex); break; case 'checkbox': cellValue = toBooleanValue($xetable.isCheckedByCheckboxRow(row)); item_3._checkboxLabel = checkboxOpts.labelField ? XEUtils.get(row, checkboxOpts.labelField) : ''; item_3._checkboxDisabled = checkboxOpts.checkMethod && !checkboxOpts.checkMethod({ row: row }); break; case 'radio': cellValue = toBooleanValue($xetable.isCheckedByRadioRow(row)); item_3._radioLabel = radioOpts.labelField ? XEUtils.get(row, radioOpts.labelField) : ''; item_3._radioDisabled = radioOpts.checkMethod && !radioOpts.checkMethod({ row: row }); break; default: if (opts.original) { cellValue = getCellValue(row, column); } else { cellValue = $xetable.getCellLabel(row, column); if (column.type === 'html') { htmlCellElem.innerHTML = cellValue; cellValue = htmlCellElem.innerText.trim(); } else { var cell = $xetable.getCell(row, column); if (cell) { cellValue = cell.innerText.trim(); } } } } } item_3[column.id] = XEUtils.toValueString(cellValue); }); expandMaps_1.set(row, 1); rest_1.push(Object.assign(item_3, row)); } }, { children: childrenField }); return rest_1; } return datas.map(function (row, $rowIndex) { var item = { _row: row }; columns.forEach(function (column, $columnIndex) { var cellValue = ''; var renderOpts = column.editRender || column.cellRender; var exportLabelMethod = column.exportMethod; if (!exportLabelMethod && renderOpts && renderOpts.name) { var compConf = VXETable.renderer.get(renderOpts.name); if (compConf) { exportLabelMethod = compConf.exportMethod; } } if (exportLabelMethod) { cellValue = exportLabelMethod({ $table: $xetable, row: row, column: column, options: opts }); } else { switch (column.type) { case 'seq': cellValue = mode === 'all' ? $rowIndex + 1 : getSeq(row, $rowIndex, column, $columnIndex); break; case 'checkbox': cellValue = toBooleanValue($xetable.isCheckedByCheckboxRow(row)); item._checkboxLabel = checkboxOpts.labelField ? XEUtils.get(row, checkboxOpts.labelField) : ''; item._checkboxDisabled = checkboxOpts.checkMethod && !checkboxOpts.checkMethod({ row: row }); break; case 'radio': cellValue = toBooleanValue($xetable.isCheckedByRadioRow(row)); item._radioLabel = radioOpts.labelField ? XEUtils.get(row, radioOpts.labelField) : ''; item._radioDisabled = radioOpts.checkMethod && !radioOpts.checkMethod({ row: row }); break; default: if (opts.original) { cellValue = getCellValue(row, column); } else { cellValue = $xetable.getCellLabel(row, column); if (column.type === 'html') { htmlCellElem.innerHTML = cellValue; cellValue = htmlCellElem.innerText.trim(); } else { var cell = $xetable.getCell(row, column); if (cell) { cellValue = cell.innerText.trim(); } } } } } item[column.id] = XEUtils.toValueString(cellValue); }); return item; }); }; var getExportData = function (opts) { var columns = opts.columns, dataFilterMethod = opts.dataFilterMethod; var datas = opts.data; if (dataFilterMethod) { datas = datas.filter(function (row, index) { return dataFilterMethod({ row: row, $rowIndex: index }); }); } return getLabelData(opts, columns, datas); }; var getFooterCellValue = function (opts, items, column) { var columnOpts = computeColumnOpts.value; var renderOpts = column.editRender || column.cellRender; var footLabelMethod = column.footerExportMethod; if (!footLabelMethod && renderOpts && renderOpts.name) { var compConf = VXETable.renderer.get(renderOpts.name); if (compConf) { footLabelMethod = compConf.footerExportMethod; } } if (!footLabelMethod) { footLabelMethod = columnOpts.footerExportMethod; } var _columnIndex = $xetable.getVTColumnIndex(column); var cellValue = footLabelMethod ? footLabelMethod({ $table: $xetable, items: items, itemIndex: _columnIndex, _columnIndex: _columnIndex, column: column, options: opts }) : XEUtils.toValueString(items[_columnIndex]); return cellValue; }; var toCsv = function (opts, columns, datas) { var content = csvBOM; if (opts.isHeader) { content += columns.map(function (column) { return toTxtCellLabel(getHeaderTitle(opts, column)); }).join(',') + enterSymbol; } datas.forEach(function (row) { content += columns.map(function (column) { return toTxtCellLabel(getCsvCellTypeLabel(column, row[column.id])); }).join(',') + enterSymbol; }); if (opts.isFooter) { var footerTableData = reactData.footerTableData; var footers = getFooterData(opts, footerTableData); footers.forEach(function (rows) { content += columns.map(function (column) { return toTxtCellLabel(getFooterCellValue(opts, rows, column)); }).join(',') + enterSymbol; }); } return content; }; var toTxt = function (opts, columns, datas) { var content = ''; if (opts.isHeader) { content += columns.map(function (column) { return toTxtCellLabel(getHeaderTitle(opts, column)); }).join('\t') + enterSymbol; } datas.forEach(function (row) { content += columns.map(function (column) { return toTxtCellLabel(row[column.id]); }).join('\t') + enterSymbol; }); if (opts.isFooter) { var footerTableData = reactData.footerTableData; var footers = getFooterData(opts, footerTableData); footers.forEach(function (rows) { content += columns.map(function (column) { return toTxtCellLabel(getFooterCellValue(opts, rows, column)); }).join(',') + enterSymbol; }); } return content; }; var hasEllipsis = function (column, property, allColumnOverflow) { var columnOverflow = column[property]; var headOverflow = XEUtils.isUndefined(columnOverflow) || XEUtils.isNull(columnOverflow) ? allColumnOverflow : columnOverflow; var showEllipsis = headOverflow === 'ellipsis'; var showTitle = headOverflow === 'title'; var showTooltip = headOverflow === true || headOverflow === 'tooltip'; var isEllipsis = showTitle || showTooltip || showEllipsis; // 虚拟滚动不支持动态高度 var scrollXLoad = reactData.scrollXLoad, scrollYLoad = reactData.scrollYLoad; if ((scrollXLoad || scrollYLoad) && !isEllipsis) { isEllipsis = true; } return isEllipsis; }; var toHtml = function (opts, columns, datas) { var id = props.id, border = props.border, treeConfig = props.treeConfig, allHeaderAlign = props.headerAlign, allAlign = props.align, allFooterAlign = props.footerAlign, allColumnOverflow = props.showOverflow, allColumnHeaderOverflow = props.showHeaderOverflow; var isAllSelected = reactData.isAllSelected, isIndeterminate = reactData.isIndeterminate, mergeList = reactData.mergeList; var treeOpts = computeTreeOpts.value; var isPrint = opts.print, isHeader = opts.isHeader, isFooter = opts.isFooter, isColgroup = opts.isColgroup, isMerge = opts.isMerge, colgroups = opts.colgroups, original = opts.original; var allCls = 'check-all'; var clss = [ 'vxe-table', "border--".concat(toTableBorder(border)), isPrint ? 'is--print' : '', isHeader ? 'is--header' : '' ].filter(function (cls) { return cls; }); var tables = [ "<table class=\"".concat(clss.join(' '), "\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">"), "<colgroup>".concat(columns.map(function (column) { return "<col style=\"width:".concat(column.renderWidth, "px\">"); }).join(''), "</colgroup>") ]; if (isHeader) { tables.push('<thead>'); if (isColgroup && !original) { colgroups.forEach(function (cols) { tables.push("<tr>".concat(cols.map(function (column) { var headAlign = column.headerAlign || column.align || allHeaderAlign || allAlign; var classNames = hasEllipsis(column, 'showHeaderOverflow', allColumnHeaderOverflow) ? ['col--ellipsis'] : []; var cellTitle = getHeaderTitle(opts, column); var childWidth = 0; var countChild = 0; XEUtils.eachTree([column], function (item) { if (!item.childNodes || !column.childNodes.length) { countChild++; } childWidth += item.renderWidth; }, { children: 'childNodes' }); var cellWidth = childWidth - countChild; if (headAlign) { classNames.push("col--".concat(headAlign)); } if (column.type === 'checkbox') { return "<th class=\"".concat(classNames.join(' '), "\" colspan=\"").concat(column._colSpan, "\" rowspan=\"").concat(column._rowSpan, "\"><div ").concat(isPrint ? '' : "style=\"width: ".concat(cellWidth, "px\""), "><input type=\"checkbox\" class=\"").concat(allCls, "\" ").concat(isAllSelected ? 'checked' : '', "><span>").concat(cellTitle, "</span></div></th>"); } return "<th class=\"".concat(classNames.join(' '), "\" colspan=\"").concat(column._colSpan, "\" rowspan=\"").concat(column._rowSpan, "\" title=\"").concat(cellTitle, "\"><div ").concat(isPrint ? '' : "style=\"width: ".concat(cellWidth, "px\""), "><span>").concat(formatText(cellTitle, true), "</span></div></th>"); }).join(''), "</tr>")); }); } else { tables.push("<tr>".concat(columns.map(function (column) { var headAlign = column.headerAlign || column.align || allHeaderAlign || allAlign; var classNames = hasEllipsis(column, 'showHeaderOverflow', allColumnHeaderOverflow) ? ['col--ellipsis'] : []; var cellTitle = getHeaderTitle(opts, column); if (headAlign) { classNames.push("col--".concat(headAlign)); } if (column.type === 'checkbox') { return "<th class=\"".concat(classNames.join(' '), "\"><div ").concat(isPrint ? '' : "style=\"width: ".concat(column.renderWidth, "px\""), "><input type=\"checkbox\" class=\"").concat(allCls, "\" ").concat(isAllSelected ? 'checked' : '', "><span>").concat(cellTitle, "</span></div></th>"); } return "<th class=\"".concat(classNames.join(' '), "\" title=\"").concat(cellTitle, "\"><div ").concat(isPrint ? '' : "style=\"width: ".concat(column.renderWidth, "px\""), "><span>").concat(formatText(cellTitle, true), "</span></div></th>"); }).join(''), "</tr>")); } tables.push('</thead>'); } if (datas.length) { tables.push('<tbody>'); if (treeConfig) { datas.forEach(function (item) { tables.push('<tr>' + columns.map(function (column) { var cellAlign = column.align || allAlign; var classNames = hasEllipsis(column, 'showOverflow', allColumnOverflow) ? ['col--ellipsis'] : []; var cellValue = item[column.id]; if (cellAlign) { classNames.push("col--".concat(cellAlign)); } if (column.treeNode) { var treeIcon = ''; if (item._hasChild) { treeIcon = "<i class=\"".concat(item._expand ? 'vxe-table--tree-fold-icon' : 'vxe-table--tree-unfold-icon', "\"></i>"); } classNames.push('vxe-table--tree-node'); if (column.type === 'radio') { return "<td class=\"".concat(classNames.join(' '), "\" title=\"").concat(cellValue, "\"><div ").concat(isPrint ? '' : "style=\"width: ".concat(column.renderWidth, "px\""), "><div class=\"vxe-table--tree-node-wrapper\" style=\"padding-left: ").concat(item._level * treeOpts.indent, "px\"><div class=\"vxe-table--tree-icon-wrapper\">").concat(treeIcon, "</div><div class=\"vxe-table--tree-cell\"><input type=\"radio\" name=\"radio_").concat(id, "\" ").concat(item._radioDisabled ? 'disabled ' : '').concat(getBooleanValue(cellValue) ? 'checked' : '', "><span>").concat(item._radioLabel, "</span></div></div></div></td>"); } else if (column.type === 'checkbox') { return "<td class=\"".concat(classNames.join(' '), "\" title=\"").concat(cellValue, "\"><div ").concat(isPrint ? '' : "style=\"width: ".concat(column.renderWidth, "px\""), "><div class=\"vxe-table--tree-node-wrapper\" style=\"padding-left: ").concat(item._level * treeOpts.indent, "px\"><div class=\"vxe-table--tree-icon-wrapper\">").concat(treeIcon, "</div><div class=\"vxe-table--tree-cell\"><input type=\"checkbox\" ").concat(item._checkboxDisabled ? 'disabled ' : '').concat(getBooleanValue(cellValue) ? 'checked' : '', "><span>").concat(item._checkboxLabel, "</span></div></div></div></td>"); } return "<td class=\"".concat(classNames.join(' '), "\" title=\"").concat(cellValue, "\"><div ").concat(isPrint ? '' : "style=\"width: ".concat(column.renderWidth, "px\""), "><div class=\"vxe-table--tree-node-wrapper\" style=\"padding-left: ").concat(item._level * treeOpts.indent, "px\"><div class=\"vxe-table--tree-icon-wrapper\">").concat(treeIcon, "</div><div class=\"vxe-table--tree-cell\">").concat(cellValue, "</div></div></div></td>"); } if (column.type === 'radio') { return "<td class=\"".concat(classNames.join(' '), "\"><div ").concat(isPrint ? '' : "style=\"width: ".concat(column.renderWidth, "px\""), "><input type=\"radio\" name=\"radio_").concat(id, "\" ").concat(item._radioDisabled ? 'disabled ' : '').concat(getBooleanValue(cellValue) ? 'checked' : '', "><span>").concat(item._radioLabel, "</span></div></td>"); } else if (column.type === 'checkbox') { return "<td class=\"".concat(classNames.join(' '), "\"><div ").concat(isPrint ? '' : "style=\"width: ".concat(column.renderWidth, "px\""), "><input type=\"checkbox\" ").concat(item._checkboxDisabled ? 'disabled ' : '').concat(getBooleanValue(cellValue) ? 'checked' : '', "><span>").concat(item._checkboxLabel, "</span></div></td>"); } return "<td class=\"".concat(classNames.join(' '), "\" title=\"").concat(cellValue, "\"><div ").concat(isPrint ? '' : "style=\"width: ".concat(column.renderWidth, "px\""), ">").concat(formatText(cellValue, true), "</div></td>"); }).join('') + '</tr>'); }); } else { datas.forEach(function (item) { tables.push('<tr>' + columns.map(function (column) { var cellAlign = column.align || allAlign; var classNames = hasEllipsis(column, 'showOverflow', allColumnOverflow) ? ['col--ellipsis'] : []; var cellValue = item[column.id]; var rowSpan = 1; var colSpan = 1; if (isMerge && mergeList.length) { var _rowIndex = $xetable.getVTRowIndex(item._row); var _columnIndex = $xetable.getVTColumnIndex(column); var spanRest = mergeBodyMethod(mergeList, _rowIndex, _columnIndex); if (spanRest) { var rowspan = spanRest.rowspan, colspan = spanRest.colspan; if (!rowspan || !colspan) { return ''; } if (rowspan > 1) { rowSpan = rowspan; } if (colspan > 1) { colSpan = colspan; } } } if (cellAlign) { classNames.push("col--".concat(cellAlign)); } if (column.type === 'radio') { return "<td class=\"".concat(classNames.join(' '), "\" rowspan=\"").concat(rowSpan, "\" colspan=\"").concat(colSpan, "\"><div ").concat(isPrint ? '' : "style=\"width: ".concat(column.renderWidth, "px\""), "><input type=\"radio\" name=\"radio_").concat(id, "\" ").concat(item._radioDisabled ? 'disabled ' : '').concat(getBooleanValue(cellValue) ? 'checked' : '', "><span>").concat(item._radioLabel, "</span></div></td>"); } else if (column.type === 'checkbox') { return "<td class=\"".concat(classNames.join(' '), "\" rowspan=\"").concat(rowSpan, "\" colspan=\"").concat(colSpan, "\"><div ").concat(isPrint ? '' : "style=\"width: ".concat(column.renderWidth, "px\""), "><input type=\"checkbox\" ").concat(item._checkboxDisabled ? 'disabled ' : '').concat(getBooleanValue(cellValue) ? 'checked' : '', "><span>").concat(item._checkboxLabel, "</span></div></td>"); } return "<td class=\"".concat(classNames.join(' '), "\" rowspan=\"").concat(rowSpan, "\" colspan=\"").concat(colSpan, "\" title=\"").concat(cellValue, "\"><div ").concat(isPrint ? '' : "style=\"width: ".concat(column.renderWidth, "px\""), ">").concat(formatText(cellValue, true), "</div></td>"); }).join('') + '</tr>'); }); } tables.push('</tbody>'); } if (isFooter) { var footerTableData = reactData.footerTableData; var footers = getFooterData(opts, footerTableData); if (footers.length) { tables.push('<tfoot>'); footers.forEach(function (rows) { tables.push("<tr>".concat(columns.map(function (column) { var footAlign = column.footerAlign || column.align || allFooterAlign || allAlign; var classNames = hasEllipsis(column, 'showOverflow', allColumnOverflow) ? ['col--ellipsis'] : []; var cellValue = getFooterCellValue(opts, rows, column); if (footAlign) { classNames.push("col--".concat(footAlign)); } return "<td class=\"".concat(classNames.join(' '), "\" title=\"").concat(cellValue, "\"><div ").concat(isPrint ? '' : "style=\"width: ".concat(column.renderWidth, "px\""), ">").concat(formatText(cellValue, true), "</div></td>"); }).join(''), "</tr>")); }); tables.push('</tfoot>'); } } // 是否半选状态 var script = !isAllSelected && isIndeterminate ? "<script>(function(){var a=document.querySelector(\".".concat(allCls, "\");if(a){a.indeterminate=true}})()</script>") : ''; tables.push('</table>', script); return isPrint ? tables.join('') : createHtmlPage(opts, tables.join('')); }; var toXML = function (opts, columns, datas) { var xml = [ '<?xml version="1.0"?>', '<?mso-application progid="Excel.Sheet"?>', '<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">', '<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">', '<Version>16.00</Version>', '</DocumentProperties>', '<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">', '<WindowHeight>7920</WindowHeight>', '<WindowWidth>21570</WindowWidth>', '<WindowTopX>32767</WindowTopX>', '<WindowTopY>32767</WindowTopY>', '<ProtectStructure>False</ProtectStructure>', '<ProtectWindows>False</ProtectWindows>', '</ExcelWorkbook>', "<Worksheet ss:Name=\"".concat(opts.sheetName, "\">"), '<Table>', columns.map(function (column) { return "<Column ss:Width=\"".concat(column.renderWidth, "\"/>"); }).join('') ].join(''); if (opts.isHeader) { xml += "<Row>".concat(columns.map(function (column) { return "<Cell><Data ss:Type=\"String\">".concat(getHeaderTitle(opts, column), "</Data></Cell>"); }).join(''), "</Row>"); } datas.forEach(function (row) { xml += '<Row>' + columns.map(function (column) { return "<Cell><Data ss:Type=\"String\">".concat(row[column.id], "</Data></Cell>"); }).join('') + '</Row>'; }); if (opts.isFooter) { var footerTableData = reactData.footerTableData; var footers = getFooterData(opts, footerTableData); footers.forEach(function (rows) { xml += "<Row>".concat(columns.map(function (column) { return "<Cell><Data ss:Type=\"String\">".concat(getFooterCellValue(opts, rows, column), "</Data></Cell>"); }).join(''), "</Row>"); }); } return "".concat(xml, "</Table></Worksheet></Workbook>"); }; var getContent = function (opts, columns, datas) { if (columns.length) { switch (opts.type) { case 'csv': return toCsv(opts, columns, datas); case 'txt': return toTxt(opts, columns, datas); case 'html': return toHtml(opts, columns, datas); case 'xml': return toXML(opts, columns, datas); } } return ''; }; var downloadFile = function (opts, content) { var filename = opts.filename, type = opts.type, download = opts.download; if (!download) { var blob = getExportBlobByContent(content, opts); return Promise.resolve({ type: type, content: content, blob: blob }); } saveLocalFile({ filename: filename, type: type, content: content }).then(function () { if (opts.message !== false) { // 检测弹窗模块 if (process.env.NODE_ENV === 'development') { if (!VXETable.modal) { errLog('vxe.error.reqModule', ['Modal']); } } VXETable.modal.message({ content: GlobalConfig.i18n('vxe.table.expSuccess'), status: 'success' }); } }); }; var handleExport = function (opts) { var remote = opts.remote, columns = opts.columns, colgroups = opts.colgroups, exportMethod = opts.exportMethod, afterExportMethod = opts.afterExportMethod; return new Promise(function (resolve) { if (remote) { var params = { options: opts, $table: $xetable, $grid: $xegrid }; resolve(exportMethod ? exportMethod(params) : params); } else { var datas_1 = getExportData(opts); resolve($xetable.preventEvent(null, 'event.export', { options: opts, columns: columns, colgroups: colgroups, datas: datas_1 }, function () { return downloadFile(opts, getContent(opts, columns, datas_1)); })); } }).then(function (params) { clearColumnConvert(columns); if (!opts.print) { if (afterExportMethod) { afterExportMethod({ status: true, options: opts, $table: $xetable, $grid: $xegrid }); } } return Object.assign({ status: true }, params); }).catch(function () { clearColumnConvert(columns); if (!opts.print) { if (afterExportMethod) { afterExportMethod({ status: false, options: opts, $table: $xetable, $grid: $xegrid }); } } var params = { status: false }; return Promise.reject(params); }); }; var handleImport = function (content, opts) { var tableFullColumn = internalData.tableFullColumn, _importResolve = internalData._importResolve, _importReject = internalData._importReject; var rest = { fields: [], rows: [] }; switch (opts.type) { case 'csv': rest = parseCsv(tableFullColumn, content); break; case 'txt': rest = parseTxt(tableFullColumn, content); break; case 'html': rest = parseHTML(tableFullColumn, content); break; case 'xml': rest = parseXML(tableFullColumn, content); break; } var fields = rest.fields, rows = rest.rows; var status = checkImportData(tableFullColumn, fields); if (status) { $xetable.createData(rows) .then(function (data) { var loadRest; if (opts.mode === 'insert') { loadRest = $xetable.insert(data); } else { loadRest = $xetable.reloadData(data); } if (opts.message !== false) { // 检测弹窗模块 if (process.env.NODE_ENV === 'development') { if (!VXETable.modal) { errLog('vxe.error.reqModule', ['Modal']); } } VXETable.modal.message({ content: GlobalConfig.i18n('vxe.table.impSuccess', [rows.length]), status: 'success' }); } return loadRest.then(function () { if (_importResolve) { _importResolve({ status: true }); } }); }); } else if (opts.message !== false) { // 检测弹窗模块 if (process.env.NODE_ENV === 'development') { if (!VXETable.modal) { errLog('vxe.error.reqModule', ['Modal']); } } VXETable.modal.message({ content: GlobalConfig.i18n('vxe.error.impFields'), status: 'error' }); if (_importReject) { _importReject({ status: false }); } } }; var handleFileImport = function (file, opts) { var importMethod = opts.importMethod, afterImportMethod = opts.afterImportMethod; var _a = parseFile(file), type = _a.type, filename = _a.filename; // 检查类型,如果为自定义导出,则不需要校验类型 if (!importMethod && !XEUtils.includes(VXETable.globalConfs.importTypes, type)) { if (opts.message !== false) { // 检测弹窗模块 if (process.env.NODE_ENV === 'development') { if (!VXETable.modal) { errLog('vxe.error.reqModule', ['Modal']); } } VXETable.modal.message({ content: GlobalConfig.i18n('vxe.error.notType', [type]), status: 'error' }); } var params = { status: false }; return Promise.reject(params); } var rest = new Promise(function (resolve, reject) { var _importResolve = function (params) { resolve(params); internalData._importResolve = null; internalData._importReject = null; }; var _importReject = function (params) { reject(params); internalData._importResolve = null; internalData._importReject = null; }; internalData._importResolve = _importResolve; internalData._importReject = _importReject; if (window.FileReader) { var options_1 = Object.assign({ mode: 'insert' }, opts, { type: type, filename: filename }); if (options_1.remote) { if (importMethod) { Promise.resolve(importMethod({ file: file, options: options_1, $table: $xetable })).then(function () { _importResolve({ status: true }); }).catch(function () { _importResolve({ status: true }); }); } else { _importResolve({ status: true }); } } else { var tableFullColumn = internalData.tableFullColumn; $xetable.preventEvent(null, 'event.import', { file: file, options: options_1, columns: tableFullColumn }, function () { var reader = new FileReader(); reader.onerror = function () { errLog('vxe.error.notType', [type]); _importReject({ status: false }); }; reader.onload = function (e) { handleImport(e.target.result, options_1); }; reader.readAsText(file, options_1.encoding || 'UTF-8'); }); } } else { // 不支持的浏览器 if (process.env.NODE_ENV === 'development') { errLog('vxe.error.notExp'); } _importResolve({ status: true }); } }); return rest.then(function () { if (afterImportMethod) { afterImportMethod({ status: true, options: opts, $table: $xetable }); } }).catch(function (e) { if (afterImportMethod) { afterImportMethod({ status: false, options: opts, $table: $xetable }); } return Promise.reject(e); }); }; var handleExportAndPrint = function (options, isPrint) { var treeConfig = props.treeConfig, showHeader = props.showHeader, showFooter = props.showFooter; var initStore = reactData.initStore, mergeList = reactData.mergeList, isGroup = reactData.isGroup, footerT