获取单元格数据
上一篇
表格自适应
下一篇
注册 AntV/G 插件
Loading...
在实际的业务场景中,我们往往会遇到一些需要获取单元格数据的场景,常见的比如:
click
hover
事件 获取当前对应单元格数据。tooltip
内容,需要根据当前单元格信息来渲染不同的操作项,或者显示不同的提示信息。S2
的表格使用 Canvas
绘制,所以只会有一个 dom
元素,所有单元格对应的一组数据结构,里面存储了每个单元格的坐标,文本信息,交互状态等 信息
S2
提供了一系列获取数据的 API, 下面介绍一些常用的场景:
在渲染完成后,访问 s2.facet.getLayoutResult()
获取到当前所有(含不在可视范围的)单元格节点。
一个节点 (Node) 对应一个 单元格 (Cell), 当节点在可视范围内时,会被实例化为单元格 (Cell), 可通过 node.belongsCell
获取
await s2.render()// 确保在 s2.render() 之后获取console.log(s2.facet.getLayoutResult())
或者
import { S2Event } from '@antv/s2's2.on(S2Event.LAYOUT_AFTER_RENDER, () => {console.log(s2.facet.getLayoutResult())})
cornerNodes
角头节点seriesNumberNodes
序号列节点colLeafNodes
列头叶子节点colNodes
列头节点colsHierarchy
列头层级信息rowLeafNodes
行头叶子节点rowNodes
行头节点rowsHierarchy
行头层级信息由于虚拟滚动的特性,获取到为不含可视区域外的单元格。
s2.facet.getRowCells()s2.facet.getRowLeafCells()
s2.facet.getColCells()s2.facet.getColLeafCells()
s2.facet.getCornerCells()
s2.facet.getMergedCells()
s2.facet.getSeriesNumberCells()
更多请查看 interaction API
// 当前可视范围内的数值单元格s2.facet.getDataCells()// 当前可视范围内未选中的数值单元格s2.interaction.getUnSelectedDataCells()
s2.facet.getHeaderCells()
s2.facet.getCells()
s2.facet.getCellsByField(field)
s2.facet.getCellById(id)
s2.getCell(event.target)
cell.getMeta()
以点击行头单元格为例
import { S2Event } from '@antv/s2's2.on(S2Event.ROW_CELL_CLICK, (event) => {// 根据 event.target 拿到表格内部当前坐标对应的单元格const cell = s2.getCell(event.target)// 获取当前单元格对应的信息const meta = cell.getMeta()})
当然,任何能拿到 event
的地方你都可以通过这种方式拿到数据
在单选,多选,刷选等场景,在选中后会透出 S2Event.GLOBAL_SELECTED
事件,可以获取到选中的单元格
s2.on(S2Event.GLOBAL_SELECTED, (cells) => {console.log('选中的单元格', cells)})
也可以调用 交互方法, 手动的获取
// 获取所有激活的单元格 (包含不在可视范围内的)s2.interaction.getCells();// 获取所有激活的单元格 (不含不在可视范围内的)s2.interaction.getActiveCells();// 是否是选中状态s2.interaction.isSelectedState();// 是否是刷选状态s2.interaction.isBrushSelectedState();// 获取当前交互状态s2.interaction.getCurrentStateName();// 获取当前发生过交互的单元格s2.interaction.getInteractedCells();// 获取未选中的单元格s2.interaction.getUnSelectedDataCells();
import { EXTRA_FIELD } from '@antv/s2'// 获取明细单元格s2.dataSet.getCellData({query: {province: '浙江',city: '杭州',type: '笔',[EXTRA_FIELD]: 'price',},});// 获取小计数据s2.dataSet.getCellData({query: {province: '浙江',type: '笔',[EXTRA_FIELD]: 'price',},isTotals: true,});
import { EXTRA_FIELD, QueryDataType } from '@antv/s2'// 获取所有浙江下的数据s2.dataSet.getCellMultiData({query: {province: '浙江',[EXTRA_FIELD]: 'price',},queryType: QueryDataType.All,});// 获取所有浙江下的明细数据s2.dataSet.getCellMultiData({query: {province: '浙江',[EXTRA_FIELD]: 'price',},queryType: QueryDataType.DetailOnly,});
表格初始化时,会将用户声明的数据配置 (s2DataConfig) 转换成内部所需要的数据集 (dataSet), 具体请查看 数据流处理
数据集的 实例 挂载在 s2.dataSet
命名空间下,可访问它获取你需要的:
还是以点击行头单元格为例:
s2.on(S2Event.ROW_CELL_CLICK, (event) => {// 首先拿到单元格当前信息const cell = s2.getCell(event.target)const meta = cell.getMeta()// 获取当前行数据const rowData = s2.dataSet.getCellMultiData({ query: meta.query })// 获取当前行头单元格数据:const rowCellData = s2.dataSet.getCellData({ query: meta.query })// 获取当前行头维值const dimensionValues = s2.dataSet.getDimensionValues(meta.field)console.log('当前行数据:', rowData)console.log('当前行头单元格数据:', rowCellData)console.log('当前行头维值:', dimensionValues)})
s2.on(S2Event.DATA_CELL_CLICK, (event) => {// 获取当前单元格const cell = s2.getCell(event.target)// 获取当前单元格元数据const meta = cell.getMeta()// 获取当前行数据const rowData = s2.dataSet.getCellMultiData({ query: meta.rowQuery })// 获取当前列数据const colData = s2.dataSet.getCellMultiData({ query: meta.colQuery })console.log('当前列数据:', colData)console.log('当前行数据:', rowData)console.log('当前单元格数据:', meta.data)/**{"raw": {"number": 632,"province": "浙江省","city": "绍兴市","type": "家具","sub_type": "沙发"},"extraField": "number"}*/})
s2.on(S2Event.DATA_CELL_CLICK, (event) => {// 获取当前单元格const cell = s2.getCell(event.target)// 获取当前单元格元数据const meta = cell.getMeta()// 获取当前行数据 (明细表一行对应一条数据)const rowData = s2.dataSet.getCellMultiData({// 等价于 query: { rowIndex: meta.rowIndex }query: meta.rowQuery})[0]// 获取当前列数据const colData = s2.dataSet.getCellMultiData({// 等价于 query: { colIndex: meta.colIndex }query: meta.colQuery})console.log('当前列数据:', colData)console.log('当前行数据:', rowData) // { province: '吉林', city: '长春', type: '笔', price: 8 }console.log('当前单元格数据:', meta.data) // { city: '长春' }})
如图,比如我们想获取舟山市下的办公用品纸张的数量
// 找到 "舟山市" 对应的行头单元格节点const rowCellNode = s2.facet.getRowNodes().find((node) => node.id === 'root[&] 浙江省 [&] 舟山市')// 找到 "办公用品" 下 "纸张" 对应的 "数量"列头单元格节点const colCellNode = s2.facet.getColNodes().find((node) => node.id === 'root[&] 办公用品 [&] 纸张 [&]number')const data = s2.dataSet.getCellMultiData({query: {...rowCellNode.query,...colCellNode.query}})// 或者const cellMeta = s2.facet.getCellMeta(rowCellNode?.rowIndex,colCellNode?.colIndex,);/**[{"raw": {"number": 1634,"province": "浙江省","city": "舟山市","type": "办公用品","sub_type": "纸张"},"extraField": "number"}]*/
s2.facet.getCellMeta(rowIndex, colIndex)