如何提取Tableau打包工作簿中的自定义图形和数据集
2020-01-06 本文已影响0人
扫地sir
最近学习了一下Robert关于如何提取Tableau中自定义图形的文章,方法非常简单,只需使用大神提供的excel文件,就可以轻松完成。
文章地址:https://www.clearlyandsimply.com/clearly_and_simply/2014/05/extract-custom-shapes-from-a-tableau-workbook.html
excel文件下载地址:https://www.clearlyandsimply.com/files/2014/05/extract_custom_shapes_from_tableau.xlsm
我随便在public上找了一个《权游》的Viz,我们试着提取里面的族徽。
第一步:解包
右键点击twbx文件,选择“解包”,就会出现一个twb文件和一个文件夹。
文件夹里面又有两个文件夹,分别是Date和Image,包含数据集和背景图之类的图片,但这里并不包含自定义图形。
image.png第二步:提取
打开下载好的xlsm文件,点击按钮,选择刚刚解包的twb文件(excel务必要启用宏功能)
确定了工作簿之后,自定义图形就提取好了
找到提取后的文件夹,自定义图形都在里面。
大家可以自己试一试,没有任何难度。
另外本着继续探究原理的精神,我稍微研究了一下实现原理,并用python复现了功能。
用记事本打开twb文件,可以发现存储格式就是xml,所有的自定义图形都存储在/external/shapes这个节点下面,并用base64编码。那么我就尝试着用python的xml库,遍历相关节点并解码,就可以获得自定义图形了。
代码如下:
from xml.etree import ElementTree as ET
import base64
twb_path= 'D:/Screen Time of Top 100 Characters of Game of Thrones.twb' #确定提取文件的路径
twb_xml= ET.parse(twb_path) #读取文件
shapes= twb_xml.findall('./external/shapes') #读取节点数据
image_path= 'D:/image/' # 确定要输出的文件路径(手工建一个)
#(遍历所有子节点,并解码输出)
for shape in shapes:
for child in shape.getchildren(): #遍历子节点
image_name = child.attrib.get('name').split('/')[1] #提取文件名
image = base64.b64decode(child.text) #解码
with open(image_path + image_name, 'wb') as file: #存储
file.write(image)
非常简单,有没有!有能力的同学可以写个图形界面,使用起来就更方便了。
此篇文章已发布到我的公众号:saodisir,有兴趣也可关注一下