我想使用 Apache POI XWPF 在一个框中显示 Word 中的文本,如下所示:
此示例是在 Word 中使用形状完成的,形状内有文本。
但是我无法使用 XWPF 在 Word 中正确执行此操作。当我尝试时:
public void createDocument() throws IOException {
XWPFDocument doc = new XWPFDocument();
XWPFParagraph paragraph = doc.createParagraph();
XWPFRun run = paragraph.createRun();
run.setText("The text");
CTGroup ctGroup = CTGroup.Factory.newInstance();
CTShape ctShape = ctGroup.addNewShape();
ctShape.setStyle("width:100pt;height:50pt");
ctShape.setFillcolor("FF0000");
Node ctGroupNode = ctGroup.getDomNode();
try {
CTPicture ctPicture = CTPicture.Factory.parse(ctGroupNode);
CTR cTR = run.getCTR();
cTR.addNewPict();
cTR.setPictArray(0, ctPicture);
} catch (XmlException ex) {
}
try ( OutputStream stream = new BufferedOutputStream(new FileOutputStream(file))) {
doc.write(stream);
}
doc.close();
}
我有一个形状,但文本不在形状内,并且形状未填充。
我使用了这个例子:使用apache poi在文档.docx中创建文本框
我的示例使用 apache poi 在文档 .docx 中创建文本框使用 Microsoft 的 VML 对象模型。
最后一个示例也适用于当前的 Apache POI 5.2.4。
文本框中的文本必须在文本框内容内。此代码行设置它:
...
ctTxbxContent.addNewP().addNewR().addNewT().setStringValue("The TextBox text...");
...
但是如果要使用填充颜色,则周围的形状必须有一条封闭的线。任一者都会设置一个Path来描述形状轮廓。或者 - 更简单 - 人们可以使用矩形而不是简单的形状。 Apache POI for Word 中的矩形形状是
com.microsoft.schemas.vml.CTRect
而不是 com.microsoft.schemas.vml.CTShape
。
以下对我有用:
import java.io.FileOutputStream;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPicture;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTxbxContent;
import com.microsoft.schemas.vml.CTGroup;
import com.microsoft.schemas.vml.CTRect;
import com.microsoft.schemas.office.word.CTWrap;
import com.microsoft.schemas.office.word.STWrapType;
import org.w3c.dom.Node;
public class CreateWordTextBox {
public static void main(String[] args) throws Exception {
XWPFDocument doc= new XWPFDocument();
XWPFParagraph paragraph = doc.createParagraph();
XWPFRun run=paragraph.createRun();
run.setText("The Body text: ");
CTGroup ctGroup = CTGroup.Factory.newInstance();
CTRect ctRect = ctGroup.addNewRect();
ctRect.addNewWrap().setType(STWrapType.SQUARE);
ctRect.setStyle("position:absolute;mso-position-horizontal:center;margin-top:40pt;width:100pt;height:24pt");
ctRect.setFillcolor("#FFFF00");
CTTxbxContent ctTxbxContent = ctRect.addNewTextbox().addNewTxbxContent();
ctTxbxContent.addNewP().addNewR().addNewT().setStringValue("The TextBox text...");
Node ctGroupNode = ctGroup.getDomNode();
CTPicture ctPicture = CTPicture.Factory.parse(ctGroupNode);
run=paragraph.createRun();
CTR cTR = run.getCTR();
cTR.addNewPict();
cTR.setPictArray(0, ctPicture);
paragraph = doc.createParagraph();
run=paragraph.createRun();
run.setText("Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... Lorem ipsum semit color ... ");
FileOutputStream out = new FileOutputStream("WordTextBox.docx");
doc.write(out);
out.close();
doc.close();
}
}
产品:
如何查找和替换这些文本字段中的文本?即我有
document.getParagraphs().getRuns().foreach(run->{
run.getPictList().foreach(pict->System.out.println(pict.getDomNode().getTextContent()));
});
但是当我浏览这些对象时,我找不到使用上面的代码创建的文本