使用apache poi在文档.docx中创建文本框

时间:2016-02-02 21:25:28

标签: apache-poi

  

我想在文档.docx中创建一个文本框,但我找不到方法   这有助于我做到这一点和任何一个例子。有人知道我该怎么做?

2 个答案:

答案 0 :(得分:5)

到目前为止,使用Word无法完全插入真实的apache-poi文字框。真实的Word文字框包含在CTShapeschemasMicrosoftComVml的{​​{1}}中。 XML看起来像:

com.microsoft.schemas.vml

如您所见,<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> v:shape中的名称空间与其他名称空间不同。

因此,如果我们知道并尊重这一点,我们现在可以插入这样的v:textbox。但只与文本内联。据我所知,目前无法为此创建CTShape,因为来自CTWrap的{​​{1}}未在poi-ooxml-schemas-3.13 - * .jar中提供ooxml-schemas-1.3.jar中的CTWrapschemasMicrosoftComOfficeWord类需要一个版本3.13不附带的com.microsoft.schemas.vml

内联文本框的示例:

com.microsoft.schemas.office

但是可以使用定位的文本框架:

org.apache.poi.POIXMLTypeLoader

这需要https://poi.apache.org/faq.html#faq-N10025中提到的完全ooxml-schemas-1.3.jar。

修改

如果我们降级到ooxml-schemas-1.1.jar - 可从http://search.maven.org/#artifactdetails|org.apache.poi|ooxml-schemas|1.1|jar获得 - 那么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")); } } 版本3.13也可以使用免费的可定位文本框。

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

 }
}

答案 1 :(得分:0)

对于 HWPF (即旧的二进制文档格式),通过HWPFDocument.getMainTextBoxRange()有一个非常基本的界面。不过,我相信它只适合阅读。

对于 XWPF (您要求的较新的docx格式),似乎文本框始终嵌入到绘图中(使用 DrawingML ;如果我是,请更正我错误)。至少这是我解释ECMA-376, Part 1的第17.3.1.40,20.4.2.37和20.4.2.38条的方式。因此,您选择的方法应该是XSSFDrawing.createTextbox()。但是,我还没有在这个绘图类(源自POI的Excel组件)和XWPF之间找到一个易于使用的链接。