Как всегда, если текущие классы высокого уровня apache poi
не предоставляют некоторые Office Open XML
функции, выполните следующие действия:
Сначала выполните то, что предусмотрено, и посмотрите на базовые XML
, которые вы создали,В этом случае выполните:
// table is a XWPFTable object instantiated earlier in the code
XWPFParagraph paragraph = table.getRow(0).getCell(0).addParagraph();
XWPFRun run = paragraph.createRun();
FileInputStream fis = new FileInputStream("C:\\ [filepath for the image]");
XWPFPicture picture = run.addPicture(fis, XWPFDocument.PICTURE_TYPE_PNG, "Name", Units.pixelToEMU(300), Units.pixelToEMU(150));
System.out.println(picture.getCTPicture());
Вы получите что-то вроде:
<xml-fragment xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:rel="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
<pic:nvPicPr>
<pic:cNvPr id="0" name="Picture 0" descr="Name"/>
<pic:cNvPicPr>
<a:picLocks noChangeAspect="true"/>
</pic:cNvPicPr>
</pic:nvPicPr>
<pic:blipFill>
<a:blip rel:embed="rId2"/>
<a:stretch>
<a:fillRect/>
</a:stretch>
</pic:blipFill>
<pic:spPr>
<a:xfrm>
<a:off x="0" y="0"/>
<a:ext cx="2857500" cy="1428750"/>
</a:xfrm>
<a:prstGeom prst="rect">
<a:avLst/>
</a:prstGeom>
</pic:spPr>
</xml-fragment>
Теперь откройте результат в Word
и добавьте, что вы хотите. В этом случае добавьте рамку вокруг картинки. Затем сохраните результат, распакуйте архив *.docx
Zip
и посмотрите на /word/document.xml
, чтобы узнать, что изменилось.
Вы найдете что-то вроде:
<a:ln w="28575">
<a:solidFill>
<a:srgbClr val="000000"/>
</a:solidFill>
</a:ln>
добавленона <pic:spPr>
.
Теперь попробуйте создать это, используя ooxml-schema
классы низкого уровня apache poi
:
...
XWPFPicture picture = run.addPicture(fis, XWPFDocument.PICTURE_TYPE_PNG, "Name", Units.pixelToEMU(300), Units.pixelToEMU(150));
System.out.println(picture.getCTPicture());
picture.getCTPicture().getSpPr().addNewLn().setW(Units.toEMU(2.25));
picture.getCTPicture().getSpPr().getLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[]{0,0,0});
System.out.println(picture.getCTPicture());
...