首页 > 解决方案 > Excel Range.PivotField 等效于 JavaScript API

问题描述

在 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

标签: exceloffice-jsexcel-addins

解决方案


在 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 方法)


推荐阅读