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

Show a text in a box in Word by POI

提问人:Hervé Girod 提问时间:10/31/2023 最后编辑:Hervé Girod 更新时间:11/1/2023 访问量:46

问:

我想使用 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();
   }

我有一个 Shape,但文本不在 Shape 内,并且 Shape 未填充。

我使用了这个例子:使用apache poi在文档.docx中创建文本框

java ms-word apache-poi docx xwpf

评论


答:

2赞 Axel Richter 11/1/2023 #1

我在使用 Apache poi 在文档.docx中创建文本框中的示例使用 Microsoft 的 VML 对象模型

最后一个示例也适用于当前的 Apache POI 5.2.4。

文本框中的文本必须位于文本框内容内。此代码行设置它:

...
ctTxbxContent.addNewP().addNewR().addNewT().setStringValue("The TextBox text...");
...

但是,如果使用填充颜色,则周围的形状必须有一条闭合线。任何一个都可以设置一个路径来描述形状轮廓。或者 - 更容易 - 人们会使用矩形形状而不是简单的形状。Apache POI for Word 中的矩形形状是 .com.microsoft.schemas.vml.CTRectcom.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赞 Hervé Girod 11/1/2023
非常感谢,这正是我需要的答案!