获取较低级别 XML 对象以将图像插入 Apache POI 中的图表?

Getting the lower level XML object to insert an image into a chart in Apache POI?

在一个较旧的问题中,我问过这个:

但被告知太复杂无法回答。

我想试试,但我不知道从哪里开始。我将如何获得 XML 对象?使用 Dom 节点会有帮助吗?

感谢任何建议。

如何开始此类任务:

首先使用 Excel 的 GUI 执行您需要的操作。在这种情况下,在 Excel 中创建一个图表并将形状放入该图表的图表 space 中。另存为 *.xlsx.

现在使用 ZIP 工具解压缩 *.xlsx。您将看到包含多个 XML 个文件的内部目录结构。

现在确定实现目标需要做什么。

在这种情况下,请查看 /xl/charts/chart1.xml。尝试了解那里描述的形状。你会发现:

<c:chartSpace ... >
 ...
 <c:userShapes r:id="rId1"/>
</c:chartSpace>

所以形状是对 rId1 的引用。这是指/xl/charts/_rels/chart1.xml.rels。这包含:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
 <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartUserShapes" Target="../drawings/drawing2.xml"/>
</Relationships>

所以它指的是 ../drawings/drawing2.xml,即 *.xlsx ZIP 压缩包中的 /xl/drawings/drawing2.xml。其中包含描述形状的 XML,但类型为 application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml,而默认绘图为 application/vnd.openxmlformats-officedocument.drawing+xml.

现在您知道将形状放入图表中需要做什么了 space。

  1. 在描述形状的 *.xlsx ZIP 存档中创建 /xl/drawings/drawing2.xmlApache poi 不提供这个。它只提供XSSFDrawing。但是它提供了POIXMLDocumentPart需要扩展来描述一个XSSFChartShapesDrawing。可以查看源代码 XSSFDrawing.java 以了解那里需要什么。

  2. 创建/xl/charts/_rels/chart1.xml.relsXSSFChart (XDDFChart) 也扩展了 POIXMLDocumentPart。所以它提供了POIXMLDocumentPart.RelationPart addRelation(java.lang.String relId, POIXMLRelation relationshipType, POIXMLDocumentPart part)。但是当然没有预定义 POIXMLRelation 用于图表用户形状绘制。所以这也必须使用代码来描述。

  3. <c:userShapes r:id="rId1"/>放入图表的XML。这是最简单的任务。 XDDFChart 提供 org.openxmlformats.schemas.drawingml.x2006.chart.CTChart getCTChart()org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace getCTChartSpace() 来获取底层的低级对象。

  4. 不要忘记注意 *.xlsx ZIP 存档的 /[Content_Types].xml 中的新内容类型。必须是 <Override ContentType="application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml" PartName="/xl/drawings/drawing2.xml"/>.