我想在文档.docx中创建一个文本框,但我找不到方法 这有助于我做到这一点和任何一个例子。有人知道我该怎么做?
答案 0 :(得分:5)
到目前为止,使用Word
无法完全插入真实的apache-poi
文字框。真实的Word
文字框包含在CTShape
或schemasMicrosoftComVml
的{{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中的CTWrap
和schemasMicrosoftComOfficeWord
类需要一个版本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之间找到一个易于使用的链接。