どのようにWord文書内の文字列を置換することによって、段落を挿入します

Dhanu K:

私は私のJavaプロジェクトでPOI-OOXML 3.17をorg.apache.poi使用しています。私の要件は、(署名のような)いくつかのテキストをワード文書からテキストを置換することです。

どういうわけか私のコードは私のキーワードを交換するとともに、ページの一番下でその段落を追加して、ここではコードの私のブロックであり、

public XWPFDocument addUserCompany(XWPFDocument doc, String imagePath,String userCompanyAddressInfo,String userCompanyContactInfo,String keyword) throws IOException, InvalidFormatException {
    int i=0;
    XWPFParagraph newPara = getNewPara(doc, imagePath, userCompanyAddressInfo, userCompanyContactInfo);
    for(XWPFParagraph existingPara:doc.getParagraphs()){
        for(XWPFRun existingRun:existingPara.getRuns()){
            if(existingRun!=null && existingRun.getText(0)!=null  && existingRun.getText(0).contains(keyword)){
                doc.setParagraph(newPara, i);
            }
        }
        i++;
    }
    return doc;
}
private XWPFParagraph getNewPara(XWPFDocument doc, String imagePath, String userCompanyAddressInfo, String userCompanyContactInfo) throws IOException, InvalidFormatException {
    XWPFParagraph newPara = doc.createParagraph();
    XWPFRun newRun = newPara.createRun();
    File imageFile1 = new File(imagePath);
    if (imageFile1.exists()) {
        int imgFormat1 = getImageFormat(imageFile1.getName());
        newRun.addPicture(new FileInputStream(imageFile1), imgFormat1, imageFile1.getName(), 491066, 491066);
        newRun.addBreak();
    }
    newRun.setText(userCompanyAddressInfo);
    newRun.addBreak();
    newRun.setText(userCompanyContactInfo);
    newRun.addBreak();
    return newPara;
}

word.addUserCompany(doc, userCompanyImage, userCompanyAddressInfo, userCompanyContactInfo, "${USERCONTACTINFO}");

ここに私の原稿があります

ここでは、画像の説明を入力します。

その結果文書のスクリーンショットです ここでは、画像の説明を入力します。

結果文書に、あなたはまた、ページの上部と一緒に下のページに追加署名を見ることができます

私はこの問題を修正することができます誰かのヘルプ

アクセル・リヒター:

主な問題は、ということですXWPFDocument.createParagraphは常にこのドキュメントに新しい段落を追加します。だから、使用して交換するために、段落の代替として、その段落を設定した後XWPFDocument.setParagraphを、我々は文書から、以前作成した新しい段落を削除する必要があります。このためXWPFDocument.removeBodyElement-使用することができます。

ところで:あなたは必要としないint i位置マーカーとして。ありXWPFDocument.getPosOfParagraphが

私たちは、ドキュメントから段落を削除する必要があるので、これは段落をループで実行することはできません。だから我々は決定する必要がparagraphToReplace最初のループにしてから、新しい作成した段落とその段落を交換し、文書から新規作成された段落を削除します。

だから、addUserCompanyのようにする必要があります:

 public XWPFDocument addUserCompany(XWPFDocument doc, String imagePath,String userCompanyAddressInfo,String 
  userCompanyContactInfo,String keyword) throws Exception {
  XWPFParagraph paragraphToReplace = null;
  for(XWPFParagraph existingPara : doc.getParagraphs()) {
   if(existingPara.getText().contains(keyword)) {
    paragraphToReplace = existingPara; 
   }
  }
  if (paragraphToReplace != null) {
   XWPFParagraph newPara = getNewPara(doc, imagePath, userCompanyAddressInfo, userCompanyContactInfo);
   doc.setParagraph(newPara, doc.getPosOfParagraph(paragraphToReplace));
   doc.removeBodyElement(doc.getPosOfParagraph(newPara));
  }
  return doc;
 }

私は、テキストランからプレースホルダを取得しようとしないことに注意してください。Word時々テキストランを作成するための奇妙なルールを使用しています。したがって、この例では${USERCONTACTINFOして}、それぞれがそれ自身のテキストランであるかもしれません。そして、existingRun.getText(0).contains(keyword)本当のことがないだろう決して。私たちはとにかく段落全体を交換しているので、しかし、我々はまた、段落は使用したキーワードが含まれているかどうかを確認することができますexistingPara.getText().contains(keyword)これは、の部分があっても真であるkeyword別のテキストランです。

完全な例:

import java.io.*;
import org.apache.poi.xwpf.usermodel.*;

public class WordReplaceParagraphContainingKeyword {

 static XWPFDocument addUserCompany(XWPFDocument doc, String imagePath,String userCompanyAddressInfo,String 
  userCompanyContactInfo,String keyword) throws Exception {
  XWPFParagraph paragraphToReplace = null;
  for(XWPFParagraph existingPara : doc.getParagraphs()) {
   if(existingPara.getText().contains(keyword)) {
    paragraphToReplace = existingPara; 
   }
  }
  if (paragraphToReplace != null) {
   XWPFParagraph newPara = getNewPara(doc, imagePath, userCompanyAddressInfo, userCompanyContactInfo);
   doc.setParagraph(newPara, doc.getPosOfParagraph(paragraphToReplace));
   doc.removeBodyElement(doc.getPosOfParagraph(newPara));
  }
  return doc;
 }

 static XWPFParagraph getNewPara(XWPFDocument doc, String imagePath, String userCompanyAddressInfo, String 
  userCompanyContactInfo) throws Exception {
  XWPFParagraph newPara = doc.createParagraph();
  XWPFRun newRun = newPara.createRun();
  File imageFile1 = new File(imagePath);
  if (imageFile1.exists()) {
   //int imgFormat1 = getImageFormat(imageFile1.getName());
   int imgFormat1 = Document.PICTURE_TYPE_PNG;
   newRun.addPicture(new FileInputStream(imageFile1), imgFormat1, imageFile1.getName(), 491066, 491066);
   newRun.addBreak();
  }
  newRun.setText(userCompanyAddressInfo);
  newRun.addBreak();
  newRun.setText(userCompanyContactInfo);
  newRun.addBreak();
  return newPara;
 }

 public static void main(String[] args) throws Exception {

  XWPFDocument doc = new XWPFDocument(new FileInputStream("source.docx"));
  String userCompanyImage = "logo.png";
  String userCompanyAddressInfo = "111 E.Jefferson Avenue Naperville, Illinois 60540";
  String userCompanyContactInfo = "Phone: 312-100-7387";

  addUserCompany(doc, userCompanyImage, userCompanyAddressInfo, userCompanyContactInfo, "${USERCONTACTINFO}");

  FileOutputStream out = new FileOutputStream("result.docx");
  doc.write(out);
  out.close();
  doc.close();
 }
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=34638&siteId=1