里面没有关于形状的内容apache poi
's XWPF
除了到目前为止的图表。但是还有com.microsoft.schemas.vml
它能够为 Microsoft Office 文件创建 VML 图形。 Microsoft Word 也支持这些图形。
创建图形本身并不像从 VML 路径绘制那样复杂。所以只有关于VML https://en.wikipedia.org/wiki/Vector_Markup_Language是需要的。但是在Word文档中插入图形需要用到低级的org.openxmlformats.schemas.wordprocessingml.x2006.main.*
and com.microsoft.schemas.vml.*
类并需要有关内部 XML 结构的知识*.docx
file.
希望您能从下面这个完整的例子中得到原理:
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 com.microsoft.schemas.vml.CTGroup;
import com.microsoft.schemas.vml.CTShape;
import org.w3c.dom.Node;
public class CreateWordPathShape {
public static void main(String[] args) throws Exception {
String boxWidth = "100pt";
String boxHeight = "100pt";
String posLeft = "150pt";
String posTop = "0pt";
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.setCoordsize("21600,21600");
ctShape.setPath2("m21600,0 l0,0 l0,21600 l21600,21600 e");
//path: from 0,0 (top left) move to 21600,0 (top right), line to 0,0 (top left), line to 0,21600 (bottom left), line to 21600,21600 (bottom right), end
ctShape.setStyle("position:absolute"
+";top:" + posTop
+";left:" + posLeft
+";width:" + boxWidth
+";height:" + boxHeight
);
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();
FileOutputStream out = new FileOutputStream("CreateWordPathShape.docx");
doc.write(out);
out.close();
}
}
此代码需要所有模式的完整 jar,如中提到的Apache POI 常见问题解答 https://poi.apache.org/help/faq.html#faq-N10025.
下面是一个将 VML 线形状放入XWPFDocument
:
private static void createLineShape(XWPFParagraph paragraph, String coordsize, String vmlPath, String strokecolor, String style) throws Exception {
XWPFRun run = paragraph.createRun();
com.microsoft.schemas.vml.CTGroup ctGroup = com.microsoft.schemas.vml.CTGroup.Factory.newInstance();
com.microsoft.schemas.vml.CTShape ctShape = ctGroup.addNewShape();
ctShape.setCoordsize(coordsize);
ctShape.setPath2(vmlPath);
ctShape.setStrokecolor(strokecolor);
ctShape.setStyle(style);
org.w3c.dom.Node ctGroupNode = ctGroup.getDomNode();
CTPicture ctPicture = CTPicture.Factory.parse(ctGroupNode);
CTR cTR = run.getCTR();
cTR.addNewPict();
cTR.setPictArray(0, ctPicture);
}
它可以这样调用:
...
XWPFParagraph paragraph = ...
...
createLineShape(paragraph, "21600,21600", "m21600,0 l0,0 l0,21600 l21600,21600 e", "#FF0000", "position:absolute;left:0;width:100pt;height:100pt");
...