获取较低级别 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。
在描述形状的 *.xlsx
ZIP 存档中创建 /xl/drawings/drawing2.xml
。 Apache poi
不提供这个。它只提供XSSFDrawing
。但是它提供了POIXMLDocumentPart
需要扩展来描述一个XSSFChartShapesDrawing
。可以查看源代码 XSSFDrawing.java
以了解那里需要什么。
创建/xl/charts/_rels/chart1.xml.rels
。 XSSFChart
(XDDFChart
) 也扩展了 POIXMLDocumentPart
。所以它提供了POIXMLDocumentPart.RelationPart addRelation(java.lang.String relId, POIXMLRelation relationshipType, POIXMLDocumentPart part)
。但是当然没有预定义 POIXMLRelation
用于图表用户形状绘制。所以这也必须使用代码来描述。
将<c:userShapes r:id="rId1"/>
放入图表的XML。这是最简单的任务。 XDDFChart
提供 org.openxmlformats.schemas.drawingml.x2006.chart.CTChart getCTChart()
和 org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace getCTChartSpace()
来获取底层的低级对象。
不要忘记注意 *.xlsx
ZIP 存档的 /[Content_Types].xml
中的新内容类型。必须是 <Override ContentType="application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml" PartName="/xl/drawings/drawing2.xml"/>
.
在一个较旧的问题中,我问过这个:
但被告知太复杂无法回答。
我想试试,但我不知道从哪里开始。我将如何获得 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。
在描述形状的
*.xlsx
ZIP 存档中创建/xl/drawings/drawing2.xml
。Apache poi
不提供这个。它只提供XSSFDrawing
。但是它提供了POIXMLDocumentPart
需要扩展来描述一个XSSFChartShapesDrawing
。可以查看源代码XSSFDrawing.java
以了解那里需要什么。创建
/xl/charts/_rels/chart1.xml.rels
。XSSFChart
(XDDFChart
) 也扩展了POIXMLDocumentPart
。所以它提供了POIXMLDocumentPart.RelationPart addRelation(java.lang.String relId, POIXMLRelation relationshipType, POIXMLDocumentPart part)
。但是当然没有预定义POIXMLRelation
用于图表用户形状绘制。所以这也必须使用代码来描述。将
<c:userShapes r:id="rId1"/>
放入图表的XML。这是最简单的任务。XDDFChart
提供org.openxmlformats.schemas.drawingml.x2006.chart.CTChart getCTChart()
和org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace getCTChartSpace()
来获取底层的低级对象。不要忘记注意
*.xlsx
ZIP 存档的/[Content_Types].xml
中的新内容类型。必须是<Override ContentType="application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml" PartName="/xl/drawings/drawing2.xml"/>
.