diff options
author | Alain Béarez <abearez@apache.org> | 2018-12-08 02:44:22 +0000 |
---|---|---|
committer | Alain Béarez <abearez@apache.org> | 2018-12-08 02:44:22 +0000 |
commit | ef75a6d2d2dda6ab20366954bd19e3e492bc5dc2 (patch) | |
tree | 5d61d1b3c51afb8fe6d92e214ca61dade8aa04d2 /src/ooxml/java/org/apache | |
parent | 3c313a7f66b9285462cfe414f78928a6d5ea0f08 (diff) | |
download | poi-ef75a6d2d2dda6ab20366954bd19e3e492bc5dc2.tar.gz poi-ef75a6d2d2dda6ab20366954bd19e3e492bc5dc2.zip |
create chart from scratch by sandeeptiwari32
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1848432 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/ooxml/java/org/apache')
7 files changed, 158 insertions, 11 deletions
diff --git a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java index 321626d71f..4267898309 100644 --- a/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java +++ b/src/ooxml/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java @@ -53,6 +53,7 @@ import org.apache.poi.xddf.usermodel.text.XDDFTextBody; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFTable; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.xmlbeans.XmlException; import org.apache.xmlbeans.XmlOptions; @@ -81,6 +82,27 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableColumns; @Beta public abstract class XDDFChart extends POIXMLDocumentPart implements TextContainer { + + /** + * default width of chart in emu + */ + public static final int DEFAULT_WIDTH = 500000; + + /** + * default height of chart in emu + */ + public static final int DEFAULT_HEIGHT = 500000; + + /** + * default x-coordinate of chart in emu + */ + public static final int DEFAULT_X = 10; + + /** + * default y-coordinate value of chart in emu + */ + public static final int DEFAULT_Y = 10; + /** * Underlying workbook */ @@ -712,11 +734,30 @@ public abstract class XDDFChart extends POIXMLDocumentPart implements TextContai XSSFRow row = this.getRow(sheet, 0); XSSFCell cell = this.getCell(row, column); cell.setCellValue(title); - this.updateSheetTable(sheet.getTables().get(0).getCTTable(), title, column); + + CTTable ctTable = this.getSheetTable(sheet); + + this.updateSheetTable(ctTable, title, column); return new CellReference(sheet.getSheetName(), 0, column, true, true); } /** + * this method will check whether sheet have table + * in case table size zero then create new table and add table columns element + * @param sheet + * @return table object + */ + private CTTable getSheetTable(XSSFSheet sheet) { + if(sheet.getTables().size() == 0) + { + XSSFTable newTable = sheet.createTable(null); + newTable.getCTTable().addNewTableColumns(); + sheet.getTables().add(newTable); + } + return sheet.getTables().get(0).getCTTable(); + } + + /** * this method update column header of sheet into table * * @param ctTable @@ -729,7 +770,8 @@ public abstract class XDDFChart extends POIXMLDocumentPart implements TextContai private void updateSheetTable(CTTable ctTable, String title, int index) { CTTableColumns tableColumnList = ctTable.getTableColumns(); CTTableColumn column = null; - for( int i = 0; tableColumnList.getCount() < index; i++) { + int columnCount = tableColumnList.getTableColumnList().size()-1; + for( int i = columnCount; i < index; i++) { column = tableColumnList.addNewTableColumn(); column.setId(i); } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java index 687ddc5f5b..b0cbc59dd1 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java @@ -302,14 +302,23 @@ public class XMLSlideShow extends POIXMLDocument * Create a blank chart on the given slide. */ public XSLFChart createChart(XSLFSlide slide) { + XSLFChart chart = createChart(); + slide.addRelation(null, XSLFRelation.CHART, chart); + return chart; + } + + /** + * This method is used to create template for chart XML. + * @return Xslf chart object + * @since POI 4.0.2 + */ + public XSLFChart createChart() { int chartIdx = findNextAvailableFileNameIndex(XSLFRelation.CHART, _charts.size() + 1); XSLFChart chart = (XSLFChart) createRelationship(XSLFRelation.CHART, XSLFFactory.getInstance(), chartIdx, true).getDocumentPart(); - slide.addRelation(null, XSLFRelation.CHART, chart); chart.setChartIndex(chartIdx); _charts.add(chart); return chart; } - /** * Return notes slide for the specified slide or create new if it does not exist yet. */ @@ -416,7 +425,7 @@ public class XMLSlideShow extends POIXMLDocument * Return all the charts in the slideshow */ public List<XSLFChart> getCharts() { - return _charts; + return Collections.unmodifiableList(_charts); } /** diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFChart.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFChart.java index 8e6612f875..5e8d73cd06 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFChart.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFChart.java @@ -19,16 +19,28 @@ package org.apache.poi.xslf.usermodel; +import java.awt.geom.Rectangle2D; import java.io.IOException; +import javax.xml.namespace.QName; + import org.apache.poi.ooxml.POIXMLFactory; import org.apache.poi.ooxml.POIXMLRelation; import org.apache.poi.openxml4j.opc.PackagePart; +import org.apache.poi.openxml4j.opc.PackageRelationshipTypes; import org.apache.poi.util.Beta; import org.apache.poi.xddf.usermodel.chart.XDDFChart; +import org.apache.xmlbeans.XmlCursor; import org.apache.xmlbeans.XmlException; import org.openxmlformats.schemas.drawingml.x2006.chart.CTTitle; +import org.openxmlformats.schemas.drawingml.x2006.main.CTGraphicalObjectData; +import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps; +import org.openxmlformats.schemas.drawingml.x2006.main.CTPoint2D; +import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D; import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D; +import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame; +import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrameNonVisual; /** * Represents a Chart in a .pptx presentation @@ -36,6 +48,8 @@ import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody; @Beta public final class XSLFChart extends XDDFChart { + private static String CHART_URI = "http://schemas.openxmlformats.org/drawingml/2006/chart"; + /** * Construct a PresentationML chart. */ @@ -90,4 +104,47 @@ public final class XSLFChart extends XDDFChart { }; } } + + /** + * method to add graphic frame for XSLF chart + * + * @param shapeId shape id + * @param rID relation id + * @param anchor size and location of chart + * @return graphic frame object + * @since POI 4.0.2 + */ + static CTGraphicalObjectFrame prototype(int shapeId, String rID, Rectangle2D anchor) { + CTGraphicalObjectFrame frame = CTGraphicalObjectFrame.Factory.newInstance(); + CTGraphicalObjectFrameNonVisual nvGr = frame.addNewNvGraphicFramePr(); + + CTNonVisualDrawingProps cnv = nvGr.addNewCNvPr(); + cnv.setName("Chart " + shapeId); + cnv.setId(shapeId); + nvGr.addNewCNvGraphicFramePr().addNewGraphicFrameLocks().setNoGrp(true); + nvGr.addNewNvPr(); + + CTTransform2D xfrm = frame.addNewXfrm(); + + CTPoint2D off = xfrm.addNewOff(); + off.setX((int)anchor.getX()); + off.setY((int)anchor.getY()); + + CTPositiveSize2D ext = xfrm.addNewExt(); + ext.setCx((int)anchor.getWidth()); + ext.setCy((int)anchor.getHeight()); + + xfrm.setExt(ext); + xfrm.setOff(off); + + CTGraphicalObjectData gr = frame.addNewGraphic().addNewGraphicData(); + XmlCursor grCur = gr.newCursor(); + grCur.toNextToken(); + grCur.beginElement(new QName(CHART_URI, "chart")); + grCur.insertAttributeWithValue("id", PackageRelationshipTypes.CORE_PROPERTIES_ECMA376_NS, rID); + grCur.dispose(); + + gr.setUri(CHART_URI); + return frame; + } } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFDrawing.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFDrawing.java index f4cd0d8e1c..ba93988d0b 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFDrawing.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFDrawing.java @@ -107,6 +107,19 @@ public class XSLFDrawing { return shape; } + /** + * This method will add chart into slide's graphic frame + * + * @param rID relation id of chart + * @param rect2D Chart Bounding values + * @since POI 4.0.2 + */ + public void addChart(String rID, Rectangle2D rect2D) { + CTGraphicalObjectFrame sp = _spTree.addNewGraphicFrame(); + sp.set(XSLFChart.prototype(_sheet.allocateShapeId(), rID, rect2D)); + } + + public XSLFObjectShape createOleShape(String pictureRel) { CTGraphicalObjectFrame sp = _spTree.addNewGraphicFrame(); sp.set(XSLFObjectShape.prototype(_sheet.allocateShapeId(), pictureRel)); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java index b67264ba0f..2bcf063990 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java @@ -20,6 +20,7 @@ import static org.apache.poi.ooxml.POIXMLTypeLoader.DEFAULT_XML_OPTIONS; import java.awt.Dimension; import java.awt.Graphics2D; +import java.awt.geom.Rectangle2D; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -52,6 +53,7 @@ import org.apache.poi.util.IOUtils; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; import org.apache.poi.util.Units; +import org.apache.poi.xddf.usermodel.chart.XDDFChart; import org.apache.xmlbeans.XmlCursor; import org.apache.xmlbeans.XmlException; import org.apache.xmlbeans.XmlObject; @@ -306,14 +308,13 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> { throw new IllegalArgumentException("pictureData needs to be of type XSLFPictureData"); } RelationPart rp = addRelation(null, XSLFRelation.IMAGES, (XSLFPictureData)pictureData); - + XSLFObjectShape sh = getDrawing().createOleShape(rp.getRelationship().getId()); CTOleObject oleObj = sh.getCTOleObject(); Dimension dim = pictureData.getImageDimension(); oleObj.setImgW(Units.toEMU(dim.getWidth())); oleObj.setImgH(Units.toEMU(dim.getHeight())); - - + getShapes().add(sh); sh.setParent(this); return sh; @@ -719,4 +720,28 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> { return (ph == null) ? null : new XSLFPlaceholderDetails(ph); } + /** + * this method will add chart into slide + * with default height, width, x and y + * @param chart xslf chart object + * @since POI 4.0.2 + */ + public void addChart(XSLFChart chart) { + Rectangle2D rect2D = new java.awt.Rectangle(XDDFChart.DEFAULT_X, XDDFChart.DEFAULT_Y, + XDDFChart.DEFAULT_WIDTH, XDDFChart.DEFAULT_HEIGHT); + + this.addChart(chart, rect2D); + } + + /** + * this method will add chart into slide + * with given height, width, x and y + * @param chart xslf chart object + * @since POI 4.0.2 + */ + public void addChart(XSLFChart chart, Rectangle2D rect2D) { + RelationPart rp = addRelation(null, XSLFRelation.CHART, chart); + getDrawing().addChart(rp.getRelationship().getId(), rect2D); + } + } diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFChart.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFChart.java index 44820a5871..495cde1bf9 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFChart.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFChart.java @@ -39,12 +39,12 @@ public class XWPFChart extends XDDFChart { /** * default width of chart in emu */ - public static final int DEFAULT_WIDTH = 500000; + public static final int DEFAULT_WIDTH = XDDFChart.DEFAULT_WIDTH; /** * default height of chart in emu */ - public static final int DEFAULT_HEIGHT = 500000; + public static final int DEFAULT_HEIGHT = XDDFChart.DEFAULT_HEIGHT; // lazy initialization private Long checksum; diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java index e3cc314a4a..8e7e383d45 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java @@ -58,6 +58,7 @@ import org.apache.poi.util.Internal; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; import org.apache.poi.wp.usermodel.HeaderFooterType; +import org.apache.poi.xddf.usermodel.chart.XDDFChart; import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy; import org.apache.xmlbeans.XmlCursor; import org.apache.xmlbeans.XmlException; @@ -1672,7 +1673,7 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody { * @since POI 4.0.0 */ public XWPFChart createChart() throws InvalidFormatException, IOException { - return createChart(XWPFChart.DEFAULT_WIDTH, XWPFChart.DEFAULT_HEIGHT); + return createChart(XDDFChart.DEFAULT_WIDTH, XDDFChart.DEFAULT_HEIGHT); } /** |