はじめに
この記事を書くことになったきっかけは、
新入社員との雑談中にExcelの内部構造の仕組みを説明した際に、いろいろ感じたことがあったので記事にしてみることにしました。
xls(Excel Spreadsheet)及び、xlsx(Excel Open XML Spreadsheet)の内部構造については既にいろんなところで記事になっていて今さらだと思いますが、改めて触れることで時代背景や技術的なアプローチの面白さを感じていただけることができたら幸いです。
時代背景
xlsとxlsxの話をする前に、その当時がどういう状況だったか知っていると、なぜxls → xlsxという変更を行ったのかその意図がみえてきます。
| 年月 | 出来事 |
|---|---|
| 2005年2月 | Google Maps公開 |
| 2006年3月 | Twitterの最初の投稿 |
| 2007年1月 | 2007 Microsoft Office system リリース |
| 2007年4月 | Google My Mapsリリース |
| 2007年6月 | iPhone発売 |
| 2008年9月 | Chromeブラウザリリース |
| 2010年2月 | Microsoft Azure リリース |
かなり偏った表ではありますが、話題に挙げようとしているExcel 2007がリリースされた前後で、現在もトップクラスに利用されている技術が登場しています。
このころはインターネットの普及に伴い、Web2.0、クラウド、ビッグデータなどのワードが飛び交い、爆発的に増えていくデータに対応していくことが重要視されていた時代だったと認識しています。
私自身は2005年から技術者として活動しているので、まさにこの時代の流れの中にいた一人だと思います。
xlsとxlsxの違い
このような時代背景を抑えたうえで、xlsとxlsxの違いを見ていきます。
大まかに以下のような違いがあります。
| xls | xlsx |
|---|---|
| Excel 97 ~ 2003までの拡張子 | Excel 2007~ の拡張子 |
| 最大行数: 65,536行 (2^16) | 最大行数: 1,048,576行 (2^20) |
| 最大列数: 256列 (2^8) | 最大列数: 16,384列 (2^14) |
| バイナリ ファイル形式 (BIFF8) | XML ベース ファイル形式 |
注目すべき点は、最大行数、最大列数が圧倒的に拡張されている点です。
先ほどの時代背景を踏まえると、明らかに今後来るであろうビッグデータを意識した変更なのではないかと感じます。
技術者としては100万行はビッグデータと呼ぶには少ないかもしれませんが、技術者ではなく一般で使う人、しかも当時普及していたExcelベースで大量のデータが扱える、というところがポイントだったのではないかと想像します。
ビッグデータという言葉がはやり始めたのは2009年~2010年頃で、Excelの変更が行われたのは2007年なので、それを見据えていたというところでしょうか。
xlsとxlsxの内部構造の違い
先ほど挙げたデータ容量の変化に対してそのまま大量のテキストデータを保持すると、データサイズが大きくなってしまい扱いづらいファイルになってしまいます。
その部分に対してどのようなアプローチで対応したかは、その内部構造を紐解くことで見えてきます。
xlsの内部構造
xlsはBIFF8というバイナリファイル形式のデータで保存されています。BIFF8はExcel 97-2003で使用される形式で、レコードベースの構造を持っています。
ここでは比較のために、バイナリファイルを実際に開いたイメージを掲載します。
尚、内部構造の詳細については割愛させていただきます。 詳細はMicrosoftの公式ページをご参照ください。
xlsの中身を確認する方法は、リンク内に公開されている、
[Office ビジュアライザー ツール offvis.exe] を使用します。
添付画像を見てもわかるように、xlsはバイナリデータとして保存されています。
xlsxの内部構造
次にxlsxの内部構造に触れていきます。
xlsxは Open XML形式(Office Open XML) というXMLベースのファイル形式で保存されています。Open XML形式は、ZIP圧縮されたXMLファイルの集合として構成され、国際標準(ECMA-376、ISO/IEC 29500)として承認されています。
なお、Open XML形式の詳細やメリットについては公式ドキュメントに記載されています。また、Open XML SDKも公開されていますので、以下をご参照ください。
Open XML SDK :
Microsoft OfficeのOpen XML形式のファイルをプログラムから操作するための.NET向けライブラリ。
Officeアプリケーションをインストールせずに、Open XML形式のファイルを作成、編集、読み取りが可能。
xlsxを展開する方法は、拡張子のxlsxをzipに変更し、展開することで確認できます。
では、実際にxlsxをzip展開していきます。
フォルダの構成は大まかに以下の内容になっています。
| フォルダ名/ファイル名 | 概要 |
|---|---|
| _rels | ドキュメント内の各パーツ間のリレーションを定義するファイル |
| docProps | ドキュメントのメタデータ(作成者、作成日、タイトルなど)を定義するXMLファイル(例: core.xml, app.xml)が格納されている |
| xl | ワークシート、グラフ、スタイルなど、Excelの主要なコンテンツが格納されている |
| [Content_Types].xml | ExcelなどのOfficeファイルの構造を定義するXMLファイル。ファイル内の各コンポーネント(シート、画像、図など)がどのような種類であるかを定義 |
手順3:zip展開後にworksheetのxmlを開く
XMLとして保存されているというサンプルとして、worksheetのXMLをサンプルとして表示します。worksheetのXMLは、先ほど展開された [xl/worksheets]フォルダ内に、Sheet名毎に保存されています。
このようにxlsxを展開すると、xmlをベースに複数のフォルダ・ファイルで構造化されていることが分かります。
おもしろい工夫がされているxlsx
ここまででxls、xlsxの内部構造に触れてきましたが、
大量データを取り扱うことに対して、非常に面白いアプローチで対応しています。
内部構造をxmlベースの構造に変更し、複数のフォルダ・ファイルで構成した
xmlベースに構造を変更したことで、モジュール構造による管理の容易さが実現されています。ワークシート、スタイル、メタデータなどが個別のファイルとして分離されているため、構造が明確で理解しやすくなっています。
基本の構造がxmlで定義されているため、先ほど紹介したOpen XML SDKなどのツールを利用して、プログラムからExcelファイルを操作することができます。
例としてOpen XML SDKを利用した場合、以下のようなユースケースが実現できます:
- サーバーサイドでのレポート生成(Webアプリケーションでユーザーのリクエストに応じて動的にExcelファイルを生成)
- バッチ処理でのExcelファイル生成(Excelがインストールされていないサーバー上で定期的なレポートを自動生成)
- クラウドサービスでのExcelファイル操作(ユーザーがアップロードしたデータを元にExcelファイルを生成)
- データの自動変換・統合(異なるデータソースから取得した情報を統合し、Excelファイルとして出力)
ファイル保存時に圧縮保存してファイルサイズを小さくしている
データ量の多いExcelファイルであっても、圧縮保存することでファイルサイズを小さく抑えられます。
ファイルを開く時に展開する仕組みとなっているため展開時の処理に負荷はかかりますが、xml構造にすることや、パフォーマンスを重視した圧縮展開を採用することで、その部分を少しでも軽減しているように見えます。
細かい点では他にもいろいろな変更点はあるのですが、一番わかりやすく目立った変更はこのあたりだろうと思います。
最初に取り上げたような新しい時代を見据えた工夫がされていると感じます。
xlsxの内部構造に久しぶりに触れて感じたこと
今回久しぶりにExcelの内部構造に触れる機会があり、リリース時期やその時代の背景などをよくよく考えてみると、数年先を見据えた様々な工夫がされていたんだなど改めて感じました。
自身が開発を行う上で、どうしても今必要な機能を開発しがちなのですが、時代の流れや数年先を見据えた開発姿勢、創意工夫の意識は常に持ってく必要があると改めて感じた次第です。
さいごに
最初はGithub Copilot関連の記事を掲載しようとも考えていたのですが、記事を書こうとしたタイミングでこの記事の最初に触れた出来事があり、この記事を掲載しました。
最近はAIを使えばいろいろなことが自動でできたりと便利になっていますが、
普段使用している技術のちょっとしたところに興味を持ち、どういう構造をしているのか、なんでそんなことをしているのかなどを考える行為が少なくなっているように感じています。(最近はAIをどう使ったら的なことばかりのような...)
普段の業務に追われてなかなか時間を取るのは難しいとは思いますが、特に若い方々は、業務の合間の息抜きにでも少し時間をとって目を向けてみてはいかがでしょうか?
先を見据えた開発や創意工夫についてはAIではまだまだできない部分だと思うので、そういったところに少しでも興味をもってもらえたら幸いです。




