パッケージ org.opengion.hayabusa.report2
package org.opengion.hayabusa.report2
OpenOfficeを利用した帳票システム関係のクラスです。 従来のExcel帳票は、互換性のため残っていますが、こちらのパッケージが今後の主流の帳票システムになります。
-
クラス説明OpenOfficeを利用して様々な形式のファイルを読み込み、出力・印刷を行うための変換クラスです。 変換を行うことのできる入出力のフォーマット以下の通りです。 [対応フォーマット] 入力[Calc(ods) ,Excel(xls) ] ⇒ 出力[Calc(ods) ,Excel(xls,xlsx) ,PDF] 入力[Writer(odt) ,Word(doc) ] ⇒ 出力[Writer(odt) ,Word(doc,docx) ,PDF] 入力[Impress(odp),PowerPoint(ppt)] ⇒ 出力[Impress(odp),PowerPoint(ppt,pptx) ,PDF] 入力[ * 上記の全て ] ⇒ 印刷 ※ xlsx,docx,pptx は、MS 2007形式の為、LibreOffice のみ利用できます。 変換を行うには、以下の2通りの方法があります。
(1)簡易的な変換メソッドを利用する場合 #convert(String, String)を利用して、変換を行います。 この場合、出力形式は、出力ファイルの拡張子に従って自動的に決定されます。 このため、印刷処理などを行う場合は、(2)の方法で出力して下さい。(2)段階的に各メソッドを呼び出して変換する場合 オブジェクトを生成した後、DocConverter_OOO.open()
、#(各種変換メソッド)、Object.clone()
を 順番に呼び出して変換を行います。 この場合、出力形式は、それに対応するメソッドを呼び出すことで決定されます。 また、変換を行うための、各種メソッドは、例外としてThrowableを投げるように定義されています。 このクラスを利用する場合は、このThrowableをcatchし、catch句で、必ずDocConverter_OOO.close(boolean)
に、 "true"(エラー発生時のクローズ処理)を指定して、終了処理を行って下さい。 (これを行わない場合、OpenOfficeの不要なプロセスが残ってしまう可能性があります) また、出力ファイルが既に存在する場合、出力ファイルは一旦削除された後、処理されます。 なお、入力ファイルと出力ファイルが同じ場合、何も処理されません。(例外も発行されません) 入力ファイルを、CSV形式で複数指定した場合、複数の入力ファイルをマージして出力します。 ※1 現状は、ファイルのマージは、入力ファイルがExcelまたはCalcの場合のみ対応しています。 ※ DocConverter は、クラウド対応されていません。変換時はローカルファイル間で行ってください。帳票要求に設定された実行方法により、各種出力、Excel取り込み処理を行います。 1.出力 雛形ファイルを一時ディレクトリに展開した後、帳票データを埋め込み、最後にOpenOffice.orgの プロセスを利用して出力を行います。 対応している出力方法は、印刷、PDF出力、Excel出力です。 一時ディレクトリは、システムリソースのREPORT_FILE_URLで定義されたディレクトリです。 これが定義されていない場合は、システムリソースのFILE_URLで定義されたディレクト以下の/REPORTに 展開されます。 一時ファイルは、処理が正常に終了した場合、削除されます。(ODS出力のみにした場合は、出力直前の ODSファイルは残ります) 処理でエラーが発生した場合は、一時ファイルはデバッグのため、削除されません。 2.取り込み 旧帳票システムの取り込み処理及びその後のPG起動を行います。 実行方法により、出力、入力を行います。帳票処理要求を管理するキューオブジェクトです。 このオブジェクトでは、帳票の定義及びデータと、処理中に発生したエラーメッセージを管理します。 また、このキューを生成したオブジェクトもこのオブジェクトにセットされます。帳票要求スレッドの本体です。 外部からスタックされたキューを先入れ先出しの順番に処理します。 あるキューに対してエラーが発生すると、システムリソースのRETRY_COUNTで設定された回数再処理を試みます。 この回数分エラーが発生した場合は、そのキューのみがアプリエラーとなります。 このスレッドは一度生成されると、外部から明示的に終了の要求を起こさない限り生存し続けます。 終了するには、finish()メソッドを呼び出します。 このメソッドが呼ばれると、内部でスタックしているキューは全てクリアされるため、その時点で 処理されているキューの処理が完了した時点で、スレッドが終了します。帳票処理を行う各スレッドを管理するクラスです。指定されたパスに存在するODSの各XMLファイルをパースし、帳票定義及び 帳票データから書き換えます。シート単位のcontent.xmlを管理するためのクラスです。 シートのヘッダー、行の配列、フッター及びシート名を管理します。 7.0.1.5 (2018/12/10) FORMAT_LINEでは、同一行をコピーするため、セルの選択行(A5とか$C7とか)までコピーされ 行レベルの計算が出来ません。その場合は、INDIRECT(ADDRESS(ROW();列番号))関数を 使用することでセルのアドレスが指定可能です。 列番号は、A=1 です。 ※ OpenOffice系は、区切り文字が『;』 EXCELの場合は、『,』 要注意 ※ 繰り返しを使用する場合で、ヘッダー部分の印刷領域を繰り返したい場合は、 1.Sofficeのプロセスを管理するファクトリクラスです。 プロセスプールの実装は、AbstractObjectPoolを継承して実装されています。 プロセスの初期生成数は0です。最大生成数は、システムリソースのREPORT_MAX_PROCESS_COUNTで 定義されます。また、生存時間は、REPORT_PROCESS_ALIVEで定義されています。 プロセスを全て終了するには、clearメソッドを呼び出します。 clearメソッドは、Cleanableインターフェースの実装として組み込まれ、SytemManagerに登録されるため、 Tomcat終了時に、自動的にプロセスが終了されます。 但し、貸し出し中(処理中)のプロセスは、AbstractObjecgPoolの実装から、終了されないため、別の方法で 明示的にkillする必要がありますProcessPool は、AbstractObjectPool を継承した オブジェクトプールです。 OpenOfficeのプロセスをプールします。帳票処理のキューの処理方法を定義するインターフェースです。DBからキューを作成するためのクラスです。 キューはGE5xテーブルから作成されます。 キュー生成時点(処理スレッドにスタックした時点)では、帳票データのテーブルモデルは作成されません。 帳票データは、各スレッドからset()メソッドを呼び出したタイミングで生成されます。 処理開始及び、完了のステータスは、GE50の完成フラグに更新されます。 また、エラー発生時のメッセージは、GE56に更新されます。帳票明細データを帳票レイアウトテーブルに従って分割し、その結果をDBTableModelとして 生成します。 データの分割は、バイト数ベースで行われるため、エンコードを正しく指定する必要があります。 エンコード指定は、システムリソースのDB_ENCODEで指定します。 レイアウトテーブルが存在しない場合、又は、帳票データが存在しない場合、DBTableModelは nullで返されます。画面から直接キューを作成するためのクラスです。OpenOfficeのプロセスを表すクラスです。 bootstrap()メソッドが呼ばれたタイミングでsoffice.binのプロセスを生成します。 soffice.binのプロセスを引数なしで実装した場合、通常は各ユーザーで1プロセスしか 生成されないため、-env:UserInstallationの引数を指定することで、仮想的に別ユーザー として起動しています。 この"ユーザー"を表すキーは、コンストラクタの引数のidです。 また、この仮想ユーザーで起動した場合、初回起動時にユーザー登録を促す画面が立ち上がります。 これを回避するため、デフォルトの環境ファイルをプロセス生成前にコピーすることで、認証済みの 状態で立ち上がるようにしています。 起動したプロセスとの通知は名前付きパイプで行われます。パイプ名は、"env"+コンストラクタのidです。 プロセス起動と、名前付きパイプでの接続は非同期で行われます。プロセス起動後、60秒経過しても接続できない場合は、BootstrapExceptionが発生します。OpenOfficeのプロセスを表すクラスです。Calc帳票システムでタグのパースを行うためのクラスです。 主に開始タグ、終了タグを指定したパースのループ処理を行うための機能を提供します。 具体的には、TagParser.doParse(String, String, String)
により、パース文字列、開始タグ、終了タグを 指定し、パースを行います。 パース後の文字列は、TagParser.doParse(String, String, String)
の戻り値になります。 パース実行中に、発見された開始タグから終了タグまでの間の文字列の処理は、TagParser.exec(String, StringBuilder, int)
を オーバーライドすることにより定義します。 また、このクラスでは、パースに必要な各種ユーティリティメソッドについても同様に定義されています。アンダーバーで、キーと行番号の分離を行います。