7

クラスを使用して、テンプレートDOCXドキュメントを Apacheに置き換えようとしています。ドキュメントにタグがあり、置換データを読み取るためのファイルがあります。私の問題は、拡張子をファイルに変更して開くと、テキスト行が特定の方法で区切られているように見えることです。たとえば、テキストはと別々になります。原文はこうなので同じように読みます。これにより、テキストを別々に表示する 2 つのオブジェクトが段落に作成されます。POIXWPFDocumentJSONDOCXZIPdocument.xml[MEMBER_CONTACT_INFO][MEMBER_CONTACT_INFO]POIDOCXXWPFRun[MEMBER_CONTACT_INFO]

私の質問は、POI関連する実行をマージするなどして Word のように強制的に実行する方法はありますか? または、どうすればこの問題を解決できますか? 置換中に実行テキストを照合していますが、タグが 2 つの異なる実行オブジェクトに分割されているため、タグが見つかりません。

一番

4

4 に答える 4

14

これはかつて私の時間を無駄にしました...

基本的に、XWPFParagraphは複数XWPFRunの で構成され、XWPFRun は同じスタイルが固定された伝染性のあるテキストです。

したがって、MS-Word で "[PLACEHOLDER_NAME]" のようなものを書き込もうとすると、単一の XWPFRun が作成されます。しかし、何らかの方法でさらにいくつかのものを追加してから、「[PLACEHOLDER_NAME]」を別のものに変更した場合、それが単一のままであるとは限りませんXWPFRun。2 つの実行に分割される可能性は十分にあります。私の知る限り、これがMS-Wordの仕組みです。

そのような場合に実行の分割を回避するにはどうすればよいですか?

解決策:私が知っている 2 つの解決策があります。

  1. テキスト「[PLACEHOLDER_NAME]」をメモ帳などにコピーします。必要な変更を行い、Word ファイルの「[PLACEHOLDER_NAME]」の代わりにそれをコピーして貼り付けます。これにより、「[PLACEHOLDER_NAME]」全体が新しいテキストに置き換えられ、XWPFRun の分割が回避されます。

  2. 「[PLACEHOLDER_NAME]」を選択し、MS-Word の「置換」オプションをクリックして「[Your-new-edited-placeholder]」に置換すると、新しいプレースホルダーが単一の XWPFRun を消費することが保証されます。

新しいプレースホルダーを再度変更する必要がある場合は、手順 1 または 2 に従います。

于 2015-07-08T07:56:41.517 に答える
1

私にとっては、期待どおりに機能しませんでした(毎回)。私の場合、テキストで「${PLACEHOLDER}」を使用しました。最初に、Apache Poi が Runs で反復処理する各段落をどのように認識するかを確認する必要があります。 run は、同じフォント スタイル/フォント サイズ/色/太字/斜体などの一連の文字列です。このようにすると、プレースホルダーが部分に分割される場合や、段落全体が 1 つの Run として認識される場合があり、単語を繰り返し処理することができませんでした。 .
私がしたことは、テンプレートドキュメントでプレースホルダー名を太字にすることです. RUN を反復するときよりも、プレースホルダー名全体を反復することができました${PLACEHOLDER} . その値を

for (XWPFRun r : p.getRuns()) {
  String text = r.getText(0);
  if (text != null && text.contains("originalText")) {
     text = text.replace("originalText", "newText");
     r.setText(text,0);
     }
  }

r.isBold(false);setTextの直後に追加しました。
そうすれば、プレースホルダーは別の実行として認識されます->特定のプレースホルダーを置き換えることができ、処理されたドキュメントでは太字がなく、プレーンテキストのみになります。
私にとって追加の利点の 1 つは、テキスト内のプレースホルダーを視覚的にすばやく見つけることができることです。したがって、最終的に上記のループは次のようになります。

for (XWPFRun r : p.getRuns()) {
      String text = r.getText(0);
      if (text != null && text.contains("originalText")) {
         text = text.replace("originalText", "newText");
         r.setText(text,0);
         r.isBold(false);
         }
      }

私はそれに多くの時間を費やしていますが、それが誰かに役立つことを願っています:)

于 2020-02-04T07:34:26.183 に答える
0

私も数日前にこの問題を抱えていましたが、解決策が見つかりませんでした。[PLACEHOLDER_NAME] の代わりに PLACEHOLDER_NAME を使用することにしました。これは私にとってはうまく機能しており、単一の XWPFRun オブジェクトのように見えます。

于 2013-12-06T15:05:51.607 に答える