Excel 97-2003 ブック (*.xls) 形式概要


◆BIFF 概要

Excel の 97、2000、2002(XP)、2003 では、バイナリ交換ファイル形式と呼ばれるファイル形式が採用されています。バイナリ交換ファイル形式(BIFF)は、Excel 5.0 以降では、複合ファイルと呼ばれる形式が使用されていて、構造化ストレージモデル(Structulred Storage Model)標準を OLE2 で実装したものとなります。OLE2 複合ファイルは、本質的に「ファイルの中のファイルシステム」です。複合ファイルには、ストレージおよびストリームの階層構造システムが組み込まれています。ストレージはフォルダに類似しているのに対して、ストリームは、フォルダ内のファイルに類似しています。このファイルを操作するには、OLE の API を使用する必要があります。


◆BIFF バージョン

BIFF のバージョンと Excel の関係については下記の通りです。

  • BIFF5:Excel5
  • BIFF7:Excel95
  • BIFF8:Excel97-2003

尚、Excel 2007 からは、XML をベースとした Office Open XML 形式になっています。


◆Unicode 文字列

Excel 97-2003 形式では、文字列は Unicode が使用され、文字列テーブルに格納されます。この時、それぞれの文字列は長さとオプションフラグで管理され、全ての文字の上位バイトが 00h の場合は圧縮文字列(下位バイトのみ保存)として扱われます。


◆BIFF レコード情報

Excel 内の個々の情報は、BIFF レコードとして管理されます。BIFF レコード情報は、次の 3 つのセクションで構成されます。

  • レコード番号
    2 バイトでレコードを識別します。
  • レコードデータ長
    2 バイトでレコードデータの長さを識別します。
  • レコードデータ
    この部分に実際のデータが入ります。

BIFF8 では、BIFF レコードの長さは、レコードタイプとレコード長フィールドを含めて最大 8,228 バイトです。したがって、レコードデータフィールドは、8,224 バイト以下にする必要があります。
BIFF7 以前では、BIFF レコードの長さは、レコードタイプとレコード長フィールドを含めて、最大 2,084 バイトでした。したがって、レコードデータフィールドは、2,080 バイト以下にする必要があります。どの BIFF バージョンでも、レコードが最大の長さを超える場合には、親レコードの後に CONTINUE レコードを入れます。サイズの大きい埋め込みビットマップ図形オブジェクト等では、複数の CONTINUE レコードが入る場合があります。


◆バイトスワップ

元々 Excel は Apple Macintosh 版が最初にリリースされ、その後に Windows 版がリリースされたのは有名な話です。Excel の BIFF ファイルは、Windows(Intel x86)と Apple Macintosh(Motorola 680×0)で互換性があります。Excel では互換性をサポートするために、Intel x86 形式で BIFF ファイルを作成します。現在はほとんど意識することはなくなりましたが、Intel 系の CPU では、16 ビットワード(2 バイト数値)は下位バイトが先に書き込まれ、続いて上位バイトが書き込まれています。
Macintosh(Motorola 680×0)版 Excel が BIFF ファイルを読み書きする際には、ファイルの全てのレコードの全ての 16 ビットワードについて、上位バイトと下位バイトを入れ替えています。32 ビット幅の場合には、各 16 ビットワードのバイトが先にスワップされてから、2 つの 16 ビットワードがスワップされます。当時の記憶があいまいなため、そのようなユーティリティがあったかどうかは定かではありませんが、Macintosh 用に独自の BIFF ユーティリティを作成する場合には、この入れ替えが必要でした。


◆BIFF レコード情報の例

例として、BOF(レコード番号:809h, ファイルの先頭)レコードを見てみます。BOF レコードは、ストリームの先頭を示します。Book ストリームの他、シートやグラフ、Visual Basic モジュール等のサブストリームの先頭も示します。したがって、3 シートあるブックでは、BOF レコードはフックストリームが 1 つ、シートサブストリームが 3 つの合計 4 つ存在します。

Excel 2003 Book ストリーム情報(id:809h, len:16)

00 06 05 00 9A 20 CD 07 C1 C0 00 00 06 03 00 00    (16 進表示)

Excel 2003 ワークシート情報(id:809h, len:16)

00 06 10 00 9A 20 CD 07 C1 C0 00 00 06 03 00 00    (16 進表示)

先頭 2 バイトの「0600h」は BIFF のバージョン番号(BIFF8=0600h)になります。
次の 2 バイトはサブストリームの型で、詳細は下記の通りです。

  • 0005h=ワークブックグローバル
  • 0006h=VisualBasicモジュール
  • 0010h=ワークシートまたはダイアログシート
  • 0020h=グラフ
  • 0040h=Excel4.0マクロシート
  • 0100h=ワークスペースファイル

さらに 2 バイトのビルド識別子が続き、2 バイトのビルド年が続きます。以降はファイル履歴フラグ(4 バイト)とこのファイルを扱える最も古い BIFF バージョン情報(4 バイト)となります。ですので、Excel 97-2003 のそれぞれのバージョンで作成したファイルは、この BOF の情報が異なることになります。

Excel 97 Book ストリーム情報(id:809h, len:16)

00 06 05 00 91 0E CC 07 C1 00 00 00 06 00 00 00    (16 進表示)

Excel 2000 Book ストリーム情報(id:809h, len:16)

00 06 05 00 F3 27 CD 07 C1 40 00 00 06 01 00 00    (16 進表示)

Excel 2002 Book ストリーム情報(id:809h, len:16)

00 06 05 00 75 27 CD 07 C1 80 00 00 06 02 00 00    (16 進表示)

Excel 2003 Book ストリーム情報(id:809h, len:16)

00 06 05 00 9A 20 CD 07 C1 C0 00 00 06 03 00 00    (16 進表示)

Excel では、このように設定できるデータや属性、機能ごとにレコード情報が存在し、それらは独自の構造で保持されています。


◆BIFF レコード仕様

2008 年 2 月 15 日に Office 97 以降で使われているバイナリファイル形式の文書仕様がマイクロソフト社から公開されました。BIFF8 に関しては、1183 ページに及ぶ PDF ファイルで BIFF レコードの詳細が記載されています。
・Office Binary File Formats


◆Office のサポート情報

Office の旧バージョンのサポート情報については次のサイトに掲載されています。
・Office 製品のプロダクト サポート ライフサイクル

Excel 2003 については、メインストリームサポートは終了(2009 年 4 月 14 日)し、延長サポート期間(~ 2014 年 4 月 8 日)に入っています。延長サポートとは、仕様変更などの機能アップが図られなくなるが、セキュリティの更新などは行われるサポートです。


◆BIFF を扱うコンポーネント

BIFF を扱うコンポーネントは、代表的なものとして下記のものがあります。

上 2 つは有料のコンポーネントで NPOI はフリーの Apache License 2.0 となります。
これらの使用方法はいずれ紹介したいと思います。


◆まとめ

Excel 2007 の発売から 5 年が経過し、Excel 2003 までの形式でブックを作成する機会は減りつつあると思います。しかしながら、企業には表組を使用した多くの文書が Excel で作成され、その資産として Excel 97-2003ブック (.xls) 形式の文書がいまだに多く残っています。Excel 97-2003 までのファイル形式は、複雑なバイナリで構成された形式であるため、個別にプログラムから扱うことが難しく、システムに組み込んで活かすことが困難でした。BIFF の仕様が拡張されることは今後はおそらく無いと思われるので、プログラムからこの形式を扱う場合は、それを扱うコンポーネントの仕様を把握し、Excel で使用する機能を決定した上でその範囲で使用するのが確実です。
Excel 97-2003ブック (.xls) 形式をプログラムから扱う方法については、いずれ紹介したいと思います。

You can leave a response, or trackback from your own site.

Leave a Reply