【发布时间】:2017-09-01 14:55:44
【问题描述】:
在 Excel 中,用户可以选择一个范围并点击 Ctrl+Shift+L 以显示过滤器。我正在尝试从 Office.js 加载项中获得等效行为。
我最接近的方法是在我想要过滤的范围内添加一个表格,然后在表格中添加一个过滤器。然而,这似乎存在一些重大问题。
首先,以这种方式为超过 30000 行添加一个表非常慢,而且我经常使用比这大得多的表。如果我在该大小的范围内执行 Ctrl+Shift+L ,则它是瞬时的。
此外,当我添加表格时,Office.js 会对范围进行样式化。我不想为我只想添加一个过滤器的范围添加任何新样式。
我当前的代码如下所示:
await Excel.run(async ctx => {
const table = await getOrCreateDataTable(ctx, "CostData", new ExcelRange(this.stateService.headerRow)); //see below
const validationColumn: Excel.TableColumn = table.columns.getItemOrNullObject("Validation");
validationColumn.filter.applyCustomFilter(`*${searchString}*`)
await ctx.sync();
});
export const getOrCreateDataTable = async(ctx: Excel.RequestContext, tableName: string, headerRow: ExcelRange): Promise < Excel.Table > => {
let table: Excel.Table = ctx.workbook.tables.getItemOrNullObject(tableName)
await ctx.sync();
if (!table.isNullObject)
console.log(`Table: ${tableName} found`)
else {
const sheet = await getSheet(ctx, headerRow.sheet)
const headerRange = sheet.getRange(headerRow.getRange()).getEntireRow().getUsedRange()
const usedRange: Excel.Range = sheet.getUsedRange()
const tableRange = headerRange.getBoundingRect(usedRange.getLastCell())
table = ctx.workbook.tables.add(tableRange, true)
table.name = tableName
await ctx.sync();
}
return table;
}
【问题讨论】:
标签: office-js