返回

Power BI 嵌入式报表:获取视觉对象筛选器全攻略

vue.js

获取嵌入式 Power BI 报表中视觉对象的筛选器

在 Power BI 嵌入式分析中,通过编程方式获取报表或视觉对象的筛选器是一项常见需求。 getFilters() 函数是 Power BI 客户端 API 提供的一个关键方法,用于实现这一目标。 但有时,开发者会遇到 getFilters() 函数无法按预期获取视觉对象级别筛选器的问题。 本文将深入探讨此问题的原因,并提供有效的解决方案。

问题分析

getFilters() 函数接受一个可选参数 FiltersLevel ,该参数指定要检索的筛选器级别。 FiltersLevel 枚举类型有三个可选值:

  • Report: 报表级别筛选器
  • Page: 页面级别筛选器
  • Visual: 视觉对象级别筛选器

问题在于,即使将 FiltersLevel 设置为 VisualgetFilters() 有时也只能获取到筛选器窗格中的筛选器,而无法获取到视觉对象本身应用的筛选器。 这通常是因为 Power BI 报表的交互和筛选机制较为复杂, 视觉对象内部的筛选状态可能不会立即反映到 API 层面。 另外, 某些特定类型的筛选器(如交叉筛选或钻取筛选)的处理方式也可能与预期不同。

解决方案

以下提供几种解决方案,可以帮助开发者准确获取嵌入式 Power BI 报表中视觉对象的筛选器。

1. 确保正确设置 FiltersLevel

首先,必须确保在调用 getFilters() 函数时将 FiltersLevel 参数正确设置为 pbi.models.FiltersLevel.Visual。 这是获取视觉对象级别筛选器的基础。

代码示例:

visual.getFilters(pbi.models.FiltersLevel.Visual)
.then(visualFilters => {
    console.log('视觉对象 ' + visual.title  + ' 的筛选器:', visualFilters);
})
.catch(error => {
    console.error('获取视觉对象 ' + visual.title + ' 的筛选器出错:', error);
});

操作步骤:

  1. 确保代码已正确初始化 Power BI 嵌入式报表。
  2. 获取到目标视觉对象。
  3. 调用 getFilters() 函数,并将 FiltersLevel 设置为 pbi.models.FiltersLevel.Visual
  4. 处理返回的筛选器数据或捕获错误。

2. 监听 visualLevelFiltersApplied 事件

Power BI 客户端 API 提供了一个 visualLevelFiltersApplied 事件,该事件在视觉对象级别筛选器应用后触发。 通过监听此事件,可以更准确地获取视觉对象的筛选器状态。

代码示例:

visual.on("visualLevelFiltersApplied", (eventArgs) => {
    console.log("视觉对象级别筛选器已应用:", eventArgs);
    const filters = eventArgs.filters;
    if(filters){
        console.log('视觉对象 ' + visual.title  + ' 的筛选器:', filters);
    }else {
        console.log('视觉对象 ' + visual.title  + ' 无筛选器。');
    }

});

操作步骤:

  1. 确保代码已正确初始化 Power BI 嵌入式报表并获取到目标视觉对象。
  2. 使用 on() 方法监听目标视觉对象的 visualLevelFiltersApplied 事件。
  3. 在事件处理程序中, eventArgs 对象会包含已应用的筛选器信息, 可以从中提取所需的筛选器数据。

3. 强制刷新视觉对象筛选器状态

在某些情况下,可能需要强制 Power BI 刷新视觉对象的筛选器状态。 这可以通过先清除现有筛选器,然后重新应用所需筛选器的方式实现。

代码示例:

// 清除所有视觉对象级别筛选器
visual.setFilters([] , pbi.models.FiltersLevel.Visual).then(() =>{
        // 此处添加设置视觉对象筛选器的逻辑
        console.log('已清除视觉对象 ' + visual.title + ' 的筛选器');

        const basicFilter = {
            $filter: "Table/Field eq 'Value'",  // 假设要筛选的值为 'Value'
            filterType: pbi.models.FilterType.Basic,
            target: {
              table: "Table",  // 替换成实际的表名
              column: "Field"  // 替换成实际的字段名
            }
        };

    // 设置视觉对象级别筛选器
    visual.setFilters([basicFilter], pbi.models.FiltersLevel.Visual).then(()=>{
         visual.getFilters(pbi.models.FiltersLevel.Visual)
            .then(filters => {
                 console.log('视觉对象 ' + visual.title + ' 已设置筛选器并获取:', filters);
                })
            .catch(err => {
                console.error('获取视觉对象 ' + visual.title + ' 的筛选器时出错:', err);
        });
    }).catch(err => {
            console.error('设置视觉对象 ' + visual.title + ' 的筛选器时出错:', err);
    });

}).catch(error => {
    console.error('清除视觉对象 ' + visual.title + ' 的筛选器出错:', error);
});

操作步骤:

  1. 确保代码已正确初始化 Power BI 嵌入式报表并获取到目标视觉对象。
  2. 使用 setFilters() 函数并传入空数组 [] 来清除目标视觉对象的所有筛选器。确保 FiltersLevel 参数设置为 pbi.models.FiltersLevel.Visual
  3. 构造要应用的筛选器对象。 筛选器对象需要包含筛选器类型、目标字段和筛选值等信息。
  4. 再次使用 setFilters() 函数应用新的筛选器对象。 确保 FiltersLevel 参数设置为 pbi.models.FiltersLevel.Visual
  5. 调用 getFilters() 函数获取最新的筛选器。确保 FiltersLevel 参数设置为 pbi.models.FiltersLevel.Visual

安全建议

  • 输入验证: 在应用或设置筛选器时,务必对用户输入或外部数据进行验证,防止潜在的安全风险,如注入攻击。
  • 权限控制: 根据实际需求,限制用户对 Power BI 报表和数据的访问权限,确保敏感数据不被未授权访问。
  • API 安全: 妥善保管 Power BI 嵌入式分析所需的凭据和密钥,避免泄露。

总结

获取嵌入式 Power BI 报表中视觉对象的筛选器, 关键在于正确理解 getFilters() 函数以及 Power BI 的筛选机制。 通过正确设置 FiltersLevel、监听 visualLevelFiltersApplied 事件,或强制刷新视觉对象筛选器状态, 开发者可以有效地解决 getFilters() 函数无法获取视觉对象级别筛选器的问题。 结合安全建议,可以构建更健壮、安全的 Power BI 嵌入式应用。

相关资源