RTFフォームに基づいてレポートを準備する簡単な方法

エンタープライズレベルの情報システムの実際の運用では、特にレポートシステムの開発が不十分な場合、さまざまなフォーム(ステートメント、証明書、結論など)に記入するか、レーザープリンターで印刷するためのレポートをほぼこの形式で準備する必要がしばしばあります。 :



RTFブランクの例

ドキュメントのタイトル: PARAM1

1行目 価値 PARAM2
行2 価値 PARAM3


署名: PARAM4



図1 rtfファイル形式のフォームの例、変数は「QUOTE」タイプのフィールド形式で記述されています-PARAM1、PARAM2、PARAM3、PARAM4







フォームにデータを入力する場合、PARAM1 ... 4変数をそれらの値に置き換える必要があります。

同時に、フォームのフォームは通常一定のままで変更されず、フォームの特定のフィールドはデータベーステーブル、データファイルなどから「ロード」する必要があります。 Perl言語では、変数名に対応するキーを持つハッシュ値:

(PARAM1 =>” PARAMETER1”、PARAM1 =>” PARAMETER2”、PARAM1 =>” PARAMETER3”、

PARAM1 =>” PARAMETER4”)

その結果、レーザープリンターで印刷できるフォームは次のようになります。



RTFブランクの例

ドキュメントのタイトル: OPTION1

1行目 価値 PARAMETER2
行2 価値 パラメーター3


文書の下の署名: PARAMETER4



図2「QUOTE」タイプのフィールドを対応するハッシュキーの値に置き換えてrtf形式(図1)に入力した結果





同時に、いくつかの難しい互換性のない要件を満たす必要があります-フォームの開発と修正は、エンドユーザー(会計士、人事担当者、マネージャーなど)が利用でき、任意のフィールドをマージできるようにし、プログラマーまたは従業員にデータ抽出手順を準備しますサポートサービス。つまり、データの表示をデータ抽出手順から分離する必要があります。



もちろん、このようなデータマージテクノロジーはMS Wordで長い間使用されていると言えますが、深刻な欠点があります:マージ手順は、準備のできていないユーザーにとってはかなり複雑です(データファイルの準備、フォームの選択、マージプロセスの開始、結果の処理が必要です) 。



別のオプション-XMLファイルの形式でフォームを使用し、XSLTテーブルで説明されている置換ルールに従ってフォームを入力する-は、MS Wordで作業することに慣れている未熟なユーザーがXMLファイルのフォームを作成および編集するのが難しいという欠点があります。 MS Wordに匹敵するXMLを扱うための一般的なツールを見つけるのは困難です。



大規模な銀行情報システムでの作業中に開発およびテストされたソリューションは、単純なスクリプトを使用してrtfレポートフォームのデータを自動的に置き換えるオプションでした(この場合、perlが使用されましたが、正規表現処理をサポートする任意の言語が可能です)。 rtfテキストドキュメントで「QUOTE」タイプのフィールド記述子を検索し、これらのフィールドのシンボル名を、ファイルのデータベーステーブルから抽出された同じ名前の変数の値に置き換えます。 データ(点でのperl - 対応するシンボル名フィールドの鍵付きハッシュ)。



このような置換を実行するコメント付きのスクリプトの例は、投稿の最後に示されています。



ほとんどの場合、スクリプトの原理の簡単な説明は必要ありません(変数値の置換を含む既製のrtf-formが一時ファイルtemp.rtfに出力され、プリンターに送信する準備ができています)、関心のある唯一の部分は正規表現です:



$rtf =~ s/\{\\field\b[^{}]*\{\\\*\\fldinst.*?{\\fldrslt\s*\{([^}]+\s)?\s*([^}]+\s) ?\s*([^}]+)\}\s*((?:\{[^{}]+\}\s*)*)\}\s*\}/dosubst($1,$2,$3,$p,$&)/gesx;
      
      







rtfファイルで「QUOTE」タイプのフィールド記述子を検索し、dosubst関数によって返された%pハッシュからの対応する値に置き換えます。 この正規表現の有効性は、Office 95からOffice 2010までのすべてのMS Officeパッケージによって準備されたrtfファイルでテストされます。



もちろん、この方法にはいくつかの欠点があります。たとえば、特に長いテーブルの場合、rtfフォームにテーブル値を出力するのはかなり困難です(たとえば、perlスクリプトを作成してすぐに出力できます)。 :



-フォームの開発とデータ配置のためのフィールドの配置は、Wordエディター(テキストに「QUOTE」タイプのフィールドを挿入できる)に精通している一般ユーザーが実行できます。その後、データフィールド名のリストと、プログラマーまたはサービススペシャリストに置き換えるときに何を配置するかを通知しますサポート;

-データをダウンロードするスクリプトの開発はプログラマーによって行われ、将来、必要に応じてフォーム(フォント、インデント、ロゴなど)の表面的な変更が行われるため、サポートサービスまたはユーザーがこの作業を簡単に処理できるプログラマーを引き付ける必要はありません-フォームの作成者。



したがって、ユーザーまたはサポートサービスが担当するデータ表示フォームを、抽出手順がプログラマーによって開発された実際のデータから簡単に分離できます。



 #!/usr/bin/perl # filling rtf-blank # Dim Kobzev, Andrew Sapognikov # 2004 $==1000; #-------------------------filling template file------------------------------- sub dosubst { my ($pfx, $key, $xtrakey, $parm, $str) = @_; if (defined $xtrakey) { $xtrakey =~ s/[{}]//g; $xtrakey =~ s/\\w+//g; $xtrakey =~ s/\s//g; $key .= $xtrakey; } defined ($parm->{$key}) or return "\{$pfx\}"; my $val = $parm->{$key}; $val =~ s/([{}\\])/\\$1/g; $val =~ s/\n/\\line/g; $val =~ s/\r//g; return "\{$pfx$val\}"; } sub template ($$) { #filling $filename with hash $p my ($filename,$p)=@_; my $rtf; local $/, *F; open (F,"< $filename") or die "Cannot open $filename"; $rtf=<F>; close(F); #set win-1251 codepage $rtf =~ s/\\f(5|6)\\fmodern\\fcharset0/\\f$1\\fmodern\\fcharset144/; $rtf =~ s/\{\\field\b[^{}]*\{\\\*\\fldinst.*?{\\fldrslt\s*\{([^}]+\s) ?\s*([^}]+)\}\s*((?:\{[^{}]+\}\s*)*)\}\s*\}/dosubst($1,$2,$3,$p,$&)/gesx; return $rtf; }; #-------------------------main-------------------------------------------------- %p=('PARAM1'=>"1",'PARAM2'=>"2", 'PARAM3'=>"3",'PARAM4'=>"4"); my $tfil='temp.rtf'; open *FILE, "> $tfil" or die "Cannot open temporary file $tfil"; print FILE template("blank.rtf",\%p); close *FILE; #---------------------------------end main-------------------------------------
      
      






All Articles