【问题标题】:Excel Range.PivotField equivalent for JavaScript APIJavaScript API 的 Excel Range.PivotField 等效项
【发布时间】:2019-07-03 13:38:52
【问题描述】:

在 Excel 的 VBA/C# API 中,有可用的 Range.PivotField 属性。 JavaScript API 中是否有等效项,或者更具体地说,我可以找到绑定到活动单元格的 PivotField 吗?

我发现 JS API 中有PivotField,这些字段包含在数据透视表层次结构中,但似乎缺少指向范围的链接。或者,如果没有 Range.PivotField,是否有“PivotField.Range”,即我可以扫描工作表中的数据透视表并创建单元格-数据透视字段映射?

更新

我已经设法像这样映射数据透视表区域(行、列、正文和过滤器):

var ws = context.workbook.worksheets.getItem(event.worksheetId);
            return context.sync().then(function () {
                ws.load('pivotTables');
            })
                .then(context.sync)
                .then(function () {
                    ws.pivotTables.items.forEach(function (value, index) {

                        value.load('layout');
                        value.load('name');
                        value.load('rowHierarchies');
                        value.load('columnHierarchies');
                        value.load('dataHierarchies');
                        value.load('filterHierarchies');
                        //value.context.sync().then(function () {
                        sheetPivotTables[event.worksheetId][index] = {
                            Layout: value.layout,
                            Name: value.name,
                            RowHierarchies: value.rowHierarchies,
                            ColumnHierarchies: value.columnHierarchies,
                            DataHierarchies: value.dataHierarchies,
                            FilterHierarchies: value.filterHierarchies,

                            RowRange: null,
                            ColumnRange: null,
                            DataRange: null,
                            FilterRange: null,
                            Range: null
                        };
                    });
                })
                .then(context.sync)
                .then(function () {
                    sheetPivotTables[event.worksheetId].forEach(function (item, index) {
                        var rowHierarchyCount = 0;
                        if (item.RowHierarchies != undefined) {
                            // empty row hierarchy count = 0!
                            rowHierarchyCount = item.RowHierarchies.getCount();
                        }
                        item.RowHierarchyCount = rowHierarchyCount;

                        var columnHierarchyCount = 0;
                        if (item.ColumnHierarchies != undefined) {
                            // empty column hiearchy count = 1!
                            columnHierarchyCount = item.ColumnHierarchies.getCount();
                        }
                        item.ColumnHierarchyCount = columnHierarchyCount;

                        var dataHierarchyCount = 0;
                        if (item.DataHierarchies != undefined) {
                            // empty data hiearchy count = 0!
                            dataHierarchyCount = item.DataHierarchies.getCount();
                        }
                        item.DataHierarchyCount = dataHierarchyCount;

                        var filterHierarchyCount = 0;
                        if (item.FilterHierarchies != undefined) {
                            // empty filter hiearchy count = 0!
                            filterHierarchyCount = item.FilterHierarchies.getCount();
                        }
                        item.FilterHierarchyCount = filterHierarchyCount;
                    });
                })
                .then(context.sync)
                .then(function () {
                    sheetPivotTables[event.worksheetId].forEach(function (item, index) {

                        item.Range = item.Layout.getRange();
                        item.Range.load('rowCount');
                        item.Range.load('columnCount');
                        item.Range.load('rowIndex');
                        item.Range.load('columnIndex');

                        if (item.RowHierarchyCount.m_value > 0) {
                            // empty row hierarchy count = 0!
                            item.RowRange = item.Layout.getRowLabelRange();
                            item.RowRange.load('rowCount');
                            item.RowRange.load('columnCount');
                            item.RowRange.load('rowIndex');
                            item.RowRange.load('columnIndex');
                        }

                        if (item.ColumnHierarchyCount.m_value > 1) {
                            // empty column hiearchy count = 1!
                            item.ColumnRange = item.Layout.getColumnLabelRange();
                            item.ColumnRange.load('rowCount');
                            item.ColumnRange.load('columnCount');
                            item.ColumnRange.load('rowIndex');
                            item.ColumnRange.load('columnIndex');
                        }

                        if (item.DataHierarchyCount.m_value > 0) {
                            // empty data hiearchy count = 0!
                            item.DataRange = item.Layout.getDataBodyRange();
                            item.DataRange.load('rowCount');
                            item.DataRange.load('columnCount');
                            item.DataRange.load('rowIndex');
                            item.DataRange.load('columnIndex');
                        }

                        if (item.FilterHierarchyCount.m_value > 0) {
                            // empty filter hiearchy count = 0!
                            item.FilterRange = item.Layout.getFilterAxisRange();
                            item.FilterRange.load('rowCount');
                            item.FilterRange.load('columnCount');
                            item.FilterRange.load('rowIndex');
                            item.FilterRange.load('columnIndex');
                        }
                    });
                })
                .then(context.sync);

然后可以在表体中找到选定的数据透视表和选定的数据项(参见getDataHierarchy):

selectedDataItem = selectedPivotTable.layout.getDataHierarchy(selectedRange);

轴仍然是问题。 getPivotItems 应该在这里工作,但它似乎只在相应轴上没有项目时返回正确的空数组。否则它会在最近的context.sync() 调用处停止事件处理程序的执行:

...
                    selectedPivotItems = selectedPivotTable.layout.getPivotItems("column", selectedRange);

                })
                .then(context.sync)
...

我报告了这个,现在它是一个开放的错误:https://github.com/OfficeDev/office-js/issues/569

【问题讨论】:

    标签: excel office-js excel-addins


    【解决方案1】:

    在 JS API 中,有一个 PivotLayout 可以获取数据透视表的范围。例如,PivotTable.layout.getDataBodyRange()、Pivo​​tTable.layout.getRange()。

    您可以从https://docs.microsoft.com/en-us/javascript/api/excel/excel.pivotlayout?view=office-js 获得更多信息。 (请注意目前还不支持 getCell 方法)

    【讨论】:

    • 谢谢,这可以工作,首先使用 getRowLabelRange()、getColumnLabelRange()、getDataBodyRange() 和 getFilterAxisRange() 将数据透视表划分为轴,然后使用适当的轴名称调用 getPivotItems(axisString, cell)获取 PivotItem。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    相关资源
    最近更新 更多