私は私の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();
}
}