Author: onealj Date: Sun Nov 12 21:48:41 2017 New Revision: 1815047 URL: http://svn.apache.org/viewvc?rev=1815047&view=rev Log: bug 61745: add support for charts in XWPF/docx. Thanks to Sandeep Tiwari for the patch
Added: poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFChart.java - copied, changed from r1815042, poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFPictureData.java poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFChart.java - copied, changed from r1815042, poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFPictureData.java poi/trunk/test-data/document/61745.docx (with props) Modified: poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRelation.java poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/AllXWPFTests.java Copied: poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFChart.java (from r1815042, poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFPictureData.java) URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFChart.java?p2=poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFChart.java&p1=poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFPictureData.java&r1=1815042&r2=1815047&rev=1815047&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFPictureData.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFChart.java Sun Nov 12 21:48:41 2017 @@ -17,135 +17,98 @@ package org.apache.poi.xwpf.usermodel; +import static org.apache.poi.POIXMLTypeLoader.DEFAULT_XML_OPTIONS; + import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.util.Arrays; +import javax.xml.namespace.QName; + import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.POIXMLException; -import org.apache.poi.POIXMLRelation; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.PackagePart; +import org.apache.poi.openxml4j.opc.PackageRelationship; +import org.apache.poi.util.Beta; import org.apache.poi.util.IOUtils; +import org.apache.poi.util.Internal; +import org.apache.xmlbeans.XmlException; +import org.apache.xmlbeans.XmlOptions; +import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart; +import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace; +import org.openxmlformats.schemas.drawingml.x2006.chart.ChartSpaceDocument; /** - * Raw picture data, normally attached to a WordprocessingML Drawing. - * As a rule, pictures are stored in the /word/media/ part of a WordprocessingML package. - * - * @author Philipp Epp + * Represents a Chart in a .docx file */ -public class XWPFPictureData extends POIXMLDocumentPart { +@Beta +public class XWPFChart extends POIXMLDocumentPart { /** - * Relationships for each known picture type + * Root element of the Chart part */ - protected static final POIXMLRelation[] RELATIONS; - - static { - RELATIONS = new POIXMLRelation[13]; - RELATIONS[Document.PICTURE_TYPE_EMF] = XWPFRelation.IMAGE_EMF; - RELATIONS[Document.PICTURE_TYPE_WMF] = XWPFRelation.IMAGE_WMF; - RELATIONS[Document.PICTURE_TYPE_PICT] = XWPFRelation.IMAGE_PICT; - RELATIONS[Document.PICTURE_TYPE_JPEG] = XWPFRelation.IMAGE_JPEG; - RELATIONS[Document.PICTURE_TYPE_PNG] = XWPFRelation.IMAGE_PNG; - RELATIONS[Document.PICTURE_TYPE_DIB] = XWPFRelation.IMAGE_DIB; - RELATIONS[Document.PICTURE_TYPE_GIF] = XWPFRelation.IMAGE_GIF; - RELATIONS[Document.PICTURE_TYPE_TIFF] = XWPFRelation.IMAGE_TIFF; - RELATIONS[Document.PICTURE_TYPE_EPS] = XWPFRelation.IMAGE_EPS; - RELATIONS[Document.PICTURE_TYPE_BMP] = XWPFRelation.IMAGE_BMP; - RELATIONS[Document.PICTURE_TYPE_WPG] = XWPFRelation.IMAGE_WPG; - } - - private Long checksum; + private final CTChartSpace chartSpace; /** - * Create a new XWPFGraphicData node + * The Chart within that */ - protected XWPFPictureData() { - super(); - } + private final CTChart chart; + + // lazy initialization + private Long checksum; /** - * Construct XWPFPictureData from a package part + * Construct a chart from a package part. * - * @param part the package part holding the drawing data, + * @param part the package part holding the chart data, + * the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code> * - * @since POI 3.14-Beta1 + * @since POI 4.0.0 */ - public XWPFPictureData(PackagePart part) { + protected XWPFChart(PackagePart part) throws IOException, XmlException { super(part); + + chartSpace = ChartSpaceDocument.Factory.parse(part.getInputStream(), DEFAULT_XML_OPTIONS).getChartSpace(); + chart = chartSpace.getChart(); } - + @Override protected void onDocumentRead() throws IOException { super.onDocumentRead(); } /** - * Gets the picture data as a byte array. - * <p> - * Note, that this call might be expensive since all the picture data is copied into a temporary byte array. - * You can grab the picture data directly from the underlying package part as follows: - * <br> - * <code> - * InputStream is = getPackagePart().getInputStream(); - * </code> - * </p> + * Return the underlying CTChartSpace bean, the root element of the Chart part. * - * @return the Picture data. + * @return the underlying CTChartSpace bean */ - public byte[] getData() { - try { - return IOUtils.toByteArray(getPackagePart().getInputStream()); - } catch (IOException e) { - throw new POIXMLException(e); - } + @Internal + public CTChartSpace getCTChartSpace() { + return chartSpace; } /** - * Returns the file name of the image, eg image7.jpg . The original filename - * isn't always available, but if it can be found it's likely to be in the - * CTDrawing - */ - public String getFileName() { - String name = getPackagePart().getPartName().getName(); - return name.substring(name.lastIndexOf('/') + 1); - } - - /** - * Suggests a file extension for this image. + * Return the underlying CTChart bean, within the Chart Space * - * @return the file extension. + * @return the underlying CTChart bean */ - public String suggestFileExtension() { - return getPackagePart().getPartName().getExtension(); + @Internal + public CTChart getCTChart() { + return chart; } - /** - * Return an integer constant that specifies type of this picture - * - * @return an integer constant that specifies type of this picture - * @see org.apache.poi.xwpf.usermodel.Document#PICTURE_TYPE_EMF - * @see org.apache.poi.xwpf.usermodel.Document#PICTURE_TYPE_WMF - * @see org.apache.poi.xwpf.usermodel.Document#PICTURE_TYPE_PICT - * @see org.apache.poi.xwpf.usermodel.Document#PICTURE_TYPE_JPEG - * @see org.apache.poi.xwpf.usermodel.Document#PICTURE_TYPE_PNG - * @see org.apache.poi.xwpf.usermodel.Document#PICTURE_TYPE_DIB - */ - public int getPictureType() { - String contentType = getPackagePart().getContentType(); - for (int i = 0; i < RELATIONS.length; i++) { - if (RELATIONS[i] == null) { - continue; - } + @Override + protected void commit() throws IOException { + XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS); + xmlOptions.setSaveSyntheticDocumentElement(new QName(CTChartSpace.type.getName().getNamespaceURI(), "chartSpace", "c")); - if (RELATIONS[i].getContentType().equals(contentType)) { - return i; - } + try (OutputStream out = getPackagePart().getOutputStream()) { + chartSpace.save(out, xmlOptions); } - return 0; } - + public Long getChecksum() { if (this.checksum == null) { InputStream is = null; @@ -156,7 +119,11 @@ public class XWPFPictureData extends POI } catch (IOException e) { throw new POIXMLException(e); } finally { - IOUtils.closeQuietly(is); + try { + if (is != null) is.close(); + } catch (IOException e) { + throw new POIXMLException(e); + } } this.checksum = IOUtils.calculateChecksum(data); } @@ -165,7 +132,7 @@ public class XWPFPictureData extends POI @Override public boolean equals(Object obj) { - /* + /** * In case two objects ARE equal, but its not the same instance, this * implementation will always run through the whole * byte-array-comparison before returning true. If this will turn into a @@ -185,55 +152,14 @@ public class XWPFPictureData extends POI return false; } - if (!(obj instanceof XWPFPictureData)) { - return false; - } - - XWPFPictureData picData = (XWPFPictureData) obj; - PackagePart foreignPackagePart = picData.getPackagePart(); - PackagePart ownPackagePart = this.getPackagePart(); - - if ((foreignPackagePart != null && ownPackagePart == null) - || (foreignPackagePart == null && ownPackagePart != null)) { - return false; - } - - if (ownPackagePart != null) { - OPCPackage foreignPackage = foreignPackagePart.getPackage(); - OPCPackage ownPackage = ownPackagePart.getPackage(); - - if ((foreignPackage != null && ownPackage == null) - || (foreignPackage == null && ownPackage != null)) { - return false; - } - if (ownPackage != null) { - - if (!ownPackage.equals(foreignPackage)) { - return false; - } - } - } - - Long foreignChecksum = picData.getChecksum(); - Long localChecksum = getChecksum(); - - if (!(localChecksum.equals(foreignChecksum))) { + if (!(obj instanceof XWPFChart)) { return false; } - return Arrays.equals(this.getData(), picData.getData()); + return false; } - + @Override public int hashCode() { return getChecksum().hashCode(); } - - /** - * *PictureData objects store the actual content in the part directly without keeping a - * copy like all others therefore we need to handle them differently. - */ - @Override - protected void prepareForCommit() { - // do not clear the part here - } } Modified: poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java?rev=1815047&r1=1815046&r2=1815047&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java Sun Nov 12 21:48:41 2017 @@ -96,6 +96,7 @@ public class XWPFDocument extends POIXML protected XWPFFootnotes footnotes; private CTDocument1 ctDocument; private XWPFSettings settings; + protected final List<XWPFChart> charts = new ArrayList<>(); /** * Keeps track on all id-values used in this document and included parts, like headers, footers, etc. */ @@ -220,6 +221,11 @@ public class XWPFDocument extends POIXML picData.onDocumentRead(); registerPackagePictureData(picData); pictures.add(picData); + } else if (relation.equals(XWPFRelation.CHART.getRelation())) { + //now we can use all methods to modify charts in XWPFDocument + XWPFChart chartData = (XWPFChart) p; + chartData.onDocumentRead(); + charts.add(chartData); } else if (relation.equals(XWPFRelation.GLOSSARY_DOCUMENT.getRelation())) { // We don't currently process the glossary itself // Until we do, we do need to load the glossary child parts of it @@ -324,6 +330,12 @@ public class XWPFDocument extends POIXML } /** + * @return list of XWPFCharts in this document + */ + public List<XWPFChart> getCharts() { + return Collections.unmodifiableList(charts); + } + /** * @see org.apache.poi.xwpf.usermodel.IBody#getTableArray(int) */ @Override Modified: poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRelation.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRelation.java?rev=1815047&r1=1815046&r2=1815047&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRelation.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRelation.java Sun Nov 12 21:48:41 2017 @@ -112,6 +112,12 @@ public final class XWPFRelation extends "/word/theme/theme#.xml", null ); + public static final XWPFRelation CHART = new XWPFRelation( + "application/vnd.openxmlformats-officedocument.drawingml.chart+xml", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart", + "/word/charts/chart#.xml", + XWPFChart.class + ); public static final XWPFRelation HYPERLINK = new XWPFRelation( null, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink", Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/AllXWPFTests.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/AllXWPFTests.java?rev=1815047&r1=1815046&r2=1815047&view=diff ============================================================================== --- poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/AllXWPFTests.java (original) +++ poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/AllXWPFTests.java Sun Nov 12 21:48:41 2017 @@ -19,6 +19,7 @@ package org.apache.poi.xwpf; import org.apache.poi.xwpf.extractor.TestXWPFWordExtractor; import org.apache.poi.xwpf.model.TestXWPFHeaderFooterPolicy; +import org.apache.poi.xwpf.usermodel.TestXWPFChart; import org.apache.poi.xwpf.usermodel.TestXWPFDocument; import org.apache.poi.xwpf.usermodel.TestXWPFHeader; import org.apache.poi.xwpf.usermodel.TestXWPFHeadings; @@ -38,6 +39,7 @@ import org.junit.runners.Suite; @Suite.SuiteClasses({ TestXWPFBugs.class, org.apache.poi.xwpf.usermodel.TestXWPFBugs.class, + TestXWPFChart.class, TestXWPFDocument.class, TestXWPFWordExtractor.class, TestXWPFHeaderFooterPolicy.class, @@ -53,4 +55,4 @@ import org.junit.runners.Suite; TestPackageCorePropertiesGetKeywords.class }) public final class AllXWPFTests { -} \ No newline at end of file +} Copied: poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFChart.java (from r1815042, poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFPictureData.java) URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFChart.java?p2=poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFChart.java&p1=poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFPictureData.java&r1=1815042&r2=1815047&rev=1815047&view=diff ============================================================================== --- poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFPictureData.java (original) +++ poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFChart.java Sun Nov 12 21:48:41 2017 @@ -17,164 +17,71 @@ package org.apache.poi.xwpf.usermodel; -import static org.junit.Assert.assertArrayEquals; - -import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.List; -import junit.framework.TestCase; - -import org.apache.poi.openxml4j.exceptions.InvalidFormatException; -import org.apache.poi.openxml4j.opc.PackageRelationship; -import org.apache.poi.xssf.usermodel.XSSFRelation; import org.apache.poi.xwpf.XWPFTestDataSamples; -import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy; +import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart; +import org.openxmlformats.schemas.drawingml.x2006.chart.CTTitle; +import org.openxmlformats.schemas.drawingml.x2006.chart.CTTx; +import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph; -public class TestXWPFPictureData extends TestCase { - - public void testRead() throws InvalidFormatException, IOException { - XWPFDocument sampleDoc = XWPFTestDataSamples.openSampleDocument("VariousPictures.docx"); - List<XWPFPictureData> pictures = sampleDoc.getAllPictures(); - - assertEquals(5, pictures.size()); - String[] ext = {"wmf", "png", "emf", "emf", "jpeg"}; - for (int i = 0; i < pictures.size(); i++) { - assertEquals(ext[i], pictures.get(i).suggestFileExtension()); - } - - int num = pictures.size(); - - byte[] pictureData = XWPFTestDataSamples.getImage("nature1.jpg"); - - String relationId = sampleDoc.addPictureData(pictureData, XWPFDocument.PICTURE_TYPE_JPEG); - // picture list was updated - assertEquals(num + 1, pictures.size()); - XWPFPictureData pict = (XWPFPictureData) sampleDoc.getRelationById(relationId); - assertEquals("jpeg", pict.suggestFileExtension()); - assertArrayEquals(pictureData, pict.getData()); - } +import junit.framework.TestCase; - public void testPictureInHeader() throws IOException { - XWPFDocument sampleDoc = XWPFTestDataSamples.openSampleDocument("headerPic.docx"); - verifyOneHeaderPicture(sampleDoc); +public class TestXWPFChart extends TestCase { - XWPFDocument readBack = XWPFTestDataSamples.writeOutAndReadBack(sampleDoc); - verifyOneHeaderPicture(readBack); + /** + * test method to check charts are null + * + * @throws IOException + */ + public void testRead() throws IOException + { + XWPFDocument sampleDoc = XWPFTestDataSamples.openSampleDocument("61745.docx"); + List<XWPFChart> charts = sampleDoc.getCharts(); + assertNotNull(charts); + assertEquals(2, charts.size()); + assertNotNull(charts.get(0)); + assertNotNull(charts.get(1)); } - public void testCreateHeaderPicture() throws Exception { - XWPFDocument doc = new XWPFDocument(); - - // Starts with no header - XWPFHeaderFooterPolicy policy = doc.getHeaderFooterPolicy(); - assertNull(policy); - - // Add a default header - policy = doc.createHeaderFooterPolicy(); - XWPFHeader header = policy.createHeader(XWPFHeaderFooterPolicy.DEFAULT); - header.createParagraph().createRun().setText("Hello, Header World!"); - header.createParagraph().createRun().setText("Paragraph 2"); - assertEquals(0, header.getAllPictures().size()); - assertEquals(2, header.getParagraphs().size()); - - // Add a picture to the first paragraph - header.getParagraphs().get(0).getRuns().get(0).addPicture( - new ByteArrayInputStream(new byte[] {1,2,3,4}), - Document.PICTURE_TYPE_JPEG, "test.jpg", 2, 2); - - // Check - verifyOneHeaderPicture(doc); - - // Save, re-load, re-check - XWPFDocument readBack = XWPFTestDataSamples.writeOutAndReadBack(doc); - verifyOneHeaderPicture(readBack); - } - - private void verifyOneHeaderPicture(XWPFDocument sampleDoc) { - XWPFHeaderFooterPolicy policy = sampleDoc.getHeaderFooterPolicy(); - - XWPFHeader header = policy.getDefaultHeader(); - - List<XWPFPictureData> pictures = header.getAllPictures(); - assertEquals(1, pictures.size()); - } - - public void testNew() throws InvalidFormatException, IOException { - XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("EmptyDocumentWithHeaderFooter.docx"); - byte[] jpegData = XWPFTestDataSamples.getImage("nature1.jpg"); - assertNotNull(jpegData); - byte[] gifData = XWPFTestDataSamples.getImage("nature1.gif"); - assertNotNull(gifData); - byte[] pngData = XWPFTestDataSamples.getImage("nature1.png"); - assertNotNull(pngData); - - List<XWPFPictureData> pictures = doc.getAllPictures(); - assertEquals(0, pictures.size()); - - // Document shouldn't have any image relationships - assertEquals(13, doc.getPackagePart().getRelationships().size()); - for (PackageRelationship rel : doc.getPackagePart().getRelationships()) { - if (rel.getRelationshipType().equals(XSSFRelation.IMAGE_JPEG.getRelation())) { - fail("Shouldn't have JPEG yet"); - } - } - - // Add the image - String relationId = doc.addPictureData(jpegData, XWPFDocument.PICTURE_TYPE_JPEG); - assertEquals(1, pictures.size()); - XWPFPictureData jpgPicData = (XWPFPictureData) doc.getRelationById(relationId); - assertEquals("jpeg", jpgPicData.suggestFileExtension()); - assertArrayEquals(jpegData, jpgPicData.getData()); - - // Ensure it now has one - assertEquals(14, doc.getPackagePart().getRelationships().size()); - PackageRelationship jpegRel = null; - for (PackageRelationship rel : doc.getPackagePart().getRelationships()) { - if (rel.getRelationshipType().equals(XWPFRelation.IMAGE_JPEG.getRelation())) { - if (jpegRel != null) - fail("Found 2 jpegs!"); - jpegRel = rel; - } - } - assertNotNull("JPEG Relationship not found", jpegRel); - - // Check the details - assertNotNull(jpegRel); - assertEquals(XWPFRelation.IMAGE_JPEG.getRelation(), jpegRel.getRelationshipType()); - assertEquals("/word/document.xml", jpegRel.getSource().getPartName().toString()); - assertEquals("/word/media/image1.jpeg", jpegRel.getTargetURI().getPath()); - - XWPFPictureData pictureDataByID = doc.getPictureDataByID(jpegRel.getId()); - assertArrayEquals(jpegData, pictureDataByID.getData()); - - // Save an re-load, check it appears - doc = XWPFTestDataSamples.writeOutAndReadBack(doc); - assertEquals(1, doc.getAllPictures().size()); - assertEquals(1, doc.getAllPackagePictures().size()); - - // verify the picture that we read back in - pictureDataByID = doc.getPictureDataByID(jpegRel.getId()); - assertArrayEquals(jpegData, pictureDataByID.getData()); - - } - - public void testBug51770() throws InvalidFormatException, IOException { - XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("Bug51170.docx"); - XWPFHeaderFooterPolicy policy = doc.getHeaderFooterPolicy(); - XWPFHeader header = policy.getDefaultHeader(); - for (XWPFParagraph paragraph : header.getParagraphs()) { - for (XWPFRun run : paragraph.getRuns()) { - for (XWPFPicture picture : run.getEmbeddedPictures()) { - if (paragraph.getDocument() != null) { - XWPFPictureData data = picture.getPictureData(); - if (data != null) { - fail("Should have returned null: "+ data.getFileName()); - } - } - } - } - } - + /** + * test method to add chart title and check whether it's set + * + * @throws IOException + */ + public void testChartTitle() throws IOException + { + XWPFDocument sampleDoc = XWPFTestDataSamples.openSampleDocument("61745.docx"); + List<XWPFChart> charts = sampleDoc.getCharts(); + XWPFChart chart=charts.get(0); + CTChart ctChart = chart.getCTChart(); + CTTitle title = ctChart.getTitle(); + CTTx tx = title.addNewTx(); + CTTextBody rich = tx.addNewRich(); + rich.addNewBodyPr(); + rich.addNewLstStyle(); + CTTextParagraph p = rich.addNewP(); + CTRegularTextRun r = p.addNewR(); + r.addNewRPr(); + r.setT("XWPF CHART"); + assertEquals("XWPF CHART", chart.getCTChart().getTitle().getTx().getRich().getPArray(0).getRArray(0).getT().toString()); + } + /** + * test method to check relationship + * + * @throws IOException + */ + public void testChartRelation() throws IOException + { + XWPFDocument sampleDoc = XWPFTestDataSamples.openSampleDocument("61745.docx"); + List<XWPFChart> charts = sampleDoc.getCharts(); + XWPFChart chart=charts.get(0); + assertEquals(XWPFRelation.CHART.getContentType(), chart.getPackagePart().getContentType().toString()); + assertEquals("/word/document.xml", chart.getParent().getPackagePart().getPartName().toString()); + assertEquals("/word/charts/chart1.xml", chart.getPackagePart().getPartName().toString()); } } + Added: poi/trunk/test-data/document/61745.docx URL: http://svn.apache.org/viewvc/poi/trunk/test-data/document/61745.docx?rev=1815047&view=auto ============================================================================== Binary file - no diff available. Propchange: poi/trunk/test-data/document/61745.docx ------------------------------------------------------------------------------ --- svn:mime-type (added) +++ svn:mime-type Sun Nov 12 21:48:41 2017 @@ -0,0 +1 @@ +application/vnd.openxmlformats-officedocument.wordprocessingml.document --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@poi.apache.org For additional commands, e-mail: commits-h...@poi.apache.org