【发布时间】: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