vue 表格组件 vxe-table 如何实现 Excel 单元格选择样式
vxe-table 的区域选取能力可以模拟 Excel 的选择体验:选中单元格后,高亮所在行与列,让人一眼看清当前位置;还可以让“选中单元格”自动扩展为“选中整行”。本文说明这两个效果分别由哪些配置控制,并列出生效前提与已知限制。
vxe-table 如何实现 Excel 式的单元格选择样式?
同时开启 mouseConfig.area 与 areaConfig 中的 showColumnStatus、showRowStatus,选中单元格后即高亮所在列与行,形成类似 Excel 的十字定位效果。
- 生效前提:
- mouseConfig.area 必须为 true,否则区域选取整体不启用,areaConfig 中的样式配置也不会生效。
- areaConfig.showColumnStatus 与 showRowStatus 需分别开启,二者独立控制列状态与行状态。
- 表格需设置固定 height,否则滚动区域高度不确定,选区滚动同步可能异常。
预期结果:鼠标点击任意单元格,该单元格所在整列与整行出现高亮状态,视觉上接近 Excel 的当前行列指示。
vxe-table 如何让选中单元格自动选中整行?
在 areaConfig 中设置 selectCellToRow: true,点击单元格时会联动选中整行。
开启后第一列将不可操作。这是因为该列承担了“行选择”的锚点角色,点击第一列不会进入单元格编辑或普通选取,而是直接触发行选中。若第一列是 seq 序号列或复选框列,需确认这与业务交互不冲突。
与行列状态的关系:selectCellToRow 控制选中范围,showRowStatus / showColumnStatus 控制视觉高亮,两者可独立使用,也可组合达到“选中整行 + 高亮行列”的效果。
代码

<template>
<div>
<vxe-grid v-bind="gridOptions"></vxe-grid>
</div>
</template>
<script setup>
import { reactive } from 'vue'
const gridOptions = reactive({
border: true,
height: 600,
showOverflow: true,
columnConfig: {
resizable: true,
minWidth: 120
},
rowConfig: {
resizable: true
},
resizableConfig: {
isDblclickAutoWidth: true // 启用双击自适应列宽
},
mouseConfig: {
area: true // 是否开启区域选取
},
areaConfig: {
multiple: true, // 是否启用多区域选取功能
showColumnStatus: true, // 选择单元格后显示列状态
showRowStatus: true, // 选择单元格后显示行状态
selectCellToRow: true // 选择单元格自动选中行
},
editConfig: {
mode: 'cell', // 单元格编辑模式
trigger: 'dblclick' // 双击单元格激活编辑状态
},
keyboardConfig: {
arrowCursorLock: true, // 方向键光标锁,开启后处于非聚焦式编辑状态,将支持在编辑状态中通过方向键切换单元格。(切换为聚焦编辑状态,可以按 F2 键或者鼠标左键点击输入框,就可以用方向键左右移动输入框的光标)
isClip: true, // 是否开启复制粘贴
isArrow: true, // 是否开启方向键功能
isShift: true, // 是否开启同时按住方向键以活动区域为起始,向指定方向扩展单元格区域
isTab: true, // 是否开启 Tab 键功能
isEnter: true, // 是否开启回车键功能
isEdit: true, // 是否开启任意键进入编辑(功能键除外)
isBack: true, // 是否开启Backspace键功能
isDel: true, // 是否开启删除键功能
isEsc: true, // 是否开启Esc键关闭编辑功能
isFNR: true, // 是否开启查找与替换
isMerge: true // 是否开启单元格合并功能
},
clipConfig: {
isAcrossRow: true, // 是否启用对相同列数的跨行选取多区域进行复制粘贴
isAcrossColumn: true // 是否启用对相同行数的跨列选取多区域进行复制粘贴
},
columns: [
{ type: 'seq', fixed: 'left', width: 60, rowResize: true },
{ field: 'a', title: 'A', editRender: { name: 'input' } },
{ field: 'b', title: 'B', editRender: { name: 'input' } },
{ field: 'c', title: 'C', editRender: { name: 'input' } },
{ field: 'd', title: 'D', editRender: { name: 'input' } },
{ field: 'e', title: 'E', editRender: { name: 'input' } },
{ field: 'f', title: 'F', editRender: { name: 'input' } },
{ field: 'g', title: 'G', editRender: { name: 'input' } },
{ field: 'h', title: 'H', editRender: { name: 'input' } },
{ field: 'i', title: 'I', editRender: { name: 'input' } },
{ field: 'j', title: 'J', editRender: { name: 'input' } }
],
data: [
{ id: 10001, a: 'Test1', b: '', c: '', d: '', e: '', f: '', g: '', h: '', i: '', j: '', k: '' },
{ id: 10002, a: 'Test2', b: 'abcdef abcdef abcdef abcdef', c: '', d: '', e: '', f: '', g: '', h: '', i: '', j: '', k: '' },
{ id: 10003, a: 'Test3', b: '', c: '', d: '', e: '', f: '', g: '', h: '', i: '', j: '', k: '' },
{ id: 10004, a: 'Test4', b: 'abcdef abcdef abcdef', c: '', d: '', e: '', f: '', g: '', h: '', i: '', j: '', k: '' },
{ id: 10005, a: 'Test5', b: '', c: '', d: '', e: '', f: '', g: '', h: '', i: '', j: '', k: '' },
{ id: 10006, a: 'Test6', b: 'abcdef', c: '', d: '', e: '', f: '', g: '', h: '', i: '', j: '', k: '' },
{ id: 10007, a: 'Test7', b: '', c: '', d: '', e: '', f: '', g: '', h: '', i: '', j: '', k: '' },
{ id: 10008, a: 'Test8', b: 'abcdef abcdef abcdef abcdef abcdef abcdef', c: '', d: '', e: '', f: '', g: '', h: '', i: '', j: '', k: '' },
{ id: 10009, a: 'Test9', b: '', c: '', d: '', e: '', f: '', g: '', h: '', i: '', j: '', k: '' },
{ id: 10010, a: 'Test10', b: '', c: '', d: '', e: '', f: '', g: '', h: '', i: '', j: '', k: '' },
{ id: 10011, a: 'Test11', b: '', c: '', d: 'abcdef abcdef abcdef abcdef abcdef abcdef', e: '', f: '', g: '', h: '', i: '', j: '', k: '' },
{ id: 10012, a: 'Test12', b: '', c: '', d: '', e: '', f: '', g: '', h: '', i: '', j: '', k: '' },
{ id: 10013, a: 'Test13', b: '', c: '', d: 'abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef', e: '', f: '', g: '', h: '', i: '', j: '', k: '' },
{ id: 10014, a: 'Test14', b: '', c: '', d: 'abcdef abcdef abcdef', e: '', f: '', g: '', h: '', i: '', j: '', k: '' },
{ id: 10015, a: 'Test15', b: '', c: '', d: '', e: '', f: '', g: '', h: '', i: '', j: '', k: '' },
{ id: 10016, a: 'Test16', b: '', c: '', d: '', e: '', f: '', g: '', h: '', i: '', j: '', k: '' },
{ id: 10017, a: 'Test17', b: '', c: '', d: '', e: '', f: '', g: '', h: '', i: '', j: '', k: '' },
{ id: 10018, a: 'Test18', b: '', c: '', d: '', e: '', f: '', g: '', h: '', i: '', j: '', k: '' },
{ id: 10019, a: 'Test19', b: '', c: '', d: '', e: '', f: '', g: '', h: '', i: '', j: '', k: '' },
{ id: 10020, a: 'Test20', b: '', c: '', d: '', e: '', f: '', g: '', h: '', i: '', j: '', k: '' },
{ id: 10021, a: 'Test21', b: '', c: '', d: '', e: '', f: '', g: '', h: '', i: '', j: '', k: '' },
{ id: 10022, a: 'Test22', b: '', c: '', d: '', e: '', f: '', g: '', h: '', i: '', j: '', k: '' },
{ id: 10023, a: 'Test23', b: '', c: '', d: '', e: '', f: '', g: '', h: '', i: '', j: '', k: '' }
]
})
</script>
预期结果:点击单元格后,所在行与列同步高亮;由于开启了 selectCellToRow,点击非第一列的任意单元格会选中整行;第一列不响应单元格编辑,仅作为行选择锚点。
相关配置参数
| mouseConfig.area | Boolean | false | 区域选取总开关,必须开启 |
|---|---|---|---|
| areaConfig.multiple | Boolean | false | 是否允许多区域选取 |
| areaConfig.showColumnStatus | Boolean | false | 选中单元格后高亮所在列 |
| areaConfig.showRowStatus | Boolean | false | 选中单元格后高亮所在行 |
| areaConfig.selectCellToRow | Boolean | false | 选中单元格自动选中整行;开启后第一列不可操作 |
| resizableConfig.isDblclickAutoWidth | Boolean | false | 双击列边界自适应列宽 |
| clipConfig.isAcrossRow | Boolean | false | 允许相同列数的跨行多区域复制粘贴 |
| clipConfig.isAcrossColumn | Boolean | false | 允许相同行数的跨列多区域复制粘贴 |
注意事项
- selectCellToRow 的副作用必须提前确认
- 开启后第一列不可操作。若第一列是复选框列,用户将无法通过单元格点击切换选中状态;若第一列是序号列,则点击序号列会直接选中整行。建议在业务文档中明确这一交互变化。
- 行列状态是视觉层,不改变数据
- showColumnStatus 与 showRowStatus 只影响高亮样式,不会修改选区数据范围。真正决定复制、编辑范围的是 areaConfig 的选区逻辑。
- arrowCursorLock 与 Excel 体验
- 开启 arrowCursorLock: true 后,非聚焦编辑状态下方向键用于切换单元格;按 F2 或点击输入框进入聚焦编辑后,方向键用于移动光标。这与 Excel 的编辑/导航切换逻辑接近。
- 多区域选取与行列高亮
- 同时开启 multiple: true 时,可选取多个不连续区域。行列状态高亮可能只作用于当前活动区域,具体表现以实际版本为准。
- 跨行/跨列复制
- clipConfig.isAcrossRow 与 isAcrossColumn 影响多区域复制的粘贴行为,与选择样式无关,但常与区域选取一起使用,建议按需开启。

浙公网安备 33010602011771号