Excel Range.PivotField эквивалент для JavaScript API - PullRequest
0 голосов
/ 18 июня 2019

В API VBA / C # для Excel доступно свойство 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

1 Ответ

1 голос
/ 18 июня 2019

В JS API есть PivotLayout , в котором вы можете получить диапазоны сводной таблицы. Например, PivotTable.layout.getDataBodyRange (), PivotTable.layout.getRange ().

Вы можете получить больше информации от https://docs.microsoft.com/en-us/javascript/api/excel/excel.pivotlayout?view=office-js. (Пожалуйста, не метод getCell пока не поддерживается)

...