売上ダッシュボード.twb 構造仕様書

Tableau Workbook (.twb) を公式ドキュメントスキーマに沿って解説する設計ドキュメント
原本ファイル
売上ダッシュボード.twb
Tableau version
18.1 (source-build 2026.1.1)
作成プラットフォーム
mac
参照スキーマ
データソース
売上データ.csv
ワークシート数
3 件
ダッシュボード数
1 件 (+Phone レイアウト)
行数 / 列数
109,089 行 / 39 列

1. .twb ファイル全体像

.twb(Tableau Workbook)は UTF-8 / XML 1.0 形式のテキストファイル。 「データへの接続定義」「ワークシートのビュー設計」「ダッシュボード配置」「サムネイル画像」を 1 ファイルにまとめます。 実データ本体は内包せず、外部 CSV や DB への参照のみが保存されます。

ファイル形式
XML 1.0 / UTF-8 / CRLF
行数
約 3,653 行(末尾の thumbnail base64 が大半)
データソース数
1 件(CSV、textscan コネクタ)
ワークシート数
3 件(売上推移 / 大分類別売上 / 商品別店舗売上)
ダッシュボード数
1 件(売上ダッシュボード)+ Phone デバイスレイアウト
パラメータ
なし
計算フィールド
なし(生フィールドのみ)
豆知識: .twbx(Packaged Workbook)はこの .twb XML と参照データを ZIP 圧縮して同梱した形式。本ファイルは未圧縮の .twb 単体です。

2. 公式スキーマ (tableau-document-schemas) の位置づけ

tableau/tableau-document-schemas は、 .twb / .tds / .tfl 等を検証する XSD を公開する Tableau 公式リポジトリです。 本ワークブックで実際に登場する要素を XSD 定義と対応づけると次のとおり。

XSD 要素本ファイルでの登場役割
workbookルート(version='18.1')ワークブック全体
document-format-change-manifest機能フラグ 6 件ファイル形式アップグレード履歴
preferencesUI 高さ 2 件UI 表示設定
datasources/datasourcefederated 1 件データ接続定義
connection (federated)1 件論理データソース層
named-connection (textscan)1 件物理 CSV 接続
relationtype='table'テーブル定義
metadata-recordcapability×1 + column×39列メタデータ
column-instance4 件派生(年/月/日)
group / groupfilter2 件アクション用動的グループ
style/style-rule2 件マークの色マッピング
object-graph1 件論理オブジェクトモデル
worksheets/worksheet3 件各ビュー定義
dashboards/dashboard1 件ダッシュボード配置
devicelayouts/devicelayoutPhone 1 件スマホ用レイアウト
windows/window4 件(ws×3 + dashboard×1)UI カード配置
thumbnails/thumbnail4 件サムネイル PNG

3. ルート XML 構造ツリー

本ファイルの XML を「親子関係+繰り返し回数」で書き起こすと次のとおり。

<workbook version="18.1"> ├─ <document-format-change-manifest> ← 機能フラグ 6 件 ├─ <preferences> ← UI 設定 2 件 ├─ <datasources> │ └─ <datasource name="federated.040vubn0bkhset12iho5301wrojj"> │ ├─ <connection class="federated"> │ │ ├─ <named-connection class="textscan"> ← CSV 物理接続 │ │ ├─ <relation type="table"> ← 39 列定義 │ │ └─ <metadata-records> ×40 │ ├─ <aliases> / <column>×4 / <column-instance>×4 / <group>×2 │ ├─ <style> ← style-rule×2(色) │ ├─ <semantic-values> (Country=日本) │ └─ <object-graph> ← 新オブジェクトモデル ├─ <worksheets> │ ├─ <worksheet name="商品別店舗売上"> ← マーク Automatic + テキスト表 │ ├─ <worksheet name="売上推移"> ← マーク Bar (積み上げ棒) │ └─ <worksheet name="大分類別売上"> ← マーク Pie (円グラフ) ├─ <dashboards> │ └─ <dashboard name="売上ダッシュボード"> │ ├─ <size sizing-mode="automatic"/> │ ├─ <zones> ← デスクトップ用 zone tree │ └─ <devicelayouts> │ └─ <devicelayout name="Phone"> ← Phone レイアウト ├─ <windows source-height="30"> │ ├─ <window class="worksheet" name="売上推移"> │ ├─ <window class="worksheet" name="大分類別売上"> │ ├─ <window class="worksheet" name="商品別店舗売上"> │ └─ <window class="dashboard" name="売上ダッシュボード"> └─ <thumbnails> ← base64 PNG ×4

4. <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、ヘッダ行あり。

5. データ列メタデータ(39 列)

各列は <metadata-record class="column"> として宣言。remote-type は ADO の型コード(20=integer、129=string、133=date)。

#列名既定集計本ワークブックでの主用途
0顧客コードintegerSum
1店舗コードintegerSum
2integerSum
3売上数量integerSumメジャー
4売上金額integerSumメジャー 全3シートのメイン値
5-7原価 / 値引き額 / カードポイントintegerSumメジャー
8-9年度 / 月度stringCount
10年月日dateYear日付 売上推移 / 大分類別売上 で使用
11stringCount
12-14ブロック名 / 支社名 / 店舗名称stringCountディメンション 店舗名称=商品別店舗売上の行
15-18大分類 / 中分類 / 小分類 / 商品名称stringCountディメンション 商品別店舗売上の列/大分類は色&フィルタ
19-21姓 / 名 / 氏名stringCount
22-23年齢 / 性別integer/stringSum/Count
24-27郵便番号 / 都道府県 / 市区 / 町名integer/stringSum/Count郵便番号は role='dimension' に上書き
28-30業種 / 婚姻 / 給与帯stringCount
31-32担当者名 / 支払方法stringCount
33-35カード区分 / クレジット会社名 / 仕入先名integer/string
36-37達成リベート率 / 不達成リベート率integerSum
38動機_経路stringCountcaption='動機 経路' で表示名置換

6. column-instancegroup

6.1 派生フィールド (column-instance)

name元 columnderivationtype主用途
[dy:年月日:ok][年月日]Dayordinalstyle-rule(日色マップ)
[mn:年月日:ok][年月日]Monthordinal売上推移 列/フィルタクロスジョイン
[yr:年月日:ok][年月日]Yearordinal同上(Year)
[none:大分類名称:nk][大分類名称]Nonenominal大分類別売上の色/style-rule

6.2 アクション用動的グループ (group / groupfilter)

Tableau のダッシュボードアクションのターゲットとして 2 件の動的グループが宣言されています(いずれも hidden='true')。

7. <style> ブロック(色エンコード)

マーク(element='mark')に対して 2 系統の色マッピングが固定値で定義されています。

7.1 大分類名称 → カラー(Tableau 10 風)

スポーツ・アウトドア
#4e79a7
家庭用品
#59a14f
家具・インテリア
#76b7b2
食品
#b07aa1
衣料品
#e15759
趣味、生活用品
#edc948
ヘルス&ビューティー
#f28e2b

7.2 日(年月日) → カラー

1〜31 の日付値に対する色マップも併存(直接の表示は無し、ハイライト時の色保持用)。

8. <worksheets> ブロック詳解(3 シート)

バー 売上推移 uuid {21EDF226-...}

マークタイプ
Bar(積み上げ棒)
列 (cols)
YEAR(年月日) / MONTH(年月日)
行 (rows)
SUM(売上金額)
大分類名称(7 色 stacked)
フィルタ
Action (大分類名称) ui-enumeration='all'
ハイライト
color-one-way: 日(年月日) / 大分類名称

パイ 大分類別売上 uuid {4565A86C-...}

マークタイプ
Pie(円グラフ)
列 / 行
なし(rows/cols は空、エンコーディングのみ)
エンコーディング
color = 大分類名称, wedge-size = SUM(売上金額), text = 大分類名称
マークラベル
mark-labels-show = true, mark-labels-cull = true
手動ソート
大分類名称(趣味、生活用品 → 衣料品 → 家具・インテリア → 家庭用品 → スポーツ → 食品 → ヘルス&ビューティー)
フィルタ
Action (YEAR/MONTH) ← 売上推移からのアクション受信
ハイライト
color-one-way: ブロック名 / 大分類名称
<encodings>
  <color      column='[...].[none:大分類名称:nk]'/>
  <wedge-size column='[...].[sum:売上金額:qk]'/>
  <text       column='[...].[none:大分類名称:nk]'/>
</encodings>

テキスト 商品別店舗売上 uuid {E8D89D22-...}

マークタイプ
Automatic(テキスト表として描画)
列 (cols)
大分類名称 / (中分類名称 / 小分類名称) ← 3 段階階層
行 (rows)
店舗名称
エンコーディング
text = SUM(売上金額)
マークラベル
mark-labels-show = true
フィルタ
Action (YEAR/MONTH) + Action (大分類名称) 両方を受信
ハイライト
中分類 / 大分類 / 小分類 / 店舗名称(4 フィールド)
<rows>[...].[none:店舗名称:nk]</rows>
<cols>(
  [...].[none:大分類名称:nk] /
  ( [...].[none:中分類名称:nk] / [...].[none:小分類名称:nk] )
)</cols>
規模感: 大分類 7 × 中分類 52 × 小分類 331 × 店舗 50 ≒ 数万セルになり得る巨大表。本ワークブックではフィルタ初期値が全選択のため、Tableau は実セル数だけ描画します。

9. <dashboards> ブロック(売上ダッシュボード)

3 つのワークシートと 1 つの色凡例カードを zone tree に配置したダッシュボード。sizing-mode='automatic'

9.1 zone tree(デスクトップ)

zone は入れ子可能なレイアウト要素で、type-v2 属性によって役割が決まります。本ダッシュボードの構造を SVG で可視化したものが下図。

title zone (id=13, h=3815) id=3 — 売上推移 (zone w=90167, h=47365) バー:YEAR(年月日)/MONTH(年月日) × SUM(売上金額) id=5 — 大分類別売上 (w=45084) パイ:SUM(売上金額) by 大分類 id=10 — 商品別店舗売上 (w=45083) テキスト表:店舗 × 大分類/中分類/小分類 id=9 凡例 (color) 大分類名称 fixed-size=160 type-v2='color'

対応する 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>

9.2 Phone デバイスレイアウト

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>

10. <windows> ブロック

各ワークシート/ダッシュボードの UI 配置情報<window> 4 件にまとまっています。

classname左カード上カード右カードhighlight
worksheet売上推移pages / filters / markscolumns / rows / title日(年月日) / 大分類名称
worksheet大分類別売上pages / filters / markscolumns / rows / titlecolor(大分類名称)ブロック名 / 大分類名称
worksheet商品別店舗売上pages / filters / markscolumns / rows / title中分類 / 大分類 / 小分類 / 店舗名称
dashboard売上ダッシュボードviewpoints (3 シート参照)
注目: 大分類別売上 の window だけ edge='right'card type='color' が定義されており、これがダッシュボード右側の色凡例ゾーン(id=9)の元になっています。

11. <thumbnails> ブロック

Tableau Server / Reader 表示用のサムネイル PNG が Base64 で埋め込まれています。 ワークブックの末尾、ファイル容量の大半を占めるのがここ。

nameサイズ用途
売上推移384×384ワークシートサムネ
大分類別売上384×384ワークシートサムネ
商品別店舗売上384×384ワークシートサムネ
売上ダッシュボード192×192ダッシュボードサムネ

12. Tableau → HTML 再現マッピング

添付の 売上ダッシュボード_再現.html では、Tableau の各要素を以下のように対応付けています。

Tableau 要素.twb 上の宣言HTML 再現実装
ダッシュボード zone tree<zones> ネストCSS Grid(上段 2 列横並び+下段 2 セル+右側凡例列)
マーク Bar (売上推移)<mark class='Bar'/>SVG <rect> 積み上げ
マーク Pie (大分類別売上)<mark class='Pie'/>encodings/wedge-sizeSVG <path d="M...A...Z"> 円弧
マーク Automatic→テキストencodings/textHTML <table> でセル描画
色エンコードstyle-rule/encoding同一 hex を CSS / fill 属性で再利用
カテゴリカルフィルタfilter class='categorical'凡例クリックで Set 操作
アクション (YEAR/MONTH)Action1_EA66... + slicesバーの月クリックで state.selectedMonth 更新 → 全シート再描画
アクション (大分類名称)Action2_E83F... + slicesパイ/凡例クリックで state.enabledCats 更新
右側 color zonezone type-v2='color' fixed-size='160'右カラム固定幅の凡例
ハイライト color-one-wayviewpoint/highlight選択以外の dim-out(opacity 0.15)
サムネイルbase64 PNG ×4(再現では未使用)
制約: 109,089 行 CSV を直接読まず、年月×大分類 と 店舗×大分類 の事前集計 JSON を埋め込んで再現しています。月フィルタ時の店舗別値は年合計を月按分で表示しているため、Tableau の正確な集計値とは小数桁レベルで差が出ます。完全一致が必要な場合は CSV を直接ロードして再集計する版に切り替えてください。

13. 再現ダッシュボードへのリンク

本仕様書と同じフォルダに配置した再現ダッシュボードを直接開けます。

▶ 売上ダッシュボード_再現.html を開く

両ファイルとも単一 HTML(CDN 依存なし)。Google ドライブ同期フォルダ に同居。