ブログ

ご注意:
この情報は過去に書かれたブログ記事のキャッシュになります。最新の情報ではありませんのでご注意ください。
また、公開当時のキャッシュされたテキストのみを読めるようにした内容になっております。 公開当時の画像やデザイン情報がありませんので、デザイン上読みにくい部分がありますことをご了承ください。 なお、最新のブログはGitHubにて公開しています。

日付0000/00/00

XLS形式で文書を作成することができる,xlslibというライブラリがあったので,プラグインにしてみました。


Microsoft Excelで開けるような形式でデータを書き出せるようにして欲しい,というエンドユーザーは,結構,多いと思います。データの抽出およびMS Excel向けのエクスポートを実現するための方法は,手頃なものから本格的なものまで,いろいろ考えられますが,一般的な手法としては,次のようなものが挙げられます。

POCESS 4D TAGS
4D TAGが埋め込まれたXMLテンプレートを用意しておき,Excel 2004 XMLスプレッドシートに変換するという方法です。非常に手軽(ワンコマンド),高速,汎用的な方法であるため,現在では多数のデベロッパーが採用しています。AppleScript/VBAとは違い,マシンにMS Excelがインストールされていなくてもスプレッドシートが作成できる点,SEND PACKET/EXPORT DATAとは違い,数値・時間・日付などの非文字データ型を正確に出力したり,セルのカラーやフォントなどのスタイルを制御できる点が優れています。

弱点は,MS Excelのバージョンが古過ぎるとXML形式が認識されない点,拡張子が.xmlであるため,ダブルクリックで自動的にMS Excelが起動するとは限らない点などが挙げられます。また,グラフやイメージなど,複雑なデータは,このファイル形式でサポートされていません。

スプレッドシートを動的に作成するためには,あらかじめMS Excelでひな形となる文書を作成しておきます。セルに色を付けたり,フォント名やサイズを設定し,データが書き込まれる部分には,プレースホルダーとなるような文字列を入力した後「Excel 2004 XMLスプレッドシート(.xml )」形式で文書を保存します。

次に,作成したXMLファイルをテキストエディター等で開き,プレースホルダーの文字列を4D TAGで置換してゆきます。また,セレクションや配列の数だけ繰り返されるべき箇所には,4DLOOP/4DENDLOOPを配置します。XMLスプレッドシートの構造定義には,行数,列数等の表明もあるので,それらも必要に応じて4DVARで置換します。

4D TAGは,単なるXMLコメントなので,それが挿入された文書は引き続き妥当なXMLです。しかし,そのような文書をMS Excelで再び開いてしまうと,コメントである4D TAGは除去されてしまうため,一旦,タグを挿入したXML文書は,以後,MS Excelで開かないように注意する必要があります。

そのようにして作成したテンプレートをResourcesフォルダなどにまとめておき,PROCESS 4D TAGSで変換すれば,MS Excelで開くことができるXMLスプレードシートが瞬時に作成できます。

注記:OS Xであれば,ファイルタイプおよびクリエイターを変更することにより,MS Excelアプリケーションを関連付けることができます。(ファイルタイプ/クリエイターはdeprecatedなので,将来のバージョンでは動作しないかもしれません。)

SET DOCUMENT CREATOR($temporalPath_t;"XCEL")
SET DOCUMENT TYPE($temporalPath_t;"XMLS")

DOM/SAX
通常は,上述したPROCESS 4D TAGSコマンドで充分なはずですが,エクスポートされるスプレッドシートを高度にカスタマイズしたい場合,DOM/SAXコマンドでXMLを作成したほうが良いかもしれません。あるいは,両方を組み合わせる,つまり,DOM/SAXでテンプレートを作成し,PROCESS 4D TAGSコマンドで仕上げるという方法も考えられます。

注記:コマンドによる4D TAG,つまりXMLコメントの挿入は,SAX,および 4D v12以降のDOM Append XML child nodeでサポートされています。

PHP
PHPコミュニティには,MS Excelファイルの処理に関連したソリューションがいくつか存在します。中でも「PHPExcel」は,スプレッドシート属性の読み書きを幅広くサポートし,XLS,XLSX,CSV,PDF,HTMLファイル形式に対応しているなど,非常に高機能なライブラリです。

http://phpexcel.codeplex.com/

PHP Executeでスプレッドシートを作成する方法は,テクニカルノートで紹介されています。

http://betakb.4d.com/assetid=76312

OOXML
MS Excel 2007以降,OOXML準拠の標準フォーマット(拡張子.xlsx)がサポートされるようになtりました。

http://msdn.microsoft.com/en-us/library/aa338205.aspx.

この形式のフォーマットは,実際にはzip圧縮されたXML等のファイル群なので,XMLの作成およびzipアーカイブの入出力ができれば,事実上,MS Excelスプレッドシートがプログラムで作成できることになります。具体的には,4DコマンドでXMLを作成し,7-zipで圧縮すれば「.xlsx」ファイルを作成することができます。この方法も,テクニカルノートで紹介されています。

http://betakb.4d.com/assetid=75195

注記:OS Xはシステム標準のzipコマンドが使用できます。

AppleScript/VBA
MS Excelは,各プラットフォーム標準のスクリプト言語で制御することができることに着目し,LAUNCH EXTERAL PROCESSで命令を発行してスプレッドシートを作成するという方法もあります。この場合,文書を作成するマシンにMS Excelがインストールされていなければなりません。また,スクリプトの実行には,かなりのCPUパワーを消費するため,コードを最適化し,呼び出しの回数を少なくするなどの工夫が必要です。

http://sources.4d.com/trac/4d_keisuke/wiki/ExcelLibrary

SEND PACKET/EXPORT DATA
レコードデータを標準テキスト形式で書き出したものをMS Excelで開くという原始的な方法です。出来あがったファイルの拡張子を「.xls」などに変更し,クライアントアプリケーションを強制的にMS Excelにする(関連づけ)こともできます。

標準テキストファイルの性格上,ファイルの文字エンコーディングは暗示的にならざるを得ません。MS Excelのデフォルトエンコーディングは,通常,アプリケーションのロケールを反映しており,日本語版のMS Excelであれば,Code Page 932 (Windows版) あるいはMacJapanese (OS X版) です。したがって,データを書き出す側のコードでは,USE CHARACTER SETコマンドを発行し,データを開示する環境に合わせた文字コードを正確に指定する必要があります。

注記:エンコーディング名「Shift_JIS」の動作はプラットフォームに依存します。USE CHARACTER SETコマンドでエンコーディングを指定した場合,Windowsでは,Windows-31Jが選択され,OS XではShift_JIS,つまり機種依存文字を含まない基本の文字セットだけがエクスポートされます。エンドユーザーがWindows主体であれば,両方プラットフォームで「Windows-31J」を指定するのが無難でしょう。一方,基本的にOS X版のMS Excelしか使用しないのであれば,「X-Mac-Japanese」エンコーディングでデータを書き出すことにより,扱える文字の範囲を最大限まで拡げることができます。

Unicode (UTF-8) で標準テキストデータを書き出すという方法もあります。その場合,ファイルの先頭にBOMコードを追加することを忘れないでください。EXPORT DATAコマンドの場合,XMLプロジェクトファイルでUTF-8書き出しを指定すればOKです。SEND PACKETの場合,冒頭に0xEF,0xBB,0xBF (239,187,191) の3バイトを出力してからデータを書き出すようにしてください。BOMが書き込まれていない場合,MS Excel側はウィザードを使用してUnicodeファイルをインポートしなければなりません。

MS Excelが標準テキストのBOMを認識するのは,ファイルがタブ区切り形式の場合に限られることにも留意する必要があります。カンマ区切り(.csv)の場合,インポートウィザードを使用したとしても,Unicodeファイルを読み込むことはできません。CSVファイルの文字コードは,事実上,プラットフォームネイティブのShift_JISに限定されることになります。

xlslib
C/C++でXLSファイルを作成することができるライブラリです。今回,プラグインではバージョン2.3.4を使用しました。

http://xlslib.sourceforge.net/

スプレッドシートの作成,セルの書き込み,フォーマット/フォントオブジェクトの定義,セルの合成などができます。各プラットフォームでUnicodeのファイルパスが扱えるよう,若干ソースコードを書き換えました。

http://sources.4d.com/trac/4d_keisuke/wiki/Plugins/XLS