.twb(Tableau Workbook)は UTF-8 / XML 1.0 形式のテキストファイル。
「データへの接続定義」「ワークシートのビュー設計」「ダッシュボード配置」「サムネイル画像」を 1 ファイルにまとめます。
実データ本体は内包せず、外部 CSV や DB への参照のみが保存されます。
textscan コネクタ).twbx(Packaged Workbook)はこの .twb XML と参照データを ZIP 圧縮して同梱した形式。本ファイルは未圧縮の .twb 単体です。
tableau/tableau-document-schemas は、
.twb / .tds / .tfl 等を検証する XSD を公開する Tableau 公式リポジトリです。
本ワークブックで実際に登場する要素を XSD 定義と対応づけると次のとおり。
| XSD 要素 | 本ファイルでの登場 | 役割 |
|---|---|---|
workbook | ルート(version='18.1') | ワークブック全体 |
document-format-change-manifest | 機能フラグ 6 件 | ファイル形式アップグレード履歴 |
preferences | UI 高さ 2 件 | UI 表示設定 |
datasources/datasource | federated 1 件 | データ接続定義 |
connection (federated) | 1 件 | 論理データソース層 |
named-connection (textscan) | 1 件 | 物理 CSV 接続 |
relation | type='table' | テーブル定義 |
metadata-record | capability×1 + column×39 | 列メタデータ |
column-instance | 4 件 | 派生(年/月/日) |
group / groupfilter | 2 件 | アクション用動的グループ |
style/style-rule | 2 件 | マークの色マッピング |
object-graph | 1 件 | 論理オブジェクトモデル |
worksheets/worksheet | 3 件 | 各ビュー定義 |
dashboards/dashboard | 1 件 | ダッシュボード配置 |
devicelayouts/devicelayout | Phone 1 件 | スマホ用レイアウト |
windows/window | 4 件(ws×3 + dashboard×1) | UI カード配置 |
thumbnails/thumbnail | 4 件 | サムネイル PNG |
本ファイルの XML を「親子関係+繰り返し回数」で書き起こすと次のとおり。
<datasources> ブロック詳解
Tableau の外部接続は 2 層構造:上位 <connection class="federated"> が論理ビュー、下位 <named-connection class="textscan"> が CSV 物理接続。
<datasource caption='売上データ' inline='true' name='federated.040vubn0bkhset12iho5301wrojj' version='18.1'> <connection class='federated'> <named-connection name='textscan.1hjsv7m116t9ak1dgmyae0ba7djn'> <connection class='textscan' directory='/path/to/data' filename='売上データ.csv'/> </named-connection> <!-- relation, metadata-records (39 columns) ... --> </connection> </datasource>
<relation> は CSV のテーブル構造を宣言。文字コード Shift_JIS、ロケール ja_JP、ヘッダ行あり。
各列は <metadata-record class="column"> として宣言。remote-type は ADO の型コード(20=integer、129=string、133=date)。
| # | 列名 | 型 | 既定集計 | 本ワークブックでの主用途 |
|---|---|---|---|---|
| 0 | 顧客コード | integer | Sum | — |
| 1 | 店舗コード | integer | Sum | — |
| 2 | 月 | integer | Sum | — |
| 3 | 売上数量 | integer | Sum | メジャー |
| 4 | 売上金額 | integer | Sum | メジャー 全3シートのメイン値 |
| 5-7 | 原価 / 値引き額 / カードポイント | integer | Sum | メジャー |
| 8-9 | 年度 / 月度 | string | Count | — |
| 10 | 年月日 | date | Year | 日付 売上推移 / 大分類別売上 で使用 |
| 11 | 年 | string | Count | — |
| 12-14 | ブロック名 / 支社名 / 店舗名称 | string | Count | ディメンション 店舗名称=商品別店舗売上の行 |
| 15-18 | 大分類 / 中分類 / 小分類 / 商品名称 | string | Count | ディメンション 商品別店舗売上の列/大分類は色&フィルタ |
| 19-21 | 姓 / 名 / 氏名 | string | Count | — |
| 22-23 | 年齢 / 性別 | integer/string | Sum/Count | — |
| 24-27 | 郵便番号 / 都道府県 / 市区 / 町名 | integer/string | Sum/Count | 郵便番号は role='dimension' に上書き |
| 28-30 | 業種 / 婚姻 / 給与帯 | string | Count | — |
| 31-32 | 担当者名 / 支払方法 | string | Count | — |
| 33-35 | カード区分 / クレジット会社名 / 仕入先名 | integer/string | — | — |
| 36-37 | 達成リベート率 / 不達成リベート率 | integer | Sum | — |
| 38 | 動機_経路 | string | Count | caption='動機 経路' で表示名置換 |
column-instance と group| name | 元 column | derivation | type | 主用途 |
|---|---|---|---|---|
[dy:年月日:ok] | [年月日] | Day | ordinal | style-rule(日色マップ) |
[mn:年月日:ok] | [年月日] | Month | ordinal | 売上推移 列/フィルタクロスジョイン |
[yr:年月日:ok] | [年月日] | Year | ordinal | 同上(Year) |
[none:大分類名称:nk] | [大分類名称] | None | nominal | 大分類別売上の色/style-rule |
Tableau のダッシュボードアクションのターゲットとして 2 件の動的グループが宣言されています(いずれも hidden='true')。
[Action (YEAR(年月日),MONTH(年月日))]: 年×月の crossjoin。売上推移バーをクリックすると他シートに伝播するアクション ID Action1_EA66... のキーになる。[Action (大分類名称)]: 大分類のメンバー。大分類別売上のパイをクリックすると他シートに伝播するアクション ID Action2_E83F... のキー。<style> ブロック(色エンコード)マーク(element='mark')に対して 2 系統の色マッピングが固定値で定義されています。
1〜31 の日付値に対する色マップも併存(直接の表示は無し、ハイライト時の色保持用)。
<worksheets> ブロック詳解(3 シート)uuid {21EDF226-...}Bar(積み上げ棒)YEAR(年月日) / MONTH(年月日)SUM(売上金額)大分類名称(7 色 stacked)Action (大分類名称) ui-enumeration='all'color-one-way: 日(年月日) / 大分類名称uuid {4565A86C-...}Pie(円グラフ)color = 大分類名称, wedge-size = SUM(売上金額), text = 大分類名称mark-labels-show = true, mark-labels-cull = trueAction (YEAR/MONTH) ← 売上推移からのアクション受信color-one-way: ブロック名 / 大分類名称<encodings> <color column='[...].[none:大分類名称:nk]'/> <wedge-size column='[...].[sum:売上金額:qk]'/> <text column='[...].[none:大分類名称:nk]'/> </encodings>
uuid {E8D89D22-...}Automatic(テキスト表として描画)大分類名称 / (中分類名称 / 小分類名称) ← 3 段階階層店舗名称text = SUM(売上金額)mark-labels-show = trueAction (YEAR/MONTH) + Action (大分類名称) 両方を受信<rows>[...].[none:店舗名称:nk]</rows> <cols>( [...].[none:大分類名称:nk] / ( [...].[none:中分類名称:nk] / [...].[none:小分類名称:nk] ) )</cols>
<dashboards> ブロック(売上ダッシュボード)3 つのワークシートと 1 つの色凡例カードを zone tree に配置したダッシュボード。sizing-mode='automatic'。
zone は入れ子可能なレイアウト要素で、type-v2 属性によって役割が決まります。本ダッシュボードの構造を SVG で可視化したものが下図。
対応する XML(要約):
<dashboard name='売上ダッシュボード'> <size sizing-mode='automatic'/> <zones> <zone id='4' type-v2='layout-basic'> <zone id='12' param='vert' type-v2='layout-flow'> <zone id='13' type-v2='title'/> ← タイトル <zone id='8' param='horz' type-v2='layout-flow'> <zone id='6' type-v2='layout-basic'> ← 3 シートの容器 <zone id='3' name='売上推移'/> ← 1段目フル幅 <zone id='5' name='大分類別売上'/> ← 2段目左 <zone id='10' name='商品別店舗売上'/> ← 2段目右 </zone> <zone id='7' fixed-size='160'> ← 右側固定 160px <zone id='9' type-v2='color' param='[...].[none:大分類名称:nk]'/> ← 大分類カラー凡例 </zone> </zone> </zone> </zone> </zones> ... </dashboard>
auto-generated な Phone レイアウト(vscroll、min/max-height 1000)が自動で追加されています。
同じ 3 シート+凡例を縦スクロールに並べ替えた構造で、各 zone に fixed-size='280' が付与されます。
<devicelayout auto-generated='true' name='Phone'> <size maxheight='1000' minheight='1000' sizing-mode='vscroll'/> <zones> ... タイトル → 売上推移 → 大分類別売上 → 凡例 → 商品別店舗売上 を縦並び </zones> </devicelayout>
<windows> ブロック各ワークシート/ダッシュボードの UI 配置情報が <window> 4 件にまとまっています。
| class | name | 左カード | 上カード | 右カード | highlight |
|---|---|---|---|---|---|
| worksheet | 売上推移 | pages / filters / marks | columns / rows / title | — | 日(年月日) / 大分類名称 |
| worksheet | 大分類別売上 | pages / filters / marks | columns / rows / title | color(大分類名称) | ブロック名 / 大分類名称 |
| worksheet | 商品別店舗売上 | pages / filters / marks | columns / rows / title | — | 中分類 / 大分類 / 小分類 / 店舗名称 |
| dashboard | 売上ダッシュボード | viewpoints (3 シート参照) | — | ||
大分類別売上 の window だけ edge='right' に card type='color' が定義されており、これがダッシュボード右側の色凡例ゾーン(id=9)の元になっています。
<thumbnails> ブロックTableau Server / Reader 表示用のサムネイル PNG が Base64 で埋め込まれています。 ワークブックの末尾、ファイル容量の大半を占めるのがここ。
| name | サイズ | 用途 |
|---|---|---|
| 売上推移 | 384×384 | ワークシートサムネ |
| 大分類別売上 | 384×384 | ワークシートサムネ |
| 商品別店舗売上 | 384×384 | ワークシートサムネ |
| 売上ダッシュボード | 192×192 | ダッシュボードサムネ |
添付の 売上ダッシュボード_再現.html では、Tableau の各要素を以下のように対応付けています。
| Tableau 要素 | .twb 上の宣言 | HTML 再現実装 |
|---|---|---|
| ダッシュボード zone tree | <zones> ネスト | CSS Grid(上段 2 列横並び+下段 2 セル+右側凡例列) |
| マーク Bar (売上推移) | <mark class='Bar'/> | SVG <rect> 積み上げ |
| マーク Pie (大分類別売上) | <mark class='Pie'/> + encodings/wedge-size | SVG <path d="M...A...Z"> 円弧 |
| マーク Automatic→テキスト | encodings/text | HTML <table> でセル描画 |
| 色エンコード | style-rule/encoding | 同一 hex を CSS / fill 属性で再利用 |
| カテゴリカルフィルタ | filter class='categorical' | 凡例クリックで Set 操作 |
| アクション (YEAR/MONTH) | Action1_EA66... + slices | バーの月クリックで state.selectedMonth 更新 → 全シート再描画 |
| アクション (大分類名称) | Action2_E83F... + slices | パイ/凡例クリックで state.enabledCats 更新 |
| 右側 color zone | zone type-v2='color' fixed-size='160' | 右カラム固定幅の凡例 |
| ハイライト color-one-way | viewpoint/highlight | 選択以外の dim-out(opacity 0.15) |
| サムネイル | base64 PNG ×4 | (再現では未使用) |
本仕様書と同じフォルダに配置した再現ダッシュボードを直接開けます。
両ファイルとも単一 HTML(CDN 依存なし)。Google ドライブ同期フォルダ に同居。