This is an automated email from the ASF dual-hosted git repository.

fanningpj pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/poi.git


The following commit(s) were added to refs/heads/trunk by this push:
     new a96c0d9d78 Implement XWPFRun.getEmbeddedCharts(). (#859)
a96c0d9d78 is described below

commit a96c0d9d78215d99063145382233a4bdf098e993
Author: Jacobo Aragunde PĂ©rez <[email protected]>
AuthorDate: Thu Jul 24 21:21:37 2025 +0200

    Implement XWPFRun.getEmbeddedCharts(). (#859)
    
    Returns a list of XWPFChart objects embedded in the run.
    
    Works in a similar way to getEmbeddedPictures(), maintaining a list of
    XWPFChart objects. They are retrieved from the XWPFDocument object
    through their relation id.
---
 .../org/apache/poi/xwpf/usermodel/XWPFRun.java     | 31 ++++++++++++++++++++--
 .../org/apache/poi/xwpf/usermodel/TestXWPFRun.java | 31 ++++++++++++++++++++++
 2 files changed, 60 insertions(+), 2 deletions(-)

diff --git a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFRun.java 
b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFRun.java
index 29339e1453..77819ff37e 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFRun.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFRun.java
@@ -31,6 +31,7 @@ import java.util.List;
 import javax.xml.namespace.QName;
 
 import org.apache.poi.common.usermodel.PictureType;
+import org.apache.poi.ooxml.POIXMLDocumentPart;
 import org.apache.poi.ooxml.POIXMLException;
 import org.apache.poi.ooxml.util.DocumentHelper;
 import org.apache.poi.ooxml.util.POIXMLUnits;
@@ -41,6 +42,7 @@ import org.apache.poi.xssf.usermodel.XSSFRelation;
 import org.apache.xmlbeans.*;
 import org.apache.xmlbeans.impl.values.XmlAnyTypeImpl;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTRelId;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTBlip;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTBlipFillProperties;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTGraphicalObject;
@@ -75,6 +77,7 @@ public class XWPFRun implements ISDTContents, IRunElement, 
CharacterRun {
     private final String pictureText;
     private final IRunBody parent;
     private final List<XWPFPicture> pictures;
+    private final List<XWPFChart> charts;
 
     /**
      * @param r the CTR bean which holds the run attributes
@@ -122,14 +125,25 @@ public class XWPFRun implements ISDTContents, 
IRunElement, CharacterRun {
         }
         pictureText = text.toString();
 
-        // Do we have any embedded pictures?
-        // (They're a different CTPicture, under the drawingml namespace)
+        // Do we have any embedded pictures or charts?
+        // Pictures are a different CTPicture, under the drawingml namespace.
+        // Charts are relations and use the CTRelId type.
         pictures = new ArrayList<>();
+        charts = new ArrayList<>();
         for (XmlObject o : pictTextObjs) {
             for (CTPicture pict : getCTPictures(o)) {
                 XWPFPicture picture = new XWPFPicture(pict, this);
                 pictures.add(picture);
             }
+            XmlObject[] chartRels = o.selectPath("declare namespace c='" + 
CTChart.type.getName().getNamespaceURI() + "' .//*/c:chart");
+            for (XmlObject chartRel : chartRels) {
+                if (chartRel instanceof CTRelId) {
+                    POIXMLDocumentPart chart = 
getDocument().getRelationById(((CTRelId) chartRel).getId());
+                    if (chart instanceof XWPFChart) {
+                        charts.add((XWPFChart) chart);
+                    }
+                }
+            }
         }
     }
 
@@ -1358,6 +1372,11 @@ public class XWPFRun implements ISDTContents, 
IRunElement, CharacterRun {
     @Internal
     public CTInline addChart(String chartRelId) throws InvalidFormatException, 
IOException {
         try {
+            POIXMLDocumentPart chart = 
getDocument().getRelationById(chartRelId);
+            if (chart instanceof XWPFChart) {
+                charts.add((XWPFChart) chart);
+            }
+
             CTInline inline = run.addNewDrawing().addNewInline();
 
             //xml part of chart in document
@@ -1817,4 +1836,12 @@ public class XWPFRun implements ISDTContents, 
IRunElement, CharacterRun {
         return pr;
     }
 
+    /**
+     * Returns the charts embedded in the run.
+     * @return A list of the XWPFChart objects embedded in the run.
+     * @since POI 5.4.2
+     */
+    public List<XWPFChart> getEmbeddedCharts() {
+        return charts;
+    }
 }
diff --git 
a/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFRun.java 
b/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFRun.java
index ed79c2272d..f9d6886ec5 100644
--- a/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFRun.java
+++ b/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFRun.java
@@ -36,6 +36,7 @@ import 
org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.util.LocaleUtil;
 import org.apache.poi.util.Units;
 import org.apache.poi.wp.usermodel.HeaderFooterType;
+import org.apache.poi.xddf.usermodel.chart.XDDFChart;
 import org.apache.poi.xwpf.XWPFTestDataSamples;
 import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
 import org.junit.jupiter.api.AfterEach;
@@ -909,4 +910,34 @@ class TestXWPFRun {
         run.setText("TEST STRING");
         assertEquals(1, run.getNumberOfTexts());
     }
+
+    @Test
+    void testGetEmbeddedCharts() throws IOException {
+        try (XWPFDocument sampleDoc = 
XWPFTestDataSamples.openSampleDocument("61745.docx")) {
+            List<XWPFChart> charts = sampleDoc.getCharts();
+            assertEquals(2, charts.size());
+            List<XWPFChart> run1Charts = 
sampleDoc.getParagraphArray(0).getRuns().get(0).getEmbeddedCharts();
+            assertEquals(1, run1Charts.size());
+            assertEquals(charts.get(0), run1Charts.get(0));
+            List<XWPFChart> run2Charts = 
sampleDoc.getParagraphArray(1).getRuns().get(0).getEmbeddedCharts();
+            assertEquals(1, run2Charts.size());
+            assertEquals(charts.get(1), run2Charts.get(0));
+        }
+    }
+
+    @Test
+    void testAddChartGetEmbeddedCharts() throws InvalidFormatException, 
IOException {
+        XWPFRun run1 = p.createRun();
+        XWPFChart chart1 = doc.createChart(run1, XDDFChart.DEFAULT_WIDTH, 
XDDFChart.DEFAULT_HEIGHT);
+        assertEquals(1, run1.getEmbeddedCharts().size());
+        assertEquals(chart1, run1.getEmbeddedCharts().get(0));
+
+        XWPFRun run2 = p.createRun();
+        XWPFChart chart2 = doc.createChart(run2, XDDFChart.DEFAULT_WIDTH, 
XDDFChart.DEFAULT_HEIGHT);
+        assertEquals(1, run2.getEmbeddedCharts().size());
+        assertEquals(chart2, run2.getEmbeddedCharts().get(0));
+
+        XWPFRun run3 = p.createRun();
+        assertEquals(0, run3.getEmbeddedCharts().size());
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to