2017-09-01 1 views
1

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; 
} 

Répondre

0

Actuellement ExcelApi ne supporte que le filtrage sur un objet Table.

Ce que vous cherchez ici serait un support pour filtrer un Range. Je recommande fortement de visiter le UserVoice et cette suggestion.