4

次のシナリオがあり、アドバイスが必要です。

ユーザーは単語文書をテンプレートとして入力し、実行時にいくつかのパラメーターを提供して、データベースにクエリを実行し、文書を埋めるためのデータを取得できるようにします。だから、私がする必要がある2つの基本的なことがあります:

  1. ドキュメント内のすべてのキーを、現在のクエリ行からのそれぞれの結果に置き換えます。
  2. クエリから取得した行数に応じて、既存のドキュメントを変更せずにそれ自体に「マージ」(コピー? 複製?) し、この新しいコピーのキーを次の行の値に置き換えます。

これを行うための最良のアプローチは何ですか?ハッシュマップを提供する unmarshallfromtemplate を使用して、今のところ置換部分を行うことができました。しかし、ドキュメントに「${variable_name}」を追加する必要があり、単語が異なるタグで「${」と「}」を区切って問題を引き起こすことがあるため、この方法は少し注意が必要です。

カスタム xml バインディングについて読んだことがありますが、完全には理解できませんでした。カスタム XML を生成し、それをドキュメントに挿入して (この un ランタイムのすべて)、applybindings を呼び出す必要がありますか?? これが当てはまる場合、ドキュメント内のフィールドを xml にバインドするにはどうすればよいですか? 名前で?

4

1 に答える 1

6

docx4j には VariablePrepare が含まれており、入力 docx を整理して、キーが別々の実行に分割されないようにすることができます。

ただし、特に繰り返しデータがある場合 (請求書の明細項目を考えてみてください) は、コンテンツ コントロール データ バインディングに切り替えたほうがよいでしょう。 開示:私はdocx4jでこのアプローチを支持しています。

コンテンツ コントロール データ バインディング アプローチを採用するには、次のようにします。

  1. データに適した XML 形式を考え出し、データベース クエリの結果をその形式に変換するコードを記述します。

  2. テンプレートを変更して、コンテンツ コントロールが XML ドキュメントの要素にバインドされるようにします。通常は、Word 用のオーサリング アドインを使用してこれを支援します。(Microsoft がバインドに使用するテクノロジは XPath であるため、バインド方法は XML 構造によって異なりますが、通常は要素名または ID にバインドします)。

  3. これで、XML ファイルと適切な入力 docx ができました。ContentControlsMergeXML には、実行時にインスタンス ドキュメントを作成するために必要なコードが含まれています。https://github.com/plutext/OpenDoPE-WARには、サーブレット環境用のバージョンもあります。

1 & 2 の代替として、現在の nightlies には org.docx4j.model.datastorage.migration.FromVariableReplacement もあり、既存の "${" ドキュメントを変換できます。ただし、標準化されたターゲット XML 形式に対してのみです。

さらに質問がある場合は、このトピック専用のフォーラムがhttp://www.docx4java.org/forums/data-binding-java-f16/にあります。

于 2013-03-16T21:12:44.127 に答える