Hi FD, I think all you need is the following method on XSSFDrawing:
``` /** * Imports the chart from the <code>srcChart</code> into this drawing. * * @param srcChart * the source chart to be cloned into this drawing. * @return the newly created chart. * @throws XmlException * @throws IOException */ public XSSFChart importChart(XSSFChart srcChart) throws IOException, XmlException { CTTwoCellAnchor anchor = ((XSSFDrawing) srcChart.getParent()).getCTDrawing().getTwoCellAnchorArray(0); CTMarker from = (CTMarker) anchor.getFrom().copy(); CTMarker to = (CTMarker) anchor.getTo().copy(); XSSFClientAnchor destAnchor = new XSSFClientAnchor(from, to); destAnchor.setAnchorType(AnchorType.MOVE_AND_RESIZE); XSSFChart destChart = createChart(destAnchor); destChart.getCTChartSpace().set(srcChart.getCTChartSpace().copy()); destChart.getCTChart().set(srcChart.getCTChart().copy()); return destChart; } ``` I feel that retrieving the source chart and creating the new destination drawing are better handled outside. I will open a PR for code review. Best regards, Alain > On 24 Aug 2018, at 10:50, monnomiznog...@gmail.com wrote: > > Hi Alain, > > I'll paste some test code here. In my work we have a lot of restrictions when > it comes to websites. > > Sorry I don't know how to format this code. > > Important: the chartModel.xlsx should contain a chart, preferably with no > relations. After all you need the model to be copied to your report but then > you must at least implement the data source for the chart, maybe also the > title, the series names, etc. But the heavy customization of the chart is > already done in the model. > > //Open chart model file > //My use experience: one chart par xlsx model file, in one sheet. Could > be otherwise of course. > FileInputStream in = new FileInputStream("c:/temp/chartModel.xlsx"); > XSSFWorkbook srcWB = new XSSFWorkbook(in); > XSSFWorkbook destWB = new XSSFWorkbook(); > XSSFSheet destSH = destWB.createSheet(); > XSSFDrawing destDR = destSH.createDrawingPatriarch(); > int sheetNum = 0; > XSSFSheet srcSH = srcWB.getSheetAt(sheetNum); > > List<POIXMLDocumentPart> srcRels = > srcSH.createDrawingPatriarch().getRelations(); > for (POIXMLDocumentPart srcRel : srcRels) > { > if (srcRel instanceof XSSFChart) > { > XSSFChart srcChart = (XSSFChart) srcRel; > > //Create chartSpace and chart by parsing source chart > CTChartSpace chartSpace = > ChartSpaceDocument.Factory.parse(srcChart.getPackagePart().getInputStream(), > POIXMLTypeLoader.DEFAULT_XML_OPTIONS).getChartSpace(); > CTChart ctc = chartSpace.getChart(); > > //XSSFClientAnchor origAnch = chart.getGraphicFrame().getAnchor(); > //Frame is null ! I tried to get anchor using the following: > CTMarker from = ((XSSFDrawing) > srcChart.getParent()).getCTDrawing().getTwoCellAnchorArray(0).getFrom(); > CTMarker to = ((XSSFDrawing) > srcChart.getParent()).getCTDrawing().getTwoCellAnchorArray(0).getTo(); > XSSFClientAnchor anchor = new XSSFClientAnchor((int) from.getColOff(), > (int) from.getRowOff(), (int) to.getColOff(), (int) to.getRowOff(), > from.getCol(), from.getRow(), to.getCol(), to.getRow()); > anchor.setAnchorType(AnchorType.MOVE_AND_RESIZE); > //Create chart in the destination workbook > XSSFChart destChart = destDR.createChart(anchor); > > //A new XSSFChart constructor is needed maybe. The following 2 > lines use reflection in order to force values for these 2 private variables > of XSSFChart > Utilities.setVariable(destChart, "chartSpace", chartSpace, true); > Utilities.setVariable(destChart, "chart", ctc, true); > } > } > > //Write the new workbook (could also be one you already have opened for > edition) > FileOutputStream out = new FileOutputStream("c:/temp/test.xlsx"); > destWB.write(out); > out.flush(); > out.close(); > in.close(); > srcWB.close(); > destWB.close(); > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@poi.apache.org > For additional commands, e-mail: dev-h...@poi.apache.org