Richard.Ma 发表于 2022-9-15 17:44:27

【SpreadJS v15.2 新特性介绍】透视表支持数据区域的编辑,以及通过代码回写数据源

本帖最后由 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为数据透视表,下方的PivotTable Details是通过getPivotDetails方法获取到的

未修改透视表数据前


修改透视表单元格数据为500,可以看到和对应的明细数据已经不匹配


执行回写方法,数据源数据被修改,从getPivotDetails得到的明细行可以看到,数据源中对应2行的单元格值被设置为了平均值250













页: [1]
查看完整版本: 【SpreadJS v15.2 新特性介绍】透视表支持数据区域的编辑,以及通过代码回写数据源