利用Tableau Document API构建数据字典:工作表映射与描述获取问题
用Tableau Document API提取工作表信息:名称、描述及所属仪表板
我需要从大型Tableau工作簿中生成一个包含以下列的表格:
- Worksheet:工作表名称
- Description:通过Ctrl+E设置的工作表描述内容
- Dashboard:工作表所属的仪表板(无则为NaN)
目前已经用Tableau Document API获取了仪表板和工作表列表,但无法实现二者的映射关联,也找不到获取工作表描述的方法。
解决方案实现
1. 关联工作表与所属仪表板
每个仪表板对象的objects属性包含它引用的所有工作表(类型为WorksheetObject),我们可以遍历所有仪表板,反向构建工作表到仪表板的映射关系。
2. 获取工作表描述
工作表的描述存储在工作簿XML的<description>标签中,Tableau Document API的Worksheet对象没有直接提供这个属性,需要通过lxml解析对应的XML节点提取。
完整代码
from tableaudocumentapi import Workbook from lxml import etree as ET # 打开Tableau工作簿 wb = Workbook('geocoding.twbx') # 构建工作表到仪表板的映射字典 worksheet_to_dashboards = {ws.name: [] for ws in wb.worksheets} # 遍历仪表板,关联工作表与所属仪表板 for dashboard in wb.dashboards: for obj in dashboard.objects: if obj.type == 'worksheet': worksheet_to_dashboards[obj.name].append(dashboard.name) # 提取工作表描述并整理最终结果 result_list = [] for ws in wb.worksheets: # 解析XML获取描述文本 desc_node = ws._element.find('.//description') description = desc_node.text.strip() if (desc_node is not None and desc_node.text) else '' # 处理仪表板字段,无关联则显示NaN linked_dashboards = worksheet_to_dashboards[ws.name] dashboard_field = ', '.join(linked_dashboards) if linked_dashboards else 'NaN' result_list.append({ 'Worksheet': ws.name, 'Description': description, 'Dashboard': dashboard_field }) # 打印结果(可替换为导出CSV等逻辑) print("Worksheet\tDescription\tDashboard") for item in result_list: print(f"{item['Worksheet']}\t{item['Description']}\t{item['Dashboard']}")
代码说明
- 先初始化映射字典,确保所有工作表都被覆盖,避免遗漏无关联仪表板的工作表
- 遍历仪表板时筛选出工作表类型的对象,将仪表板名称追加到对应工作表的关联列表中
- 通过
ws._element访问工作表的XML元素,用XPath定位<description>标签提取内容 - 最终结果整理为字典列表,可直接用于生成表格或导出为CSV格式
内容的提问来源于stack exchange,提问作者Michael Ferral
相关产品推荐
相关产品推荐

