使用Apache POI文件的.docx创建文本框 [英] create text box in document .docx using apache poi
问题描述
我想创建一个文档的.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.wordprocessingml.x2006.main.CTPicture;
进口org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;
进口org.openxmlformats.schemas.wordprocessingml.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.wordprocessingml.x2006.main.CTSdtContentBlock;
进口org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
进口org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr;
进口org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPBdr;
进口org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBorder;
进口org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFramePr;
进口org.openxmlformats.schemas.wordprocessingml.x2006.main.STHAnchor;
进口org.openxmlformats.schemas.wordprocessingml.x2006.main.STVAnchor;
进口org.openxmlformats.schemas.wordprocessingml.x2006.main.STXAlign;
进口org.openxmlformats.schemas.wordprocessingml.x2006.main.STWrap;
进口org.openxmlformats.schemas.wordprocessingml.x2006.main.STBorder;
/ *
至
进口org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFramePr;
进口org.openxmlformats.schemas.wordprocessingml.x2006.main.STHAnchor;
进口org.openxmlformats.schemas.wordprocessingml.x2006.main.STVAnchor;
进口org.openxmlformats.schemas.wordprocessingml.x2006.main.STXAlign;
进口org.openxmlformats.schemas.wordprocessingml.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.wordprocessingml.x2006.main.CTPicture;
进口org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;
进口org.openxmlformats.schemas.wordprocessingml.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 withapache-poi
until now. A realWord
Text-box is contained in aCTShape
fromschemasMicrosoftComVml
orcom.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
andv: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 aCTWrap
for this is currently not possible, as far as I know, because theCTWrap
from theschemasMicrosoftComOfficeWord
is not shipped within the poi-ooxml-schemas-3.13-*.jar and thecom.microsoft.schemas.vml
andcom.microsoft.schemas.office
classes from ooxml-schemas-1.3.jar need aorg.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屋!