Search jakarta

POI HSSF - レコードジェネレータ - HOWTO

POI HSSF - レコードジェネレータ - HOWTO

歴史

レコードジェネレータは、ExcelのレコードをJavaクラスに変換する際のフラストレーションに起因して誕生しました。これを手作業で行うことは、非常に時間のかかる事です。そして、非常によく間違いを起こしてしまう原因ともなります。

レコードがどのようなものになるかを定義し、うざったい作業を全て行ってくれるユーティリティが必要とされました。そこで、レコードジェネレータが生まれた、というわけです。

能力

レコードジェネレータは、入力用としてXMLを使い、以下の出力をします:

  • レコードのエンコード・デコードの可能なJavaファイル
  • レコードが望みどおりに作用しているかを保証するためのテストケースとしての空白で満たされた実装を提供するテストクラス

使用法

レコードジェネレータは、Antターゲット(generate-records)として呼び出されます。_record.xmlで終わるsrc/records/definitionsディレクトリ内の全てのファイルを綿密に探し出します。そして、2つのファイルを生成します;レコード定義のJavaとテストケーステンプレートのJavaです。

レコードそれ自体は、以下の一般的なレイアウトを持っています:


<record id="0x1032" name="Frame" package="org.apache.poi.hssf.record"

        excel-record-id="FRAME">

    <description>The frame record indicates whether there is a border

                 around the displayed text of a chart.</description>

    <author>Glen Stampoultzis (glens at apache.org)</author>

    <fields>

        <field type="int" size="2" name="border type">

            <const name="regular" value="0" description="regular rectangle or no border"/>

            <const name="shadow" value="1" description="rectangle with shadow"/>

        </field>

        <field type="int" size="2" name="options">

            <bit number="0" name="auto size"

               description="excel calculates the size automatically if true"/>

            <bit number="1" name="auto position"

               description="excel calculates the position automatically"/>

        </field>

    </fields>

</record>

        

The following table details the allowable types and sizes for the fields.

Type Size Java Type
int 1 byte
int 2 short
int 4 int
int 8 long
int varword array of shorts
bits 1 A byte comprising of a bits (defined by the bit element)
bits 2 An short comprising of a bits
bits 4 A int comprising of a bits
float 8 double
hbstring java expression String

Javaレコードは、レコードジェネレータが起動するたびに再生成されますが、テストスタブは、テストスタブがまだ存在していないときだけ作成されます。これは、テストスタブを変更できるが生成されるレコードではない、という事を意味しています。

独自のフィールドタイプ

時折、ビルトインのタイプでは満足できないこともあるでしょう。ストリームのエンコード・デコードをコントロールする場合は特にそうでしょう。これは、カスタム・タイプを使うことで達成することが可能です。

独自タイプによって、フィールドをエンコード/デコードする方法の定義をJavaで逃れる事が出来るようになるでしょう。カスタム・タイプをコーディングするには、以下のようにフィールドを宣言します:


    <field type="custom:org.apache.poi.hssf.record.LinkedDataFormulaField"

        size="var" name="formula of link" description="formula"/>

        

ここで、custom:に続いて指定されているクラス名は、CustomFieldインターフェースを実装したクラスです。

それから、ご自身でエンコーディングを実装することが出来ます。

どのように動くか?

レコードジェネレータはXMLファイルを使って動作し、XSLTを使ってスタイルを整形します。XSLTになんらかの形で少し制限があると仮定すれば、その大元にJavaコードを少し追加する必要があったのでしょう。

record.xsl, record_test.xsl, FieldIterator.java, RecordUtil.java, RecordGenerator.java をご覧になってください。

対応する"type"のHDF用のジェネレータがあります。詳細は、HDFのドキュメントをご覧下さい。

制限

レコードジェネレータは、全ての可能性のあるレコード型を扱うことはなく、またそのように意図されていません。しばしば、レコードを手入力で生成する方が賢明な場合もあるでしょう。レコードジェネレータの主眼は、時間を節約することにありますから、其の事は忘れないで置いてください。

現在、レコードを生成するXSLファイルはJavaオブジェクトを呼び出すことでしょう。レコード生成用Javaコードは、最小限のコメントしかなく現在非常にごちゃごちゃしています。

by Glen Stampoultzis, Andrew C. Oliver
Original English Page would be found from HERE     --    BBS/ApacheNews
Terra-International, Inc. -- テラ・インターナショナル
Special Thanks -- 【お問い合わせ/テキスト広告】