通过 POI 在 Word 中的框中显示文本

问题描述 投票:0回答:2

我想使用 Apache POI XWPF 在一个框中显示 Word 中的文本,如下所示: text in a box

此示例是在 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中创建文本框

java ms-word apache-poi docx xwpf
2个回答
3
投票

我的示例使用 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();

 }
}

产品:

enter image description here


0
投票

如何查找和替换这些文本字段中的文本?即我有

document.getParagraphs().getRuns().foreach(run->{
 run.getPictList().foreach(pict->System.out.println(pict.getDomNode().getTextContent()));
});

但是当我浏览这些对象时,我找不到使用上面的代码创建的文本

© www.soinside.com 2019 - 2024. All rights reserved.