找回密码
 立即注册

QQ登录

只需一步,快速开始

本帖最后由 Richard.Ma 于 2022-9-19 09:28 编辑

正常情况下,数据透视表中的值是无法编辑的,因为所有透视表中的所有数据都是数据源区域经过统计计算得出的。但是在一些使用场景中,用户需要编辑数据透视结果。

SpreadJS V15.2中,我们提供了编辑透视表中的单元格值的功能。可以覆盖原来的计算结果,编辑后的值还可以继续做小计计算。


编辑值只能保证其父节点小计数据的正确计算,但是不能保证其子节点小计数据的正确计算

启用透视表数据编辑功能


要编辑数据透视表的值,首先需要启用透视表数据编辑功能,可以通过下面的代码设置
  1. pivotTable.options.enableDataValueEditing=true
复制代码



编辑数据

启用透视表数据编辑功能后,在透视表UI界面中,即可直接对单元格进行编辑。

如果需要通过代码编辑的话,可以参考下面的代码,下面的代码中给透视表中当前选中的单元格修改值为500
  1. let nodeInfo = pivotTable.getNodeInfo(sheet.getActiveRowIndex(), sheet.getActiveColumnIndex());
复制代码
可以通过pivotTable.getNodeValue(nodeInfo)



PivotNodeInfo


在上面的代码中,我们看到了有一个nodeInfo ,这个是我们定义了一个接口IPivotNodeInfo,它可以描述数据透视表的一个单元格节点的字段和值信息。IPivotNodeInfo 包括了fieldInfos和valueInfo,以下图的透视表为例
image.png720142516.png

选中的C6单元格,通过getNodeInfo得到的信息如下,可以看到fieldInfos包含了对行字段和列字段的字段名称和值的描述valueInfo包含了统计方式:
  1. {
  2.     "fieldInfos": [
  3.         {
  4.             "fieldName": "Salesperson",
  5.             "fieldItem": "Bob"
  6.         },
  7.         {
  8.             "fieldName": "Cars",
  9.             "fieldItem": "BMW"
  10.         },
  11.         {
  12.             "fieldName": "Date",
  13.             "fieldItem": "Qtr3"
  14.         }
  15.     ],
  16.     "valueInfo": {
  17.         "sourceName": "Totals",
  18.         "subtotalType": 8
  19.     }
  20. }
复制代码


通过自己定义一个上述的nodeInfo,作为setNodeValue的参数,也可以设置数据透视表值




回写数据源以同步值


透视表在编辑数据后,单元格值已经不是数据源的统计结果了,此时,通过getPivotDetails方法,可以获取到此节点在数据源区域所对应的明细行,
对这些明细行的值进行修改,可以使其统计结果能匹配透视表中已修改的值

通过下面的代码可以实现对数据源的回写,下面的例子中,会将统计值进行平均,回写到数据源单元格中,你也可以采用其他的方式来回写(比如按照明细行各单元格值的比例)
  1. //pivotTable: 数据透视表
复制代码





来看一下效果,上方的PivotTable为数据透视表,下方的PivotTable Details是通过getPivotDetails方法获取到的
image.png551134337.png

未修改透视表数据前


image.png407776488.png

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


image.png461735839.png

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













0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部