excel - 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
解决方案
在 JS API 中,有一个PivotLayout可以获取数据透视表的范围。例如,PivotTable.layout.getDataBodyRange()、PivotTable.layout.getRange()。
您可以从https://docs.microsoft.com/en-us/javascript/api/excel/excel.pivotlayout?view=office-js获取更多信息。(请注意目前还不支持 getCell 方法)
推荐阅读
- python - 如何修复'TypeError:需要类似字节的对象,而不是tts python代码中的'str''错误
- db2 - 无法将布尔值从 csv 加载到 db2 中的表中
- c++ - 通过 `void *` 和 C++ `extern "C"` 函数调用在 C 中初始化 C++ 类
- javascript - 如何仅扩展平面列表中的一项
- streamsets - 是否可以在 StreamSets 的 HTTP 客户端处理器中使用记录字段作为 URL 参数?
- angular - Angular 6 ng2-file-upload 带文件的发送列表
- reactjs - 处理事件监听器
- python-3.x - 我想使用python将一个excel列数据复制到另一个excel行数据
- laravel - 如何动态设置laravel中每页的最大值?
- android - 是否可以在不使用 Unity 的情况下确定 ARCore / Sceneform(增强现实)中的用户注视?