本帖最后由 Richard.Ma 于 2022-9-19 09:28 编辑
正常情况下,数据透视表中的值是无法编辑的,因为所有透视表中的所有数据都是数据源区域经过统计计算得出的。但是在一些使用场景中,用户需要编辑数据透视结果。
SpreadJS V15.2中,我们提供了编辑透视表中的单元格值的功能。可以覆盖原来的计算结果,编辑后的值还可以继续做小计计算。
编辑值只能保证其父节点小计数据的正确计算,但是不能保证其子节点小计数据的正确计算
启用透视表数据编辑功能
要编辑数据透视表的值,首先需要启用透视表数据编辑功能,可以通过下面的代码设置
- pivotTable.options.enableDataValueEditing=true
复制代码
编辑数据
启用透视表数据编辑功能后,在透视表UI界面中,即可直接对单元格进行编辑。
如果需要通过代码编辑的话,可以参考下面的代码,下面的代码中给透视表中当前选中的单元格修改值为500
- let nodeInfo = pivotTable.getNodeInfo(sheet.getActiveRowIndex(), sheet.getActiveColumnIndex());
复制代码 可以通过pivotTable.getNodeValue(nodeInfo)
PivotNodeInfo
在上面的代码中,我们看到了有一个nodeInfo ,这个是我们定义了一个接口IPivotNodeInfo,它可以描述数据透视表的一个单元格节点的字段和值信息。IPivotNodeInfo 包括了fieldInfos和valueInfo,以下图的透视表为例
选中的C6单元格,通过getNodeInfo得到的信息如下,可以看到fieldInfos包含了对行字段和列字段的字段名称和值的描述,valueInfo包含了统计方式:
- {
- "fieldInfos": [
- {
- "fieldName": "Salesperson",
- "fieldItem": "Bob"
- },
- {
- "fieldName": "Cars",
- "fieldItem": "BMW"
- },
- {
- "fieldName": "Date",
- "fieldItem": "Qtr3"
- }
- ],
- "valueInfo": {
- "sourceName": "Totals",
- "subtotalType": 8
- }
- }
复制代码
通过自己定义一个上述的nodeInfo,作为setNodeValue的参数,也可以设置数据透视表值
回写数据源以同步值
透视表在编辑数据后,单元格值已经不是数据源的统计结果了,此时,通过getPivotDetails方法,可以获取到此节点在数据源区域所对应的明细行,
对这些明细行的值进行修改,可以使其统计结果能匹配透视表中已修改的值
通过下面的代码可以实现对数据源的回写,下面的例子中,会将统计值进行平均,回写到数据源单元格中,你也可以采用其他的方式来回写(比如按照明细行各单元格值的比例)
来看一下效果,上方的PivotTable为数据透视表,下方的PivotTable Details是通过getPivotDetails方法获取到的
未修改透视表数据前
修改透视表单元格数据为500,可以看到和对应的明细数据已经不匹配
执行回写方法,数据源数据被修改,从getPivotDetails得到的明细行可以看到,数据源中对应2行的单元格值被设置为了平均值250
|