Heliodor 2019/09/24 18:05

XLSX ファイル

以前 ZIP の読み込みプログラムについて説明しましたが、ついでなのでその延長線上にあるプログラム、「.xlsx ファイルのロード」も載せておきます。

Excel ファイルをゲームのデータ管理に使えたら便利だなー、とは誰もが一度は考えることだと思います。
レベルごとの経験値、能力値、アイテム効果など、表形式で管理できればこれほど楽なことはありません。

しかも、Excel ファイルをわざわざ .csv や .xml にエクスポートして使うのではなく、ゲーム側で直接ファイルをロードできるようにしておけばすごく便利ですよね?

それを実現しようとすると以前は結構面倒だったのですが、ナイスなことに Excel 2007 からは独自のバイナリ形式 .xls ではなく ZIP と XML を組み合わせてわかりやすい形式で保存してくれるようになりました。それが .xlsx ファイルです。


しかしバイナリ形式に比べれば格段に楽になったとはいうものの、ZIP を自力で展開し、中にある XML ファイルを解析し、Excel のシート内のセルを復元しないといけない事に変わりはありません。

ですので、そのあたりのプログラムもサンプルとして置いておこうと思います。



ファイル形式

.xlsx ファイルは実際のところ単なる .zip ファイルなので、とりあえず zip の解凍プログラムに .xlsx ファイルをそのまま放り込んでみます。

すると中には

 docProps
 xl
 _rels
 [Content_Types].xml

といったファイルが入っています。



シート概要

シートが何枚あるとか、それぞれのシートの名前といった情報は

 xl/workbook.xml

に入っています。この中身はだいたい次のような感じになっています。
(本当はもっといろいろなタグが付いていますけど)

 <workbook>
  <sheets>
   <sheet sheetId="1" name="シート1"/>
   <sheet sheetId="2" name="シート2"/>
   <sheet sheetId="3" name="シート3"/>
  </sheets>
 </workbook>

これはそのまま見たとおりの内容で、シートの識別番号と名前を表しています。



シート詳細

肝心のシートの中身ですが、その情報は

 xl/worksheets/

にあって、フォルダの中には sheet[シート識別番号].xml というファイルが
シート枚数と同じ数だけ入っています

 sheet1.xml
 sheet2.xml
 sheet3.xml

これも見たとおりの内容で、それぞれのファイルが 1 枚のシートを表しています。



セル

いよいよセルの中身についてです。シート内にあるセルにどんなテキストが書いてあるのかは、
xl/worksheets/sheet[シート識別番号].xml の中身を見ます。
必要な部分だけ抜き出すと、だいたい次のような感じになっています。

 <worksheet>
  <dimension ref="A1:E4">
  <sheetData>
   <row r="1">
    <c r="A1" t="s" s="3"><v>0</v></c>
    <c r="B1" t="s" s="3"><v>1</v></c>
    <c r="C1" t="s" s="3"><v>2</v></c>
   </row>
   <row r="2">
    <c r="A2" s="2"><v>1000</v></c>
    <c r="B2" s="2"><v>2000</v></c>
    <c r="C2" s="2"><v>3000</v></c>
   </row>
  </sheetData>
 </worksheet>

<dimension> の ref 属性には有効セルの範囲情報があります。
この例でいうと、セル A1 を左上、セル E4 を右下とする範囲内のセルにだけ何かの文字が入っていて、それ以外のセルはすべて空っぽだという事です。

<row> は行を表していて、 r 属性には 1 起算の行番号が入っています。

<c> はその行に含まれているセルを表していて、 r 属性はセル番号です。
<v> はそのセルの値なのですが、どんな種類の値が入っているのかについては <c> の t 属性を見ます。

t = "n" だと、<v> には数値が入っています。例: <v>3.1415</v>
t = "s" だと、<v> には文字列IDが入っています。例: <v>2</v>
t = "str" だと、<v> には文字列がそのまま入っています。例: <v>Hello World!</v>
t が省略されている場合は t = "n" と同じで、数値が入っているようです。



文字列テーブル

セルの値として文字列IDが指定されている場合、そのIDを元にして実際の文字列を探してこないといけません。
文字列のテーブルは xl/sharedStrings.xml に入っています。
例によって必要な部分だけ抜き出すと、だいたい次のような感じになっています。

 <si><t>January</t></si>
 <si><t>February</t></si>
 <si><t>March</t></si>

上から順番に、文字列ID=0, 1, 2, ... に対応しています。
ちなみにこれとは別のパターンもあって、

 <si>
  <rPr>スタイル情報いろいろ</rPr>
  <r><t>This is</t></r>
  <r><t> a pen</t></r>
  ....
 </si>

のようになっている場合もあります。この場合、単に <t> の中身を全て連結したものがセルの文字列になります。
セルの途中でテキストの色を変えたりしているとこうなるみたいです。



ソースコード

というわけで、これらの情報を元にしていけば、自力で Excel ファイルの内容を復元することができます。

フォロワー以上の方の特典として、サンプルプログラムのソースコードを置いておきます。
ビルドに必要なファイルは全て一緒に入っているので、ただ .sln ファイルを開いてビルドするだけで普通に実行できます。
(Visual Studio 2017 で確認しています)

例によってこのプログラムを使用したことによる責任は一切負いません。
その代わり、組み込み、改造、再配布など全て自由です。

フォロワー以上限定無料

まずは無料プランで様子見を。 お気軽にフォローしてみて下さい。

無料

【 500円 】プラン以上限定 支援額:500円

このバックナンバーを購入すると、このプランの2019/09に投稿された限定特典を閲覧できます。 バックナンバーとは?

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

記事のタグから探す

月別アーカイブ

限定特典から探す

記事を検索