Dans Excel, un utilisateur peut sélectionner une plage et appuyez sur Ctrl + Maj +L pour afficher les filtres. J'essaie d'obtenir un comportement équivalent à partir d'un complément Office.js.filtrer les données Office Excel JS
Le plus proche que j'ai trouvé est d'ajouter une table sur la plage que je veux filtrer et ensuite ajouter un filtre à la table. Il semble y avoir quelques problèmes importants avec cela cependant. Tout d'abord, ajouter une table de cette façon pour 30000+ lignes est très lent et j'utilise fréquemment des tables beaucoup plus grandes. Si je le fais Ctrl + Shift + L sur une plage de cette taille, il est instantané.
En outre, lorsque j'ajoute la table, Office.js stylise la plage. Je ne veux pas de nouveau style pour la gamme, je veux juste un filtre ajouté.
Mon code actuel ressemble à ceci:
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;
}