// Type definitions for el-excel-table // TypeScript Version: 4.0+ import { VueConstructor, PluginObject } from 'vue' declare module 'el-excel-table' { /** * 列配置接口 */ export interface ColumnConfig { prop?: string label: string width?: string | number fixed?: boolean | 'left' | 'right' align?: 'left' | 'center' | 'right' formatter?: (row: any, column: any, cellValue: any, index: number) => string children?: ColumnConfig[] // 高级特性 merge?: boolean // 是否合并相同值的单元格 formula?: string // 公式字符串 digits?: number // 小数位数 editable?: boolean // 是否可编辑 summary?: boolean // 是否参与底部总计计算,默认 true debug?: boolean // 是否开启调试日志 remark?: string // 表头备注说明(支持富文本 HTML) // 虚拟列 type?: 'virtual' direction?: 'horizontal' | 'vertical' anchor?: string // 内部使用 _spanData?: number[] } /** * 表格行数据 */ export interface TableRow { [key: string]: any _rowKey?: string _v?: any } /** * 字段映射配置 - 用于解耦业务字段名与组件通用概念 * * @example * // 业务使用 columnType/ruleType 字段 * { * type: { * field: 'columnType', // 业务字段名 * virtual: 'virtual' // 虚拟列对应的业务值 * }, * direction: { * field: 'ruleType', // 业务字段名 * vertical: 'groupSum', // 竖向对应的业务值 * horizontal: 'summary' // 横向对应的业务值 * } * } * * @example * // 业务使用中文值 * { * type: { * field: 'columnType', * virtual: '虚拟列' // 业务用中文 * }, * direction: { * field: 'direction', * vertical: '竖向', // 业务用中文 * horizontal: '横向' * } * } */ export interface FieldMapping { /** * 列类型字段配置 */ type?: { /** * 业务字段名(如 'columnType') * @default 'type' */ field?: string /** * 虚拟列对应的业务值(如 'virtual' 或 '虚拟列') * @default 'virtual' */ virtual?: string } /** * 方向字段配置 */ direction?: { /** * 业务字段名(如 'ruleType') * @default 'direction' */ field?: string /** * 竖向虚拟列对应的业务值(如 'groupSum' 或 '竖向') * @default 'vertical' */ vertical?: string /** * 横向虚拟列对应的业务值(如 'summary' 或 '横向') * @default 'horizontal' */ horizontal?: string } } /** * 导出选项 */ export interface ExportOptions { data: TableRow[] columns: ColumnConfig[] filename?: string sheetName?: string fieldMapping?: FieldMapping summary?: boolean summaryText?: string } /** * 合并配置 */ export interface SpanResult { rowspan: number colspan: number } /** * 公式引擎 */ export class FormulaEngine { constructor(columns: ColumnConfig[]) execute(data: TableRow[]): TableRow[] _extractDependencies(formula: string): string[] } /** * 合并引擎 */ export class SpanEngine { constructor(mergeKeys: string | string[]) spanData: Record compute(data: TableRow[]): void getSpan(rowIndex: number, columnKey: string): SpanResult } /** * 分组汇总引擎 */ export class GroupSumEngine { constructor(columns: ColumnConfig[], fieldMapping?: FieldMapping) execute(data: TableRow[]): TableRow[] } /** * 固定行插件(Mixin) */ export const FixedRowPlugin: any /** * 公式高亮插件(Mixin) */ export const FormulaHighlighter: any /** * 虚拟滚动插件(Mixin) * 大数据量场景下只渲染可视区域内的行,减少 DOM 数量提升性能 */ export const VirtualScroll: any /** * 工具函数集合 */ export interface Utils { // 列配置工具 extractMergeKeys(columns: ColumnConfig[]): string[] findColumn(columns: ColumnConfig[], prop: string): ColumnConfig | null extractEditableStates(columns: ColumnConfig[]): Record checkColumnEditable(columns: ColumnConfig[], prop: string): boolean getLeafColumns(columns: ColumnConfig[]): ColumnConfig[] expandSummaryColumns(columns: ColumnConfig[]): ColumnConfig[] // 数据处理 processTableData( data: TableRow[], engines: { formula: FormulaEngine span: SpanEngine groupSum: GroupSumEngine }, context: any ): TableRow[] // 导出功能 getExcelExportPayload(options: ExportOptions): { rows: any[][] merges: any[] cols: any[] sheetName: string filename: string } getPdfAutoTablePayload(options: ExportOptions): any createExcelExporter(XLSX: any): (options: ExportOptions) => Promise createPdfExporter(deps: { jsPDF: any docOptions?: any prepareDoc?: (doc: any) => void | Promise }): (options: ExportOptions) => Promise // 公式工具 getFormulaLabel(formula: string, findColumn: Function): string extractDependenciesFromFormula(formula: string): string[] } export const utils: Utils /** * 国际化资源 */ export interface LocaleMessages { language: string year: string } export const zh: LocaleMessages export const en: LocaleMessages /** * ElExcelTable 组件 Props */ export interface ElExcelTableProps { columns: ColumnConfig[] // 列配置(必需) data?: TableRow[] // 表格数据,默认 [] height: number | string // 表格高度(必需) summary?: boolean // 是否显示总计行,默认 true summaryText?: string // 总计行首列文本,默认 '总计' edittext?: string // 编辑按钮文本,默认 '编辑' fixedRow?: (row: TableRow, rowIndex: number) => boolean // 固定行判断函数 fixedRowClass?: string // 固定行样式类名 editableColor?: string // 可编辑列文字颜色,默认 '#67c23a' showIndex?: boolean // 是否显示序号列,默认 true indexFollowMerge?: boolean // 索引列是否跟随行合并显示,默认 false virtualScroll?: boolean // 是否强制启用虚拟滚动,默认 false virtualThreshold?: number // 自动启用阈值,数据行数超过该值自动开启虚拟滚动,0 表示不自动,默认 100 rowHeight?: number // 虚拟滚动行高,默认 40 bufferSize?: number // 虚拟滚动上下缓冲行数,默认 5 } /** * ExcelTable 插件选项 */ export interface ExcelTableOptions { name?: string // 组件注册名称,默认 'ElExcelTable' engines?: { formula?: typeof FormulaEngine span?: typeof SpanEngine groupSum?: typeof GroupSumEngine } mixins?: any[] utils?: Partial fixedRowClass?: string fieldMapping?: FieldMapping // 字段映射配置 log?: (args: { column?: ColumnConfig; message: string; data?: any }) => void // 自定义日志函数 warnMissingFields?: boolean // 是否显示公式缺少字段的警告,默认 false editableColor?: string // 可编辑列的文字颜色,默认 '#67c23a' highlightColor?: string // 公式高亮文字颜色,默认 '#CD7533' } /** * ExcelTable 主插件 */ export interface ExcelTablePlugin extends PluginObject { install(vue: VueConstructor, options?: ExcelTableOptions): void } // 命名导出 export const ExcelTable: ExcelTablePlugin // 默认导出 const plugin: ExcelTablePlugin export default plugin } // 为 Vue 组件扩展类型 declare module 'vue/types/vue' { interface Vue { // ExcelTable 组件实例方法 toggleColumnEditable?(params: { prop: string; editable: boolean }): void toggleAllColumnsEditable?(editable: boolean): void getExportData?(): { data: any[]; columns: any[]; timestamp: number } } }