使用Apache POI文件的.docx创建文本框 [英] create text box in document .docx using apache poi

查看:1971
本文介绍了使用Apache POI文件的.docx创建文本框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


  

我想创建一个文档的.docx的文本框,但我didn't找到一个方法
  那个帮我做任何的例子。有人知道我该怎么做呢?



解决方案

插入一个真正的文本框不是完全可能的 apache- POI 到现在。一个真正的文本框包含在 CTShape schemasMicrosoftComVml com.microsoft.schemas.vml 。该XML如下:

 < W:R>
 < W:PICT>
  <五:外形风格=WIDTH:100pt;高度:24PT>
   <五:文本>
    < W:txbxContent>
     < W:P>
      < W:R>
       < W:T>将文本框的文本...< / W:T>
      < / W:R>
     < / W:P>
    < / W:txbxContent>
   < / V:文本>
  < / V:形状>
 < / W:PICT>
< / W:R>

正如你所看到的的命名空间五:形状ν:文本的与众不同

因此​​,如果我们知道并尊重这一点,我们目前可以插入这样 CTShape 。但只有内嵌的文本。创建一个 CTWrap 因为这是目前不可能的,因为据我所知,因为 CTWrap 从<$ C *罐子和 com.microsoft.schemas.vml 和 - $ C> schemasMicrosoftComOfficeWord 未在POI-OOXML-架构 - 3.13内发货 com.microsoft.schemas.office 从类OOXML-架构 - 1.3.jar需要一个 org.apache.poi.POIXMLTypeLoader 这是不附带3.13版本。

示例内联文本框:

 进口java.io.FileOutputStream中;导入org.apache.poi.xwpf.usermodel *。进口org.openxmlformats.schemas.wordpro​​cessingml.x2006.main.CTPicture;
进口org.openxmlformats.schemas.wordpro​​cessingml.x2006.main.CTR;
进口org.openxmlformats.schemas.wordpro​​cessingml.x2006.main.CTTxbxContent;进口schemasMicrosoftComVml.CTGroup;
进口schemasMicrosoftComVml.CTShape;进口org.w3c.dom.Node中;公共类CreateWordTextBox { 公共静态无效的主要(字串[] args)抛出异常{  XWPFDocument DOC =新XWPFDocument();  XWPFParagraph段= doc.createParagraph();
  XWPFRun运行= paragraph.createRun();
  run.setText(正文:);  CTGroup ctGroup = CTGroup.Factory.newInstance();  CTShape ctShape = ctGroup.addNewShape();
  ctShape.setStyle(宽:100pt;高度:24PT);
  CTTxbxContent ctTxbxContent = ctShape.addNewTextbox()addNewTxbxContent()。
  。ctTxbxContent.addNewP()addNewR()addNewT()setStringValue(文本框的文字...)。;  节点ctGroupNode = ctGroup.getDomNode();
  CTPicture ctPicture = CTPicture.Factory.parse(ctGroupNode);
  运行= paragraph.createRun();
  CTR CTR = run.getCTR();
  cTR.addNewPict();
  cTR.setPictArray(0,ctPicture);  doc.write(新的FileOutputStream(WordTextBox.docx)); }
}

但定位的文本框是可能的:

 进口java.io.FileOutputStream中;导入org.apache.poi.xwpf.usermodel *。进口org.openxmlformats.schemas.wordpro​​cessingml.x2006.main.CTSdtContentBlock;
进口org.openxmlformats.schemas.wordpro​​cessingml.x2006.main.CTP;
进口org.openxmlformats.schemas.wordpro​​cessingml.x2006.main.CTPPr;
进口org.openxmlformats.schemas.wordpro​​cessingml.x2006.main.CTPBdr;
进口org.openxmlformats.schemas.wordpro​​cessingml.x2006.main.CTBorder;
进口org.openxmlformats.schemas.wordpro​​cessingml.x2006.main.CTFramePr;
进口org.openxmlformats.schemas.wordpro​​cessingml.x2006.main.STHAnchor;
进口org.openxmlformats.schemas.wordpro​​cessingml.x2006.main.STVAnchor;
进口org.openxmlformats.schemas.wordpro​​cessingml.x2006.main.STXAlign;
进口org.openxmlformats.schemas.wordpro​​cessingml.x2006.main.STWrap;
进口org.openxmlformats.schemas.wordpro​​cessingml.x2006.main.STBorder;
/ *

进口org.openxmlformats.schemas.wordpro​​cessingml.x2006.main.CTFramePr;
进口org.openxmlformats.schemas.wordpro​​cessingml.x2006.main.STHAnchor;
进口org.openxmlformats.schemas.wordpro​​cessingml.x2006.main.STVAnchor;
进口org.openxmlformats.schemas.wordpro​​cessingml.x2006.main.STXAlign;
进口org.openxmlformats.schemas.wordpro​​cessingml.x2006.main.STWrap;
需要完全OOXML-模式-1.3.jar在https://poi.apache.org/faq.html#faq-N10025提到
* /进口java.math.BigInteger的;公共类CreateWordTextFrame { 公共静态无效的主要(字串[] args)抛出异常{  XWPFDocument DOC =新XWPFDocument();  XWPFParagraph段= doc.createParagraph();
  XWPFRun运行= paragraph.createRun();
  run.setText(以下简称正文:);  CTSdtContentBlock ctSdtContentBlock = doc.getDocument()getBody()addNewSdt()addNewSdtContent()。;  CTP CTP = ctSdtContentBlock.addNewP();
  。ctP.addNewR()addNewT()setStringValue(以下简称TextFrame文本...)。  CTPPr ctPPr = ctP.addNewPPr();
  CTFramePr ctFramePr = ctPPr.addNewFramePr();
  ctFramePr.setHAnchor(STHAnchor.TEXT);
  ctFramePr.setVAnchor(STVAnchor.TEXT);
  ctFramePr.setXAlign(STXAlign.CENTER);
  ctFramePr.setWrap(STWrap.AROUND);
  ctFramePr.setW(BigInteger.valueOf(4000));
  ctFramePr.setHSpace(BigInteger.valueOf(400));  CTPBdr ctPBdr = ctPPr.addNewPBdr();
  CTBorder ctBorder = ctPBdr.addNewLeft(); ctBorder.setColor(000000); ctBorder.setVal(STBorder.SINGLE); ctBorder.setSz(BigInteger.valueOf(4)); ctBorder.setSpace(BigInteger.valueOf(7));
  ctBorder = ctPBdr.addNewRight(); ctBorder.setColor(000000); ctBorder.setVal(STBorder.SINGLE); ctBorder.setSz(BigInteger.valueOf(4)); ctBorder.setSpace(BigInteger.valueOf(7));
  ctBorder = ctPBdr.addNewTop(); ctBorder.setColor(000000); ctBorder.setVal(STBorder.SINGLE); ctBorder.setSz(BigInteger.valueOf(4)); ctBorder.setSpace(BigInteger.valueOf(7));
  ctBorder = ctPBdr.addNewBottom(); ctBorder.setColor(000000); ctBorder.setVal(STBorder.SINGLE); ctBorder.setSz(BigInteger.valueOf(4)); ctBorder.setSpace(BigInteger.valueOf(7));  段= doc.createParagraph();
  运行= paragraph.createRun();
  run.setText(Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit色......);  doc.write(新的FileOutputStream(WordTextFrame.docx)); }
}

这需要在 HTTPS提到的完全OOXML-模式-1.3.jar:// poi.apache.org/faq.html#faq-N10025

修改

如果我们降级到OOXML-架构 - 1.1.jar - 从提供的 http://search.maven.org/#artifactdetails|org.apache.poi|ooxml-schemas|1.1|jar - 那么自由定位的文本框也可以用 Apache的POI 版本3.13。

 进口java.io.FileOutputStream中;导入org.apache.poi.xwpf.usermodel *。进口org.openxmlformats.schemas.wordpro​​cessingml.x2006.main.CTPicture;
进口org.openxmlformats.schemas.wordpro​​cessingml.x2006.main.CTR;
进口org.openxmlformats.schemas.wordpro​​cessingml.x2006.main.CTTxbxContent;进口schemasMicrosoftComVml.CTGroup;
进口schemasMicrosoftComVml.CTShape;
进口schemasMicrosoftComOfficeWord.CTWrap;
进口schemasMicrosoftComOfficeWord.STWrapType;
/ *

进口schemasMicrosoftComOfficeWord.CTWrap;
进口schemasMicrosoftComOfficeWord.STWrapType;
需要OOXML-架构 - 1.1.jar - 可从http://search.maven.org/#artifactdetails|org.apache.poi|ooxml-schemas|1.1|jar
* /进口org.w3c.dom.Node中;公共类CreateWordTextBox { 公共静态无效的主要(字串[] args)抛出异常{  XWPFDocument DOC =新XWPFDocument();  XWPFParagraph段= doc.createParagraph();
  XWPFRun运行= paragraph.createRun();
  run.setText(正文:);  CTGroup ctGroup = CTGroup.Factory.newInstance();  CTShape ctShape = ctGroup.addNewShape();
  。ctShape.addNewWrap()的setType(STWrapType.SQUARE);
  ctShape.setStyle(\"position:absolute;mso-position-horizontal:center;margin-top:40pt;width:100pt;height:24pt\");
  CTTxbxContent ctTxbxContent = ctShape.addNewTextbox()addNewTxbxContent()。
  。ctTxbxContent.addNewP()addNewR()addNewT()setStringValue(文本框的文字...)。;  节点ctGroupNode = ctGroup.getDomNode();
  CTPicture ctPicture = CTPicture.Factory.parse(ctGroupNode);
  运行= paragraph.createRun();
  CTR CTR = run.getCTR();
  cTR.addNewPict();
  cTR.setPictArray(0,ctPicture);  段= doc.createParagraph();
  运行= paragraph.createRun();
  run.setText(Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit颜色... Lorem存有semit色......);
  doc.write(新的FileOutputStream(WordTextBox.docx)); }
}

I want create a text box in a document .docx but I didn´t find a method that help me do it and any example. Someone know how can i do it?

解决方案

Inserting a real Word Text-box is not fully possible with apache-poi until now. A real Word Text-box is contained in a CTShape from schemasMicrosoftComVml or com.microsoft.schemas.vml. The XML looks like:

<w:r>
 <w:pict>
  <v:shape style="width:100pt;height:24pt">
   <v:textbox>
    <w:txbxContent>
     <w:p>
      <w:r>
       <w:t>The TextBox text...</w:t>
      </w:r>
     </w:p>
    </w:txbxContent>
   </v:textbox>
  </v:shape>
 </w:pict>
</w:r>

As you see the namespaces in v:shape and v:textbox are different from the rest.

So if we know and respect this, we can currently insert such CTShape. But only inline with the text. Creating a CTWrap for this is currently not possible, as far as I know, because the CTWrap from the schemasMicrosoftComOfficeWord is not shipped within the poi-ooxml-schemas-3.13-*.jar and the com.microsoft.schemas.vml and com.microsoft.schemas.office classes from ooxml-schemas-1.3.jar need a org.apache.poi.POIXMLTypeLoader which is not shipped with version 3.13.

Example for an inline Textbox:

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 schemasMicrosoftComVml.CTGroup;
import schemasMicrosoftComVml.CTShape;

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();

  CTShape ctShape = ctGroup.addNewShape();
  ctShape.setStyle("width:100pt;height:24pt");
  CTTxbxContent ctTxbxContent = ctShape.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);

  doc.write(new FileOutputStream("WordTextBox.docx"));

 }
}

But a positioned text-frame is possible:

import java.io.FileOutputStream;

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

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSdtContentBlock;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPBdr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBorder;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFramePr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STHAnchor;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVAnchor;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STXAlign;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STWrap;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STBorder;
/*
To
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFramePr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STHAnchor;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVAnchor;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STXAlign;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STWrap;
the fully ooxml-schemas-1.3.jar is needed as mentioned in https://poi.apache.org/faq.html#faq-N10025
*/

import java.math.BigInteger;

public class CreateWordTextFrame {

 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:");

  CTSdtContentBlock ctSdtContentBlock = doc.getDocument().getBody().addNewSdt().addNewSdtContent();

  CTP ctP = ctSdtContentBlock.addNewP();
  ctP.addNewR().addNewT().setStringValue("The TextFrame text...");

  CTPPr ctPPr = ctP.addNewPPr();
  CTFramePr ctFramePr = ctPPr.addNewFramePr();
  ctFramePr.setHAnchor(STHAnchor.TEXT);
  ctFramePr.setVAnchor(STVAnchor.TEXT);
  ctFramePr.setXAlign(STXAlign.CENTER);
  ctFramePr.setWrap(STWrap.AROUND);
  ctFramePr.setW(BigInteger.valueOf(4000));
  ctFramePr.setHSpace(BigInteger.valueOf(400));

  CTPBdr ctPBdr = ctPPr.addNewPBdr();
  CTBorder ctBorder = ctPBdr.addNewLeft(); ctBorder.setColor("000000"); ctBorder.setVal(STBorder.SINGLE); ctBorder.setSz(BigInteger.valueOf(4)); ctBorder.setSpace(BigInteger.valueOf(7));
  ctBorder = ctPBdr.addNewRight(); ctBorder.setColor("000000"); ctBorder.setVal(STBorder.SINGLE); ctBorder.setSz(BigInteger.valueOf(4)); ctBorder.setSpace(BigInteger.valueOf(7));
  ctBorder = ctPBdr.addNewTop(); ctBorder.setColor("000000"); ctBorder.setVal(STBorder.SINGLE); ctBorder.setSz(BigInteger.valueOf(4)); ctBorder.setSpace(BigInteger.valueOf(7));
  ctBorder = ctPBdr.addNewBottom(); ctBorder.setColor("000000"); ctBorder.setVal(STBorder.SINGLE); ctBorder.setSz(BigInteger.valueOf(4)); ctBorder.setSpace(BigInteger.valueOf(7));

  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 ... ");

  doc.write(new FileOutputStream("WordTextFrame.docx"));

 }
}

This needs the fully ooxml-schemas-1.3.jar as mentioned in https://poi.apache.org/faq.html#faq-N10025.

Edit

If we downgrade to ooxml-schemas-1.1.jar - available from http://search.maven.org/#artifactdetails|org.apache.poi|ooxml-schemas|1.1|jar - then a free positionable Text-box is also possible with apache-poi version 3.13.

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 schemasMicrosoftComVml.CTGroup;
import schemasMicrosoftComVml.CTShape;
import schemasMicrosoftComOfficeWord.CTWrap;
import schemasMicrosoftComOfficeWord.STWrapType;
/*
To 
import schemasMicrosoftComOfficeWord.CTWrap;
import schemasMicrosoftComOfficeWord.STWrapType;
ooxml-schemas-1.1.jar is needed - available from http://search.maven.org/#artifactdetails|org.apache.poi|ooxml-schemas|1.1|jar
*/

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();

  CTShape ctShape = ctGroup.addNewShape();
  ctShape.addNewWrap().setType(STWrapType.SQUARE);
  ctShape.setStyle("position:absolute;mso-position-horizontal:center;margin-top:40pt;width:100pt;height:24pt");
  CTTxbxContent ctTxbxContent = ctShape.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 ... ");


  doc.write(new FileOutputStream("WordTextBox.docx"));

 }
}

这篇关于使用Apache POI文件的.docx创建文本框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆